linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / arch / s390 / kernel / head31.S
index a4dc61f..2d3b089 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * arch/s390/kernel/head31.S
  *
- * Copyright (C) IBM Corp. 2005,2006
+ * (C) Copyright IBM Corp. 2005
  *
  *   Author(s):        Hartmut Penner <hp@de.ibm.com>
  *             Martin Schwidefsky <schwidefsky@de.ibm.com>
 # or linload or SALIPL
 #
        .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
-       .long   0,0                     # IPL_DEVICE
-       .long   0,RAMDISK_ORIGIN        # INITRD_START
-       .long   0,RAMDISK_SIZE          # INITRD_SIZE
-
-       .org    COMMAND_LINE
-       .byte   "root=/dev/ram0 ro"
-       .byte   0
-
-       .org    0x11000
-
-startup_continue:
-       basr    %r13,0                  # get base
-.LPG1: GET_IPL_DEVICE
+startup:basr   %r13,0                   # get base
+.LPG1: l       %r1, .Lget_ipl_device_addr-.LPG1(%r13)
+       basr    %r14, %r1
        lctl    %c0,%c15,.Lctl-.LPG1(%r13) # load control registers
-       l       %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area
-                                       # move IPL device to lowcore
+       la      %r12,_pstart-.LPG1(%r13) # pointer to parameter area
+                                        # move IPL device to lowcore
        mvc     __LC_IPLDEV(4),IPL_DEVICE-PARMAREA(%r12)
 
 #
@@ -70,8 +51,8 @@ startup_continue:
        a       %r1,__LC_EXT_NEW_PSW+4  # set handler
        st      %r1,__LC_EXT_NEW_PSW+4
 
-       l       %r4,.Lsccbaddr-.LPG1(%r13) # %r4 is our index for sccb stuff
-       lr      %r1,%r4                 # our sccb
+       la      %r4,_pstart-.LPG1(%r13) # %r4 is our index for sccb stuff
+       la      %r1, .Lsccb-PARMAREA(%r4)       # our sccb
        .insn   rre,0xb2200000,%r2,%r1  # service call
        ipm     %r1
        srl     %r1,28                  # get cc code
@@ -82,7 +63,7 @@ startup_continue:
        be      .Lservicecall-.LPG1(%r13)
        lpsw    .Lwaitsclp-.LPG1(%r13)
 .Lsclph:
-       lh      %r1,.Lsccbr-.Lsccb(%r4)
+       lh      %r1,.Lsccbr-PARMAREA(%r4)
        chi     %r1,0x10                # 0x0010 is the sucess code
        je      .Lprocsccb              # let's process the sccb
        chi     %r1,0x1f0
@@ -93,7 +74,7 @@ startup_continue:
        b       .Lservicecall-.LPG1(%r13)
 .Lprocsccb:
        lhi     %r1,0
-       icm     %r1,3,.Lscpincr1-.Lsccb(%r4) # use this one if != 0
+       icm     %r1,3,.Lscpincr1-PARMAREA(%r4) # use this one if != 0
        jnz     .Lscnd
        lhi     %r1,0x800               # otherwise report 2GB
 .Lscnd:
@@ -103,10 +84,10 @@ startup_continue:
        lr      %r1,%r3
 .Lno2gb:
        xr      %r3,%r3                 # same logic
-       ic      %r3,.Lscpa1-.Lsccb(%r4)
+       ic      %r3,.Lscpa1-PARMAREA(%r4)
        chi     %r3,0x00
        jne     .Lcompmem
-       l       %r3,.Lscpa2-.Lsccb(%r4)
+       l       %r3,.Lscpa2-PARMAREA(%r13)
 .Lcompmem:
        mr      %r2,%r1                 # mem in MB on 128-bit
        l       %r1,.Lonemb-.LPG1(%r13)
@@ -114,6 +95,8 @@ startup_continue:
        b       .Lfchunk-.LPG1(%r13)
 
        .align 4
+.Lget_ipl_device_addr:
+       .long   .Lget_ipl_device
 .Lpmask:
        .byte   0
 .align 8
@@ -259,8 +242,6 @@ startup_continue:
        .long   0                       # cr13: home space segment table
        .long   0xc0000000              # cr14: machine check handling off
        .long   0                       # cr15: linkage stack operations
-.Lduct:        .long   0,0,0,0,0,0,0,0
-       .long   0,0,0,0,0,0,0,0
 .Lpcmem:.long  0x00080000,0x80000000 + .Lchkmem
 .Lpcfpu:.long  0x00080000,0x80000000 + .Lchkfpu
 .Lpccsp:.long  0x00080000,0x80000000 + .Lchkcsp
@@ -271,9 +252,25 @@ startup_continue:
 .Lmflags:.long machine_flags
 .Lbss_bgn:  .long __bss_start
 .Lbss_end:  .long _end
-.Lparmaddr: .long PARMAREA
-.Lsccbaddr: .long .Lsccb
-       .org    0x12000
+
+       .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:
+       .long   0,0                     # IPL_DEVICE
+       .long   0,RAMDISK_ORIGIN        # INITRD_START
+       .long   0,RAMDISK_SIZE          # INITRD_SIZE
+
+       .org    COMMAND_LINE
+       .byte   "root=/dev/ram0 ro"
+       .byte   0
+       .org    0x11000
 .Lsccb:
        .hword  0x1000                  # length, one page
        .byte   0x00,0x00,0x00
@@ -290,14 +287,18 @@ startup_continue:
 .Lscpincr2:
        .quad   0x00
        .fill   3984,1,0
-       .org    0x13000
+       .org    0x12000
+       .global _pend
+_pend:
+
+       GET_IPL_DEVICE
 
 #ifdef CONFIG_SHARED_KERNEL
        .org    0x100000
 #endif
 
 #
-# startup-code, running in absolute addressing mode
+# startup-code, running in virtual mode
 #
        .globl  _stext
 _stext:        basr    %r13,0                  # get base