blob: 797a823a22755d9b76f8c12717e043226c7395bd [file] [log] [blame]
Heiko Carstensab14de62007-02-05 21:18:37 +01001/*
2 * arch/s390/kernel/base.S
3 *
Heiko Carstensa53c8fa2012-07-20 11:15:04 +02004 * Copyright IBM Corp. 2006, 2007
Heiko Carstensab14de62007-02-05 21:18:37 +01005 * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>
6 * Michael Holzheu <holzheu@de.ibm.com>
7 */
8
Jan Glauber144d6342011-07-24 10:48:19 +02009#include <linux/linkage.h>
Heiko Carstenscbb870c2010-02-26 22:37:43 +010010#include <asm/asm-offsets.h>
Heiko Carstensab14de62007-02-05 21:18:37 +010011#include <asm/ptrace.h>
Heiko Carstenseb546192012-06-04 15:05:43 +020012#include <asm/sigp.h>
Heiko Carstensab14de62007-02-05 21:18:37 +010013
14#ifdef CONFIG_64BIT
15
Jan Glauber144d6342011-07-24 10:48:19 +020016ENTRY(s390_base_mcck_handler)
Heiko Carstensab14de62007-02-05 21:18:37 +010017 basr %r13,0
180: lg %r15,__LC_PANIC_STACK # load panic stack
19 aghi %r15,-STACK_FRAME_OVERHEAD
20 larl %r1,s390_base_mcck_handler_fn
21 lg %r1,0(%r1)
22 ltgr %r1,%r1
23 jz 1f
24 basr %r14,%r1
251: la %r1,4095
26 lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)
27 lpswe __LC_MCK_OLD_PSW
28
29 .section .bss
Jan Glauber144d6342011-07-24 10:48:19 +020030 .align 8
Heiko Carstensab14de62007-02-05 21:18:37 +010031 .globl s390_base_mcck_handler_fn
32s390_base_mcck_handler_fn:
33 .quad 0
34 .previous
35
Jan Glauber144d6342011-07-24 10:48:19 +020036ENTRY(s390_base_ext_handler)
Martin Schwidefskyc5328902011-12-27 11:27:15 +010037 stmg %r0,%r15,__LC_SAVE_AREA_ASYNC
Heiko Carstensab14de62007-02-05 21:18:37 +010038 basr %r13,0
390: aghi %r15,-STACK_FRAME_OVERHEAD
40 larl %r1,s390_base_ext_handler_fn
41 lg %r1,0(%r1)
42 ltgr %r1,%r1
43 jz 1f
44 basr %r14,%r1
Martin Schwidefskyc5328902011-12-27 11:27:15 +0100451: lmg %r0,%r15,__LC_SAVE_AREA_ASYNC
Heiko Carstensab14de62007-02-05 21:18:37 +010046 ni __LC_EXT_OLD_PSW+1,0xfd # clear wait state bit
47 lpswe __LC_EXT_OLD_PSW
48
49 .section .bss
Jan Glauber144d6342011-07-24 10:48:19 +020050 .align 8
Heiko Carstensab14de62007-02-05 21:18:37 +010051 .globl s390_base_ext_handler_fn
52s390_base_ext_handler_fn:
53 .quad 0
54 .previous
55
Jan Glauber144d6342011-07-24 10:48:19 +020056ENTRY(s390_base_pgm_handler)
Martin Schwidefskyc5328902011-12-27 11:27:15 +010057 stmg %r0,%r15,__LC_SAVE_AREA_SYNC
Heiko Carstensab14de62007-02-05 21:18:37 +010058 basr %r13,0
590: aghi %r15,-STACK_FRAME_OVERHEAD
60 larl %r1,s390_base_pgm_handler_fn
61 lg %r1,0(%r1)
62 ltgr %r1,%r1
63 jz 1f
64 basr %r14,%r1
Martin Schwidefskyc5328902011-12-27 11:27:15 +010065 lmg %r0,%r15,__LC_SAVE_AREA_SYNC
Heiko Carstensab14de62007-02-05 21:18:37 +010066 lpswe __LC_PGM_OLD_PSW
671: lpswe disabled_wait_psw-0b(%r13)
68
69 .align 8
70disabled_wait_psw:
71 .quad 0x0002000180000000,0x0000000000000000 + s390_base_pgm_handler
72
73 .section .bss
Jan Glauber144d6342011-07-24 10:48:19 +020074 .align 8
Heiko Carstensab14de62007-02-05 21:18:37 +010075 .globl s390_base_pgm_handler_fn
76s390_base_pgm_handler_fn:
77 .quad 0
78 .previous
79
Michael Holzheu9dc73562011-08-03 16:44:22 +020080#
81# Calls diag 308 subcode 1 and continues execution
82#
83# The following conditions must be ensured before calling this function:
84# * Prefix register = 0
85# * Lowcore protection is disabled
86#
87ENTRY(diag308_reset)
88 larl %r4,.Lctlregs # Save control registers
89 stctg %c0,%c15,0(%r4)
Michael Holzheu60a0c682011-10-30 15:16:40 +010090 larl %r4,.Lfpctl # Floating point control register
91 stfpc 0(%r4)
Michael Holzheufa7c0042012-05-21 11:30:30 +020092 larl %r4,.Lcontinue_psw # Save PSW flags
93 epsw %r2,%r3
94 stm %r2,%r3,0(%r4)
Michael Holzheu9dc73562011-08-03 16:44:22 +020095 larl %r4,.Lrestart_psw # Setup restart PSW at absolute 0
96 lghi %r3,0
97 lg %r4,0(%r4) # Save PSW
98 sturg %r4,%r3 # Use sturg, because of large pages
99 lghi %r1,1
100 diag %r1,%r1,0x308
101.Lrestart_part2:
102 lhi %r0,0 # Load r0 with zero
103 lhi %r1,2 # Use mode 2 = ESAME (dump)
Heiko Carstenseb546192012-06-04 15:05:43 +0200104 sigp %r1,%r0,SIGP_SET_ARCHITECTURE # Switch to ESAME mode
Michael Holzheu9dc73562011-08-03 16:44:22 +0200105 sam64 # Switch to 64 bit addressing mode
106 larl %r4,.Lctlregs # Restore control registers
107 lctlg %c0,%c15,0(%r4)
Michael Holzheu60a0c682011-10-30 15:16:40 +0100108 larl %r4,.Lfpctl # Restore floating point ctl register
109 lfpc 0(%r4)
Michael Holzheufa7c0042012-05-21 11:30:30 +0200110 larl %r4,.Lcontinue_psw # Restore PSW flags
111 lpswe 0(%r4)
112.Lcontinue:
Michael Holzheu9dc73562011-08-03 16:44:22 +0200113 br %r14
114.align 16
115.Lrestart_psw:
116 .long 0x00080000,0x80000000 + .Lrestart_part2
117
Michael Holzheufa7c0042012-05-21 11:30:30 +0200118 .section .data..nosave,"aw",@progbits
119.align 8
120.Lcontinue_psw:
121 .quad 0,.Lcontinue
122 .previous
123
Michael Holzheu9dc73562011-08-03 16:44:22 +0200124 .section .bss
125.align 8
126.Lctlregs:
127 .rept 16
128 .quad 0
129 .endr
Michael Holzheu60a0c682011-10-30 15:16:40 +0100130.Lfpctl:
131 .long 0
Michael Holzheu9dc73562011-08-03 16:44:22 +0200132 .previous
133
Heiko Carstensab14de62007-02-05 21:18:37 +0100134#else /* CONFIG_64BIT */
135
Jan Glauber144d6342011-07-24 10:48:19 +0200136ENTRY(s390_base_mcck_handler)
Heiko Carstensab14de62007-02-05 21:18:37 +0100137 basr %r13,0
1380: l %r15,__LC_PANIC_STACK # load panic stack
139 ahi %r15,-STACK_FRAME_OVERHEAD
140 l %r1,2f-0b(%r13)
141 l %r1,0(%r1)
142 ltr %r1,%r1
143 jz 1f
144 basr %r14,%r1
1451: lm %r0,%r15,__LC_GPREGS_SAVE_AREA
146 lpsw __LC_MCK_OLD_PSW
147
1482: .long s390_base_mcck_handler_fn
149
150 .section .bss
Jan Glauber144d6342011-07-24 10:48:19 +0200151 .align 4
Heiko Carstensab14de62007-02-05 21:18:37 +0100152 .globl s390_base_mcck_handler_fn
153s390_base_mcck_handler_fn:
154 .long 0
155 .previous
156
Jan Glauber144d6342011-07-24 10:48:19 +0200157ENTRY(s390_base_ext_handler)
Martin Schwidefskyc5328902011-12-27 11:27:15 +0100158 stm %r0,%r15,__LC_SAVE_AREA_ASYNC
Heiko Carstensab14de62007-02-05 21:18:37 +0100159 basr %r13,0
1600: ahi %r15,-STACK_FRAME_OVERHEAD
161 l %r1,2f-0b(%r13)
162 l %r1,0(%r1)
163 ltr %r1,%r1
164 jz 1f
165 basr %r14,%r1
Martin Schwidefskyc5328902011-12-27 11:27:15 +01001661: lm %r0,%r15,__LC_SAVE_AREA_ASYNC
Heiko Carstensab14de62007-02-05 21:18:37 +0100167 ni __LC_EXT_OLD_PSW+1,0xfd # clear wait state bit
168 lpsw __LC_EXT_OLD_PSW
169
1702: .long s390_base_ext_handler_fn
171
172 .section .bss
Jan Glauber144d6342011-07-24 10:48:19 +0200173 .align 4
Heiko Carstensab14de62007-02-05 21:18:37 +0100174 .globl s390_base_ext_handler_fn
175s390_base_ext_handler_fn:
176 .long 0
177 .previous
178
Jan Glauber144d6342011-07-24 10:48:19 +0200179ENTRY(s390_base_pgm_handler)
Martin Schwidefskyc5328902011-12-27 11:27:15 +0100180 stm %r0,%r15,__LC_SAVE_AREA_SYNC
Heiko Carstensab14de62007-02-05 21:18:37 +0100181 basr %r13,0
1820: ahi %r15,-STACK_FRAME_OVERHEAD
183 l %r1,2f-0b(%r13)
184 l %r1,0(%r1)
185 ltr %r1,%r1
186 jz 1f
187 basr %r14,%r1
Martin Schwidefskyc5328902011-12-27 11:27:15 +0100188 lm %r0,%r15,__LC_SAVE_AREA_SYNC
Heiko Carstensab14de62007-02-05 21:18:37 +0100189 lpsw __LC_PGM_OLD_PSW
190
1911: lpsw disabled_wait_psw-0b(%r13)
192
1932: .long s390_base_pgm_handler_fn
194
195disabled_wait_psw:
196 .align 8
197 .long 0x000a0000,0x00000000 + s390_base_pgm_handler
198
199 .section .bss
Jan Glauber144d6342011-07-24 10:48:19 +0200200 .align 4
Heiko Carstensab14de62007-02-05 21:18:37 +0100201 .globl s390_base_pgm_handler_fn
202s390_base_pgm_handler_fn:
203 .long 0
204 .previous
205
206#endif /* CONFIG_64BIT */