cbb870c822
Use asm offsets to make sure the offset defines to struct _lowcore and its layout don't get out of sync. Also add a BUILD_BUG_ON() which checks that the size of the structure is sane. And while being at it change those sites which use odd casts to access the current lowcore. These should use S390_lowcore instead. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
151 lines
2.9 KiB
ArmAsm
151 lines
2.9 KiB
ArmAsm
/*
|
|
* arch/s390/kernel/base.S
|
|
*
|
|
* Copyright IBM Corp. 2006,2007
|
|
* Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>
|
|
* Michael Holzheu <holzheu@de.ibm.com>
|
|
*/
|
|
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/ptrace.h>
|
|
|
|
#ifdef CONFIG_64BIT
|
|
|
|
.globl s390_base_mcck_handler
|
|
s390_base_mcck_handler:
|
|
basr %r13,0
|
|
0: lg %r15,__LC_PANIC_STACK # load panic stack
|
|
aghi %r15,-STACK_FRAME_OVERHEAD
|
|
larl %r1,s390_base_mcck_handler_fn
|
|
lg %r1,0(%r1)
|
|
ltgr %r1,%r1
|
|
jz 1f
|
|
basr %r14,%r1
|
|
1: la %r1,4095
|
|
lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)
|
|
lpswe __LC_MCK_OLD_PSW
|
|
|
|
.section .bss
|
|
.globl s390_base_mcck_handler_fn
|
|
s390_base_mcck_handler_fn:
|
|
.quad 0
|
|
.previous
|
|
|
|
.globl s390_base_ext_handler
|
|
s390_base_ext_handler:
|
|
stmg %r0,%r15,__LC_SAVE_AREA
|
|
basr %r13,0
|
|
0: aghi %r15,-STACK_FRAME_OVERHEAD
|
|
larl %r1,s390_base_ext_handler_fn
|
|
lg %r1,0(%r1)
|
|
ltgr %r1,%r1
|
|
jz 1f
|
|
basr %r14,%r1
|
|
1: lmg %r0,%r15,__LC_SAVE_AREA
|
|
ni __LC_EXT_OLD_PSW+1,0xfd # clear wait state bit
|
|
lpswe __LC_EXT_OLD_PSW
|
|
|
|
.section .bss
|
|
.globl s390_base_ext_handler_fn
|
|
s390_base_ext_handler_fn:
|
|
.quad 0
|
|
.previous
|
|
|
|
.globl s390_base_pgm_handler
|
|
s390_base_pgm_handler:
|
|
stmg %r0,%r15,__LC_SAVE_AREA
|
|
basr %r13,0
|
|
0: aghi %r15,-STACK_FRAME_OVERHEAD
|
|
larl %r1,s390_base_pgm_handler_fn
|
|
lg %r1,0(%r1)
|
|
ltgr %r1,%r1
|
|
jz 1f
|
|
basr %r14,%r1
|
|
lmg %r0,%r15,__LC_SAVE_AREA
|
|
lpswe __LC_PGM_OLD_PSW
|
|
1: lpswe disabled_wait_psw-0b(%r13)
|
|
|
|
.align 8
|
|
disabled_wait_psw:
|
|
.quad 0x0002000180000000,0x0000000000000000 + s390_base_pgm_handler
|
|
|
|
.section .bss
|
|
.globl s390_base_pgm_handler_fn
|
|
s390_base_pgm_handler_fn:
|
|
.quad 0
|
|
.previous
|
|
|
|
#else /* CONFIG_64BIT */
|
|
|
|
.globl s390_base_mcck_handler
|
|
s390_base_mcck_handler:
|
|
basr %r13,0
|
|
0: l %r15,__LC_PANIC_STACK # load panic stack
|
|
ahi %r15,-STACK_FRAME_OVERHEAD
|
|
l %r1,2f-0b(%r13)
|
|
l %r1,0(%r1)
|
|
ltr %r1,%r1
|
|
jz 1f
|
|
basr %r14,%r1
|
|
1: lm %r0,%r15,__LC_GPREGS_SAVE_AREA
|
|
lpsw __LC_MCK_OLD_PSW
|
|
|
|
2: .long s390_base_mcck_handler_fn
|
|
|
|
.section .bss
|
|
.globl s390_base_mcck_handler_fn
|
|
s390_base_mcck_handler_fn:
|
|
.long 0
|
|
.previous
|
|
|
|
.globl s390_base_ext_handler
|
|
s390_base_ext_handler:
|
|
stm %r0,%r15,__LC_SAVE_AREA
|
|
basr %r13,0
|
|
0: ahi %r15,-STACK_FRAME_OVERHEAD
|
|
l %r1,2f-0b(%r13)
|
|
l %r1,0(%r1)
|
|
ltr %r1,%r1
|
|
jz 1f
|
|
basr %r14,%r1
|
|
1: lm %r0,%r15,__LC_SAVE_AREA
|
|
ni __LC_EXT_OLD_PSW+1,0xfd # clear wait state bit
|
|
lpsw __LC_EXT_OLD_PSW
|
|
|
|
2: .long s390_base_ext_handler_fn
|
|
|
|
.section .bss
|
|
.globl s390_base_ext_handler_fn
|
|
s390_base_ext_handler_fn:
|
|
.long 0
|
|
.previous
|
|
|
|
.globl s390_base_pgm_handler
|
|
s390_base_pgm_handler:
|
|
stm %r0,%r15,__LC_SAVE_AREA
|
|
basr %r13,0
|
|
0: ahi %r15,-STACK_FRAME_OVERHEAD
|
|
l %r1,2f-0b(%r13)
|
|
l %r1,0(%r1)
|
|
ltr %r1,%r1
|
|
jz 1f
|
|
basr %r14,%r1
|
|
lm %r0,%r15,__LC_SAVE_AREA
|
|
lpsw __LC_PGM_OLD_PSW
|
|
|
|
1: lpsw disabled_wait_psw-0b(%r13)
|
|
|
|
2: .long s390_base_pgm_handler_fn
|
|
|
|
disabled_wait_psw:
|
|
.align 8
|
|
.long 0x000a0000,0x00000000 + s390_base_pgm_handler
|
|
|
|
.section .bss
|
|
.globl s390_base_pgm_handler_fn
|
|
s390_base_pgm_handler_fn:
|
|
.long 0
|
|
.previous
|
|
|
|
#endif /* CONFIG_64BIT */
|