]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/s390/kernel/head64.S
[S390] Fixed handling of access register mode faults.
[linux-2.6-omap-h63xx.git] / arch / s390 / kernel / head64.S
index 6ba3f4512dd1a1ad26a4d4e0993c9b6feaaf6bc6..37010709fe683e934232ef9ff12d70cee2804423 100644 (file)
@@ -58,182 +58,14 @@ startup_continue:
        stg     %r15,__LC_KERNEL_STACK  # set end of kernel stack
        aghi    %r15,-160
        xc      __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) # clear backchain
-
-       brasl   %r14,ipl_save_parameters
 #
-# clear bss memory
+# Save ipl parameters, clear bss memory, initialize storage key for kernel pages,
+# and create a kernel NSS if the SAVESYS= parm is defined
 #
-       larl    %r2,__bss_start         # start of bss segment
-       larl    %r3,_end                # end of bss segment
-       sgr     %r3,%r2                 # length of bss
-       sgr     %r4,%r4                 #
-       sgr     %r5,%r5                 # set src,length and pad to zero
-       mvcle   %r2,%r4,0               # clear mem
-       jo      .-4                     # branch back, if not finish
+       brasl   %r14,startup_init
                                        # set program check new psw mask
        mvc     __LC_PGM_NEW_PSW(8),.Lpcmsk-.LPG1(%r13)
-       larl    %r1,.Lslowmemdetect     # set program check address
-       stg     %r1,__LC_PGM_NEW_PSW+8
-       lghi    %r1,0xc
-       diag    %r0,%r1,0x260           # get memory size of virtual machine
-       cgr     %r0,%r1                 # different? -> old detection routine
-       jne     .Lslowmemdetect
-       aghi    %r1,1                   # size is one more than end
-       larl    %r2,memory_chunk
-       stg     %r1,8(%r2)              # store size of chunk
-       j       .Ldonemem
-
-.Lslowmemdetect:
-       l       %r2,.Lrcp-.LPG1(%r13)   # Read SCP forced command word
-.Lservicecall:
-       stosm   .Lpmask-.LPG1(%r13),0x01        # authorize ext interrupts
-
-       stctg   %r0,%r0,.Lcr-.LPG1(%r13)        # get cr0
-       la      %r1,0x200               # set bit 22
-       og      %r1,.Lcr-.LPG1(%r13)    # or old cr0 with r1
-       stg     %r1,.Lcr-.LPG1(%r13)
-       lctlg   %r0,%r0,.Lcr-.LPG1(%r13)        # load modified cr0
-
-       mvc     __LC_EXT_NEW_PSW(8),.Lpcmsk-.LPG1(%r13) # set postcall psw
-       larl    %r1,.Lsclph
-       stg     %r1,__LC_EXT_NEW_PSW+8  # set handler
-
-       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
-       xr      %r3,%r3
-       chi     %r1,3
-       be      .Lfchunk-.LPG1(%r13)    # leave
-       chi     %r1,2
-       be      .Lservicecall-.LPG1(%r13)
-       lpswe   .Lwaitsclp-.LPG1(%r13)
-.Lsclph:
-       lh      %r1,.Lsccbr-.Lsccb(%r4)
-       chi     %r1,0x10                # 0x0010 is the sucess code
-       je      .Lprocsccb              # let's process the sccb
-       chi     %r1,0x1f0
-       bne     .Lfchunk-.LPG1(%r13)    # unhandled error code
-       c       %r2,.Lrcp-.LPG1(%r13)   # Did we try Read SCP forced
-       bne     .Lfchunk-.LPG1(%r13)    # if no, give up
-       l       %r2,.Lrcp2-.LPG1(%r13)  # try with Read SCP
-       b       .Lservicecall-.LPG1(%r13)
-.Lprocsccb:
-       lghi    %r1,0
-       icm     %r1,3,.Lscpincr1-.Lsccb(%r4)    # use this one if != 0
-       jnz     .Lscnd
-       lg      %r1,.Lscpincr2-.Lsccb(%r4)      # otherwise use this one
-.Lscnd:
-       xr      %r3,%r3                 # same logic
-       ic      %r3,.Lscpa1-.Lsccb(%r4)
-       chi     %r3,0x00
-       jne     .Lcompmem
-       l       %r3,.Lscpa2-.Lsccb(%r4)
-.Lcompmem:
-       mlgr    %r2,%r1                 # mem in MB on 128-bit
-       l       %r1,.Lonemb-.LPG1(%r13)
-       mlgr    %r2,%r1                 # mem size in bytes in %r3
-       b       .Lfchunk-.LPG1(%r13)
-
-       .align  4
-.Lpmask:
-       .byte   0
-       .align  8
-.Lcr:
-       .quad   0x00  # place holder for cr0
-.Lwaitsclp:
-       .quad   0x0102000180000000,.Lsclph
-.Lrcp:
-       .int    0x00120001 # Read SCP forced code
-.Lrcp2:
-       .int    0x00020001 # Read SCP code
-.Lonemb:
-       .int    0x100000
-
-.Lfchunk:
-
-#
-# find memory chunks.
-#
-       lgr     %r9,%r3                 # end of mem
-       larl    %r1,.Lchkmem            # set program check address
-       stg     %r1,__LC_PGM_NEW_PSW+8
-       la      %r1,1                   # test in increments of 128KB
-       sllg    %r1,%r1,17
-       larl    %r3,memory_chunk
-       slgr    %r4,%r4                 # set start of chunk to zero
-       slgr    %r5,%r5                 # set end of chunk to zero
-       slr     %r6,%r6                 # set access code to zero
-       la      %r10,MEMORY_CHUNKS      # number of chunks
-.Lloop:
-       tprot   0(%r5),0                # test protection of first byte
-       ipm     %r7
-       srl     %r7,28
-       clr     %r6,%r7                 # compare cc with last access code
-       je      .Lsame
-       lghi    %r8,0                   # no program checks
-       j       .Lsavchk
-.Lsame:
-       algr    %r5,%r1                 # add 128KB to end of chunk
-                                       # no need to check here,
-       brc     12,.Lloop               # this is the same chunk
-.Lchkmem:                              # > 16EB or tprot got a program check
-       lghi    %r8,1                   # set program check flag
-.Lsavchk:
-       clgr    %r4,%r5                 # chunk size > 0?
-       je      .Lchkloop
-       stg     %r4,0(%r3)              # store start address of chunk
-       lgr     %r0,%r5
-       slgr    %r0,%r4
-       stg     %r0,8(%r3)              # store size of chunk
-       st      %r6,20(%r3)             # store type of chunk
-       la      %r3,24(%r3)
-       ahi     %r10,-1                 # update chunk number
-.Lchkloop:
-       lr      %r6,%r7                 # set access code to last cc
-       # we got an exception or we're starting a new
-       # chunk , we must check if we should
-       # still try to find valid memory (if we detected
-       # the amount of available storage), and if we
-       # have chunks left
-       lghi    %r4,1
-       sllg    %r4,%r4,31
-       clgr    %r5,%r4
-       je      .Lhsaskip
-       xr      %r0, %r0
-       clgr    %r0, %r9                # did we detect memory?
-       je      .Ldonemem               # if not, leave
-       chi     %r10, 0                 # do we have chunks left?
-       je      .Ldonemem
-.Lhsaskip:
-       chi     %r8,1                   # program check ?
-       je      .Lpgmchk
-       lgr     %r4,%r5                 # potential new chunk
-       algr    %r5,%r1                 # add 128KB to end of chunk
-       j       .Llpcnt
-.Lpgmchk:
-       algr    %r5,%r1                 # add 128KB to end of chunk
-       lgr     %r4,%r5                 # potential new chunk
-.Llpcnt:
-       clgr    %r5,%r9                 # should we go on?
-       jl      .Lloop
-.Ldonemem:
-
        larl    %r12,machine_flags
-#
-# find out if we are running under VM
-#
-       stidp   __LC_CPUID              # store cpuid
-       tm      __LC_CPUID,0xff         # running under VM ?
-       bno     0f-.LPG1(%r13)
-       oi      7(%r12),1               # set VM flag
-0:     lh      %r0,__LC_CPUID+4        # get cpu version
-       chi     %r0,0x7490              # running on a P/390 ?
-       bne     1f-.LPG1(%r13)
-       oi      7(%r12),4               # set P/390 flag
-1:
-
 #
 # find out if we have the MVPG instruction
 #
@@ -302,7 +134,7 @@ startup_continue:
        .quad   .Lduct                  # cr2: dispatchable unit control table
        .quad   0                       # cr3: instruction authorization
        .quad   0                       # cr4: instruction authorization
-       .quad   0xffffffffffffffff      # cr5: primary-aste origin
+       .quad   .Lduct                  # cr5: primary-aste origin
        .quad   0                       # cr6:  I/O interrupts
        .quad   0                       # cr7:  secondary space segment table
        .quad   0                       # cr8:  access registers translation
@@ -313,49 +145,23 @@ startup_continue:
        .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
-
-       .globl  ipl_schib
-ipl_schib:
-       .rept 13
-       .long 0
+       .align  64
+.Lduct: .long  0,0,0,0,.Lduald,0,0,0
+       .long   0,0,0,0,0,0,0,0
+       .align  128
+.Lduald:.rept  8
+       .long   0x80000000,0,0,0        # invalid access-list entries
        .endr
 
-       .globl  ipl_flags
-ipl_flags:
-       .long   0
-       .globl  ipl_devno
-ipl_devno:
-       .word 0
-
        .org    0x12000
-.globl s390_readinfo_sccb
-s390_readinfo_sccb:
-.Lsccb:
-       .hword  0x1000                  # length, one page
-       .byte   0x00,0x00,0x00
-       .byte   0x80                    # variable response bit set
-.Lsccbr:
-       .hword  0x00                    # response code
-.Lscpincr1:
-       .hword  0x00
-.Lscpa1:
-       .byte   0x00
-       .fill   89,1,0
-.Lscpa2:
-       .int    0x00
-.Lscpincr2:
-       .quad   0x00
-       .fill   3984,1,0
-       .org    0x13000
-
+       .globl  _ehead
+_ehead:
 #ifdef CONFIG_SHARED_KERNEL
        .org    0x100000
 #endif