]> git.karo-electronics.de Git - karo-tx-linux.git/blob - arch/s390/kernel/base.S
Merge branch 'for-linus-v3.20' of git://git.infradead.org/linux-ubifs
[karo-tx-linux.git] / arch / s390 / kernel / base.S
1 /*
2  *  arch/s390/kernel/base.S
3  *
4  *    Copyright IBM Corp. 2006, 2007
5  *    Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>
6  *               Michael Holzheu <holzheu@de.ibm.com>
7  */
8
9 #include <linux/linkage.h>
10 #include <asm/asm-offsets.h>
11 #include <asm/ptrace.h>
12 #include <asm/sigp.h>
13
14 #ifdef CONFIG_64BIT
15
16 ENTRY(s390_base_mcck_handler)
17         basr    %r13,0
18 0:      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
25 1:      la      %r1,4095
26         lmg     %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)
27         lpswe   __LC_MCK_OLD_PSW
28
29         .section .bss
30         .align 8
31         .globl  s390_base_mcck_handler_fn
32 s390_base_mcck_handler_fn:
33         .quad   0
34         .previous
35
36 ENTRY(s390_base_ext_handler)
37         stmg    %r0,%r15,__LC_SAVE_AREA_ASYNC
38         basr    %r13,0
39 0:      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
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
48
49         .section .bss
50         .align 8
51         .globl s390_base_ext_handler_fn
52 s390_base_ext_handler_fn:
53         .quad   0
54         .previous
55
56 ENTRY(s390_base_pgm_handler)
57         stmg    %r0,%r15,__LC_SAVE_AREA_SYNC
58         basr    %r13,0
59 0:      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
65         lmg     %r0,%r15,__LC_SAVE_AREA_SYNC
66         lpswe   __LC_PGM_OLD_PSW
67 1:      lpswe   disabled_wait_psw-0b(%r13)
68
69         .align  8
70 disabled_wait_psw:
71         .quad   0x0002000180000000,0x0000000000000000 + s390_base_pgm_handler
72
73         .section .bss
74         .align 8
75         .globl s390_base_pgm_handler_fn
76 s390_base_pgm_handler_fn:
77         .quad   0
78         .previous
79
80 #
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 #
87 ENTRY(diag308_reset)
88         larl    %r4,.Lctlregs           # Save control registers
89         stctg   %c0,%c15,0(%r4)
90         larl    %r4,.Lfpctl             # Floating point control register
91         stfpc   0(%r4)
92         larl    %r4,.Lcontinue_psw      # Save PSW flags
93         epsw    %r2,%r3
94         stm     %r2,%r3,0(%r4)
95         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         lghi    %r0,0
101         diag    %r0,%r1,0x308
102 .Lrestart_part2:
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
110         lfpc    0(%r4)
111         larl    %r4,.Lcontinue_psw      # Restore PSW flags
112         lpswe   0(%r4)
113 .Lcontinue:
114         br      %r14
115 .align 16
116 .Lrestart_psw:
117         .long   0x00080000,0x80000000 + .Lrestart_part2
118
119         .section .data..nosave,"aw",@progbits
120 .align 8
121 .Lcontinue_psw:
122         .quad   0,.Lcontinue
123         .previous
124
125         .section .bss
126 .align 8
127 .Lctlregs:
128         .rept   16
129         .quad   0
130         .endr
131 .Lfpctl:
132         .long   0
133         .previous
134
135 #else /* CONFIG_64BIT */
136
137 ENTRY(s390_base_mcck_handler)
138         basr    %r13,0
139 0:      l       %r15,__LC_PANIC_STACK   # load panic stack
140         ahi     %r15,-STACK_FRAME_OVERHEAD
141         l       %r1,2f-0b(%r13)
142         l       %r1,0(%r1)
143         ltr     %r1,%r1
144         jz      1f
145         basr    %r14,%r1
146 1:      lm      %r0,%r15,__LC_GPREGS_SAVE_AREA
147         lpsw    __LC_MCK_OLD_PSW
148
149 2:      .long   s390_base_mcck_handler_fn
150
151         .section .bss
152         .align 4
153         .globl  s390_base_mcck_handler_fn
154 s390_base_mcck_handler_fn:
155         .long   0
156         .previous
157
158 ENTRY(s390_base_ext_handler)
159         stm     %r0,%r15,__LC_SAVE_AREA_ASYNC
160         basr    %r13,0
161 0:      ahi     %r15,-STACK_FRAME_OVERHEAD
162         l       %r1,2f-0b(%r13)
163         l       %r1,0(%r1)
164         ltr     %r1,%r1
165         jz      1f
166         basr    %r14,%r1
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
170
171 2:      .long   s390_base_ext_handler_fn
172
173         .section .bss
174         .align 4
175         .globl  s390_base_ext_handler_fn
176 s390_base_ext_handler_fn:
177         .long   0
178         .previous
179
180 ENTRY(s390_base_pgm_handler)
181         stm     %r0,%r15,__LC_SAVE_AREA_SYNC
182         basr    %r13,0
183 0:      ahi     %r15,-STACK_FRAME_OVERHEAD
184         l       %r1,2f-0b(%r13)
185         l       %r1,0(%r1)
186         ltr     %r1,%r1
187         jz      1f
188         basr    %r14,%r1
189         lm      %r0,%r15,__LC_SAVE_AREA_SYNC
190         lpsw    __LC_PGM_OLD_PSW
191
192 1:      lpsw    disabled_wait_psw-0b(%r13)
193
194 2:      .long   s390_base_pgm_handler_fn
195
196 disabled_wait_psw:
197         .align  8
198         .long   0x000a0000,0x00000000 + s390_base_pgm_handler
199
200         .section .bss
201         .align 4
202         .globl  s390_base_pgm_handler_fn
203 s390_base_pgm_handler_fn:
204         .long   0
205         .previous
206
207 #endif /* CONFIG_64BIT */