Merge to Fedora kernel-2.6.18-1.2224_FC5 patched with stable patch-2.6.18.1-vs2.0...
[linux-2.6.git] / arch / s390 / kernel / head64.S
index f08c06f..9d80c5b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * arch/s390/kernel/head64.S
  *
- * (C) Copyright IBM Corp. 1999,2005
+ * Copyright (C) IBM Corp. 1999,2006
  *
  *   Author(s):        Hartmut Penner <hp@de.ibm.com>
  *             Martin Schwidefsky <schwidefsky@de.ibm.com>
 # this is called either by the ipl loader or directly by PSW restart
 # or linload or SALIPL
 #
-        .org  0x10000
-startup:basr  %r13,0                     # get base
+       .org  0x10000
+startup:basr  %r13,0                    # get base
+.LPG0: l     %r13,0f-.LPG0(%r13)
+       b     0(%r13)
+0:     .long startup_continue
+
+#
+# params at 10400 (setup.h)
+#
+       .org   PARMAREA
+       .quad  0                        # IPL_DEVICE
+       .quad  RAMDISK_ORIGIN           # INITRD_START
+       .quad  RAMDISK_SIZE             # INITRD_SIZE
+
+       .org   COMMAND_LINE
+       .byte  "root=/dev/ram0 ro"
+       .byte  0
+
+       .org   0x11000
+
+startup_continue:
+       basr  %r13,0                     # get base
 .LPG1:  sll   %r13,1                     # remove high order bit
         srl   %r13,1
-       l     %r1,.Lget_ipl_device_addr-.LPG1(%r13)
-       basr  %r14,%r1
+       GET_IPL_DEVICE
         lhi   %r1,1                      # mode 1 = esame
         slr   %r0,%r0                    # set cpuid to zero
         sigp  %r1,%r0,0x12               # switch to esame mode
        sam64                            # switch to 64 bit mode
        lctlg %c0,%c15,.Lctl-.LPG1(%r13) # load control registers
-       larl  %r12,_pstart               # pointer to parameter area
+       lg    %r12,.Lparmaddr-.LPG1(%r13)# pointer to parameter area
                                         # move IPL device to lowcore
         mvc   __LC_IPLDEV(4),IPL_DEVICE+4-PARMAREA(%r12)
 
@@ -55,8 +74,8 @@ startup:basr  %r13,0                     # get base
        larl  %r1,.Lsclph
        stg   %r1,__LC_EXT_NEW_PSW+8    # set handler
 
-       larl  %r4,_pstart               # %r4 is our index for sccb stuff
-       la    %r1,.Lsccb-PARMAREA(%r4)  # our sccb
+       larl  %r4,.Lsccb                # %r4 is our index for sccb stuff
+       lgr   %r1,%r4                   # our sccb
        .insn rre,0xb2200000,%r2,%r1    # service call
        ipm   %r1
        srl   %r1,28                    # get cc code
@@ -67,7 +86,7 @@ startup:basr  %r13,0                     # get base
        be    .Lservicecall-.LPG1(%r13)
        lpswe .Lwaitsclp-.LPG1(%r13)
 .Lsclph:
-       lh    %r1,.Lsccbr-PARMAREA(%r4)
+       lh    %r1,.Lsccbr-.Lsccb(%r4)
        chi   %r1,0x10                  # 0x0010 is the sucess code
        je    .Lprocsccb                # let's process the sccb
        chi   %r1,0x1f0
@@ -78,15 +97,15 @@ startup:basr  %r13,0                     # get base
        b     .Lservicecall-.LPG1(%r13)
 .Lprocsccb:
        lghi  %r1,0
-       icm   %r1,3,.Lscpincr1-PARMAREA(%r4) # use this one if != 0
+       icm   %r1,3,.Lscpincr1-.Lsccb(%r4) # use this one if != 0
        jnz   .Lscnd
-       lg    %r1,.Lscpincr2-PARMAREA(%r4) # otherwise use this one
+       lg    %r1,.Lscpincr2-.Lsccb(%r4) # otherwise use this one
 .Lscnd:
        xr    %r3,%r3                   # same logic
-       ic    %r3,.Lscpa1-PARMAREA(%r4)
+       ic    %r3,.Lscpa1-.Lsccb(%r4)
        chi   %r3,0x00
        jne   .Lcompmem
-       l     %r3,.Lscpa2-PARMAREA(%r13)
+       l     %r3,.Lscpa2-.Lsccb(%r4)
 .Lcompmem:
        mlgr  %r2,%r1                   # mem in MB on 128-bit
        l     %r1,.Lonemb-.LPG1(%r13)
@@ -94,8 +113,6 @@ startup:basr  %r13,0                     # get base
        b     .Lfchunk-.LPG1(%r13)
 
        .align 4
-.Lget_ipl_device_addr:
-       .long .Lget_ipl_device
 .Lpmask:
        .byte 0
        .align 8
@@ -242,29 +259,16 @@ startup:basr  %r13,0                     # get base
         .quad  0                        # cr13: home space segment table
         .quad  0xc0000000               # cr14: machine check handling off
         .quad  0                        # cr15: linkage stack operations
+.Lduct: .long 0,0,0,0,0,0,0,0
+       .long 0,0,0,0,0,0,0,0
 .Lpcmsk:.quad  0x0000000180000000
 .L4malign:.quad 0xffffffffffc00000
 .Lscan2g:.quad 0x80000000 + 0x20000 - 8 # 2GB + 128K - 8
 .Lnop: .long  0x07000700
+.Lparmaddr:
+       .quad   PARMAREA
 
-       .org PARMAREA-64
-.Lduct:        .long 0,0,0,0,0,0,0,0
-       .long 0,0,0,0,0,0,0,0
-
-#
-# params at 10400 (setup.h)
-#
-       .org   PARMAREA
-       .global _pstart
-_pstart:
-       .quad  0                        # IPL_DEVICE
-        .quad  RAMDISK_ORIGIN           # INITRD_START
-        .quad  RAMDISK_SIZE             # INITRD_SIZE
-
-        .org   COMMAND_LINE
-       .byte  "root=/dev/ram0 ro"
-        .byte  0
-       .org   0x11000
+       .org    0x12000
 .Lsccb:
        .hword 0x1000                   # length, one page
        .byte 0x00,0x00,0x00
@@ -281,18 +285,14 @@ _pstart:
 .Lscpincr2:
        .quad 0x00
        .fill 3984,1,0
-       .org 0x12000
-       .global _pend
-_pend: 
-
-       GET_IPL_DEVICE
+       .org    0x13000
 
 #ifdef CONFIG_SHARED_KERNEL
        .org   0x100000
 #endif
        
 #
-# startup-code, running in virtual mode
+# startup-code, running in absolute addressing mode
 #
         .globl _stext
 _stext:        basr  %r13,0                    # get base
@@ -326,4 +326,3 @@ _stext:     basr  %r13,0                    # get base
             .align 8
 .Ldw:       .quad  0x0002000180000000,0x0000000000000000
 .Laregs:    .long  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-