2 * arch/s390/kernel/base.S
4 * Copyright IBM Corp. 2006,2007
5 * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>
6 * Michael Holzheu <holzheu@de.ibm.com>
9 #include <linux/linkage.h>
10 #include <asm/asm-offsets.h>
11 #include <asm/ptrace.h>
15 ENTRY(s390_base_mcck_handler)
17 0: lg %r15,__LC_PANIC_STACK # load panic stack
18 aghi %r15,-STACK_FRAME_OVERHEAD
19 larl %r1,s390_base_mcck_handler_fn
25 lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)
26 lpswe __LC_MCK_OLD_PSW
30 .globl s390_base_mcck_handler_fn
31 s390_base_mcck_handler_fn:
35 ENTRY(s390_base_ext_handler)
36 stmg %r0,%r15,__LC_SAVE_AREA_ASYNC
38 0: aghi %r15,-STACK_FRAME_OVERHEAD
39 larl %r1,s390_base_ext_handler_fn
44 1: lmg %r0,%r15,__LC_SAVE_AREA_ASYNC
45 ni __LC_EXT_OLD_PSW+1,0xfd # clear wait state bit
46 lpswe __LC_EXT_OLD_PSW
50 .globl s390_base_ext_handler_fn
51 s390_base_ext_handler_fn:
55 ENTRY(s390_base_pgm_handler)
56 stmg %r0,%r15,__LC_SAVE_AREA_SYNC
58 0: aghi %r15,-STACK_FRAME_OVERHEAD
59 larl %r1,s390_base_pgm_handler_fn
64 lmg %r0,%r15,__LC_SAVE_AREA_SYNC
65 lpswe __LC_PGM_OLD_PSW
66 1: lpswe disabled_wait_psw-0b(%r13)
70 .quad 0x0002000180000000,0x0000000000000000 + s390_base_pgm_handler
74 .globl s390_base_pgm_handler_fn
75 s390_base_pgm_handler_fn:
80 # Calls diag 308 subcode 1 and continues execution
82 # The following conditions must be ensured before calling this function:
83 # * Prefix register = 0
84 # * Lowcore protection is disabled
87 larl %r4,.Lctlregs # Save control registers
89 larl %r4,.Lfpctl # Floating point control register
91 larl %r4,.Lcontinue_psw # Save PSW flags
94 larl %r4,.Lrestart_psw # Setup restart PSW at absolute 0
96 lg %r4,0(%r4) # Save PSW
97 sturg %r4,%r3 # Use sturg, because of large pages
101 lhi %r0,0 # Load r0 with zero
102 lhi %r1,2 # Use mode 2 = ESAME (dump)
103 sigp %r1,%r0,0x12 # Switch to ESAME mode
104 sam64 # Switch to 64 bit addressing mode
105 larl %r4,.Lctlregs # Restore control registers
106 lctlg %c0,%c15,0(%r4)
107 larl %r4,.Lfpctl # Restore floating point ctl register
109 larl %r4,.Lcontinue_psw # Restore PSW flags
115 .long 0x00080000,0x80000000 + .Lrestart_part2
117 .section .data..nosave,"aw",@progbits
133 #else /* CONFIG_64BIT */
135 ENTRY(s390_base_mcck_handler)
137 0: l %r15,__LC_PANIC_STACK # load panic stack
138 ahi %r15,-STACK_FRAME_OVERHEAD
144 1: lm %r0,%r15,__LC_GPREGS_SAVE_AREA
145 lpsw __LC_MCK_OLD_PSW
147 2: .long s390_base_mcck_handler_fn
151 .globl s390_base_mcck_handler_fn
152 s390_base_mcck_handler_fn:
156 ENTRY(s390_base_ext_handler)
157 stm %r0,%r15,__LC_SAVE_AREA_ASYNC
159 0: ahi %r15,-STACK_FRAME_OVERHEAD
165 1: lm %r0,%r15,__LC_SAVE_AREA_ASYNC
166 ni __LC_EXT_OLD_PSW+1,0xfd # clear wait state bit
167 lpsw __LC_EXT_OLD_PSW
169 2: .long s390_base_ext_handler_fn
173 .globl s390_base_ext_handler_fn
174 s390_base_ext_handler_fn:
178 ENTRY(s390_base_pgm_handler)
179 stm %r0,%r15,__LC_SAVE_AREA_SYNC
181 0: ahi %r15,-STACK_FRAME_OVERHEAD
187 lm %r0,%r15,__LC_SAVE_AREA_SYNC
188 lpsw __LC_PGM_OLD_PSW
190 1: lpsw disabled_wait_psw-0b(%r13)
192 2: .long s390_base_pgm_handler_fn
196 .long 0x000a0000,0x00000000 + s390_base_pgm_handler
200 .globl s390_base_pgm_handler_fn
201 s390_base_pgm_handler_fn:
205 #endif /* CONFIG_64BIT */