Merge master.kernel.org:/home/rmk/linux-2.6-arm
[sfrench/cifs-2.6.git] / arch / s390 / kernel / relocate_kernel.S
index d5e4a62fbb7965e1e000c28407fbdf388f2dcd0a..2a25ec7147ffef7be275feeb9a915dfaec6f70b3 100644 (file)
@@ -4,6 +4,7 @@
  * (C) Copyright IBM Corp. 2005
  *
  * Author(s): Rolf Adelsberger <adelsberger@de.ibm.com>
+ *           Heiko Carstens <heiko.carstens@de.ibm.com>
  *
  */
 
        relocate_kernel:
                basr    %r13,0          #base address
        .base:
-               spx     zero64-.base(%r13)      #absolute addressing mode
                stnsm   sys_msk-.base(%r13),0xf8        #disable DAT and IRQ (external)
+               spx     zero64-.base(%r13)      #absolute addressing mode
+               stctl   %c0,%c15,ctlregs-.base(%r13)
+               stm     %r0,%r15,gprregs-.base(%r13)
+               la      %r1,load_psw-.base(%r13)
+               mvc     0(8,%r0),0(%r1)
+               la      %r0,.back-.base(%r13)
+               st      %r0,4(%r0)
+               oi      4(%r0),0x80
+               mvc     0x68(8,%r0),0(%r1)
+               la      %r0,.back_pgm-.base(%r13)
+               st      %r0,0x6c(%r0)
+               oi      0x6c(%r0),0x80
+               lhi     %r0,0
+               diag    %r0,%r0,0x308
+       .back:
+               basr    %r13,0
+       .back_base:
+               oi      have_diag308-.back_base(%r13),0x01
+               lctl    %c0,%c15,ctlregs-.back_base(%r13)
+               lm      %r0,%r15,gprregs-.back_base(%r13)
+               j       .start_reloc
+       .back_pgm:
+               lm      %r0,%r15,gprregs-.base(%r13)
+       .start_reloc:
                lhi     %r10,-1         #preparing the mask
                sll     %r10,12         #shift it such that it becomes 0xf000
        .top:
                o       %r3,4(%r4)      #or load address into psw
                st      %r3,4(%r4)
                mvc     0(8,%r0),0(%r4) #copy psw to absolute address 0
+               tm      have_diag308-.base(%r13),0x01
+               jno     .no_diag308
+               diag    %r0,%r0,0x308
+       .no_diag308:
                sr      %r1,%r1         #clear %r1
                sr      %r2,%r2         #clear %r2
                sigp    %r1,%r2,0x12    #set cpuid to zero
                .long   0x00080000,0x80000000
        sys_msk:
                .quad   0
+       ctlregs:
+               .rept   16
+               .long   0
+               .endr
+       gprregs:
+               .rept   16
+               .long   0
+               .endr
+       have_diag308:
+               .byte   0
+               .align  8
        relocate_kernel_end:
        .globl  relocate_kernel_len
        relocate_kernel_len: