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>
16 ENTRY(s390_base_mcck_handler)
18 0: lg %r15,__LC_PANIC_STACK # load panic stack
19 aghi %r15,-STACK_FRAME_OVERHEAD
20 larl %r1,s390_base_mcck_handler_fn
26 lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)
27 lpswe __LC_MCK_OLD_PSW
31 .globl s390_base_mcck_handler_fn
32 s390_base_mcck_handler_fn:
36 ENTRY(s390_base_ext_handler)
37 stmg %r0,%r15,__LC_SAVE_AREA_ASYNC
39 0: aghi %r15,-STACK_FRAME_OVERHEAD
40 larl %r1,s390_base_ext_handler_fn
45 1: lmg %r0,%r15,__LC_SAVE_AREA_ASYNC
46 ni __LC_EXT_OLD_PSW+1,0xfd # clear wait state bit
47 lpswe __LC_EXT_OLD_PSW
51 .globl s390_base_ext_handler_fn
52 s390_base_ext_handler_fn:
56 ENTRY(s390_base_pgm_handler)
57 stmg %r0,%r15,__LC_SAVE_AREA_SYNC
59 0: aghi %r15,-STACK_FRAME_OVERHEAD
60 larl %r1,s390_base_pgm_handler_fn
65 lmg %r0,%r15,__LC_SAVE_AREA_SYNC
66 lpswe __LC_PGM_OLD_PSW
67 1: lpswe disabled_wait_psw-0b(%r13)
71 .quad 0x0002000180000000,0x0000000000000000 + s390_base_pgm_handler
75 .globl s390_base_pgm_handler_fn
76 s390_base_pgm_handler_fn:
81 # Calls diag 308 subcode 1 and continues execution
83 # The following conditions must be ensured before calling this function:
84 # * Prefix register = 0
85 # * Lowcore protection is disabled
88 larl %r4,.Lctlregs # Save control registers
90 larl %r4,.Lfpctl # Floating point control register
92 larl %r4,.Lcontinue_psw # Save PSW flags
95 larl %r4,.Lrestart_psw # Setup restart PSW at absolute 0
97 lg %r4,0(%r4) # Save PSW
98 sturg %r4,%r3 # Use sturg, because of large pages
103 lhi %r0,0 # Load r0 with zero
104 lhi %r1,2 # Use mode 2 = ESAME (dump)
105 sigp %r1,%r0,SIGP_SET_ARCHITECTURE # Switch to ESAME mode
106 sam64 # Switch to 64 bit addressing mode
107 larl %r4,.Lctlregs # Restore control registers
108 lctlg %c0,%c15,0(%r4)
109 larl %r4,.Lfpctl # Restore floating point ctl register
111 larl %r4,.Lcontinue_psw # Restore PSW flags
117 .long 0x00080000,0x80000000 + .Lrestart_part2
119 .section .data..nosave,"aw",@progbits
135 #else /* CONFIG_64BIT */
137 ENTRY(s390_base_mcck_handler)
139 0: l %r15,__LC_PANIC_STACK # load panic stack
140 ahi %r15,-STACK_FRAME_OVERHEAD
146 1: lm %r0,%r15,__LC_GPREGS_SAVE_AREA
147 lpsw __LC_MCK_OLD_PSW
149 2: .long s390_base_mcck_handler_fn
153 .globl s390_base_mcck_handler_fn
154 s390_base_mcck_handler_fn:
158 ENTRY(s390_base_ext_handler)
159 stm %r0,%r15,__LC_SAVE_AREA_ASYNC
161 0: ahi %r15,-STACK_FRAME_OVERHEAD
167 1: lm %r0,%r15,__LC_SAVE_AREA_ASYNC
168 ni __LC_EXT_OLD_PSW+1,0xfd # clear wait state bit
169 lpsw __LC_EXT_OLD_PSW
171 2: .long s390_base_ext_handler_fn
175 .globl s390_base_ext_handler_fn
176 s390_base_ext_handler_fn:
180 ENTRY(s390_base_pgm_handler)
181 stm %r0,%r15,__LC_SAVE_AREA_SYNC
183 0: ahi %r15,-STACK_FRAME_OVERHEAD
189 lm %r0,%r15,__LC_SAVE_AREA_SYNC
190 lpsw __LC_PGM_OLD_PSW
192 1: lpsw disabled_wait_psw-0b(%r13)
194 2: .long s390_base_pgm_handler_fn
198 .long 0x000a0000,0x00000000 + s390_base_pgm_handler
202 .globl s390_base_pgm_handler_fn
203 s390_base_pgm_handler_fn:
207 #endif /* CONFIG_64BIT */