]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/s390/kernel/head.S
manual update from upstream:
[linux-2.6-omap-h63xx.git] / arch / s390 / kernel / head.S
index fc8bf5e285f6ccb187fcd81d6a810e4ffe713543..039354d72348eae678124fe62a9dc30dff2ac53f 100644 (file)
@@ -30,7 +30,7 @@
 #include <linux/config.h>
 #include <asm/setup.h>
 #include <asm/lowcore.h>
-#include <asm/offsets.h>
+#include <asm/asm-offsets.h>
 #include <asm/thread_info.h>
 #include <asm/page.h>
 
@@ -346,6 +346,13 @@ iplstart:
         la    %r2,.Lreset              
         lhi   %r3,26
        diag  %r2,%r3,8
+       la    %r5,.Lirb
+       stsch 0(%r5)                           # check if irq is pending
+       tm    30(%r5),0x0f                     # by verifying if any of the
+       bnz   .Lwaitforirq                     # activity or status control
+       tm    31(%r5),0xff                     # bits is set in the schib
+       bz    .Lnoreset
+.Lwaitforirq:
        mvc   0x78(8),.Lrdrnewpsw              # set up IO interrupt psw
 .Lwaitrdrirq:
        lpsw  .Lrdrwaitpsw
@@ -478,7 +485,9 @@ start:
 #
         .org  0x10000
 startup:basr  %r13,0                     # get base
-.LPG1:  lctl  %c0,%c15,.Lctl-.LPG1(%r13) # load control registers
+.LPG1: l     %r1, .Lget_ipl_device_addr-.LPG1(%r13)
+       basr  %r14, %r1
+       lctl  %c0,%c15,.Lctl-.LPG1(%r13) # load control registers
        la    %r12,_pstart-.LPG1(%r13)   # pointer to parameter area
                                         # move IPL device to lowcore
         mvc   __LC_IPLDEV(4),IPL_DEVICE-PARMAREA(%r12)
@@ -535,8 +544,13 @@ startup:basr  %r13,0                     # get base
        lhi   %r1,0
        icm   %r1,3,.Lscpincr1-PARMAREA(%r4) # use this one if != 0
        jnz   .Lscnd
-       l     %r1,.Lscpincr2-PARMAREA+4(%r4) # otherwise use this one
+       lhi   %r1,0x800                 # otherwise report 2GB
 .Lscnd:
+       lhi   %r3,0x800                 # limit reported memory size to 2GB
+       cr    %r1,%r3
+       jl    .Lno2gb
+       lr    %r1,%r3
+.Lno2gb:
        xr    %r3,%r3                   # same logic
        ic    %r3,.Lscpa1-PARMAREA(%r4)
        chi   %r3,0x00
@@ -548,6 +562,9 @@ startup:basr  %r13,0                     # get base
        mr    %r2,%r1                   # mem size in bytes in %r3
        b     .Lfchunk-.LPG1(%r13)
 
+       .align 4
+.Lget_ipl_device_addr:
+       .long .Lget_ipl_device
 .Lpmask:
        .byte 0
 .align 8
@@ -743,6 +760,63 @@ _pstart:
        .global _pend
 _pend: 
 
+.Lget_ipl_device:
+       basr  %r12,0
+.LPG2: l     %r1,0xb8                  # get sid
+       sll   %r1,15                    # test if subchannel is enabled
+       srl   %r1,31
+       ltr   %r1,%r1
+       bz    0(%r14)                   # subchannel disabled
+       l     %r1,0xb8
+       la    %r5,.Lipl_schib-.LPG2(%r12)
+       stsch 0(%r5)                    # get schib of subchannel
+       bnz   0(%r14)                   # schib not available
+       tm    5(%r5),0x01               # devno valid?
+       bno   0(%r14)
+       la    %r6,ipl_parameter_flags-.LPG2(%r12)
+       oi    3(%r6),0x01               # set flag
+       la    %r2,ipl_devno-.LPG2(%r12)
+       mvc   0(2,%r2),6(%r5)           # store devno
+       tm    4(%r5),0x80               # qdio capable device?
+       bno   0(%r14)
+       oi    3(%r6),0x02               # set flag
+
+       # copy ipl parameters
+
+       lhi   %r0,4096
+       l     %r2,20(%r0)               # get address of parameter list
+       lhi   %r3,IPL_PARMBLOCK_ORIGIN
+       st    %r3,20(%r0)
+       lhi   %r4,1
+       cr    %r2,%r3                   # start parameters < destination ?
+       jl    0f
+       lhi   %r1,1                     # copy direction is upwards
+       j     1f
+0:     lhi   %r1,-1                    # copy direction is downwards
+       ar    %r2,%r0
+       ar    %r3,%r0
+       ar    %r2,%r1
+       ar    %r3,%r1
+1:     mvc   0(1,%r3),0(%r2)           # finally copy ipl parameters
+       ar    %r3,%r1
+       ar    %r2,%r1
+       sr    %r0,%r4
+       jne   1b
+       b     0(%r14)
+
+       .align 4
+.Lipl_schib:
+       .rept 13
+       .long 0
+       .endr
+
+       .globl ipl_parameter_flags
+ipl_parameter_flags:
+       .long 0
+       .globl ipl_devno
+ipl_devno:
+       .word 0
+
 #ifdef CONFIG_SHARED_KERNEL
        .org   0x100000
 #endif
@@ -752,11 +826,11 @@ _pend:
 #
         .globl _stext
 _stext:        basr  %r13,0                    # get base
-.LPG2:
+.LPG3:
 #
 # Setup stack
 #
-        l     %r15,.Linittu-.LPG2(%r13)
+        l     %r15,.Linittu-.LPG3(%r13)
        mvc   __LC_CURRENT(4),__TI_task(%r15)
         ahi   %r15,1<<(PAGE_SHIFT+THREAD_ORDER) # init_task_union + THREAD_SIZE
         st    %r15,__LC_KERNEL_STACK    # set end of kernel stack
@@ -765,13 +839,13 @@ _stext:   basr  %r13,0                    # get base
 
 # check control registers
         stctl  %c0,%c15,0(%r15)
-       oi     2(%r15),0x20             # enable sigp external interrupts
+       oi     2(%r15),0x40             # enable sigp emergency signal
        oi     0(%r15),0x10             # switch on low address protection
         lctl   %c0,%c15,0(%r15)
 
 #
-        lam    0,15,.Laregs-.LPG2(%r13) # load access regs needed by uaccess
-        l      %r14,.Lstart-.LPG2(%r13)
+        lam    0,15,.Laregs-.LPG3(%r13) # load access regs needed by uaccess
+        l      %r14,.Lstart-.LPG3(%r13)
         basr   %r14,%r14                # call start_kernel
 #
 # We returned from start_kernel ?!? PANIK