Merge branch 'for_3.6/pm/sr-move' of git://git.kernel.org/pub/scm/linux/kernel/git...
[firefly-linux-kernel-4.4.55.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
13 #ifdef CONFIG_64BIT
14
15 ENTRY(s390_base_mcck_handler)
16         basr    %r13,0
17 0:      lg      %r15,__LC_PANIC_STACK   # load panic stack
18         aghi    %r15,-STACK_FRAME_OVERHEAD
19         larl    %r1,s390_base_mcck_handler_fn
20         lg      %r1,0(%r1)
21         ltgr    %r1,%r1
22         jz      1f
23         basr    %r14,%r1
24 1:      la      %r1,4095
25         lmg     %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)
26         lpswe   __LC_MCK_OLD_PSW
27
28         .section .bss
29         .align 8
30         .globl  s390_base_mcck_handler_fn
31 s390_base_mcck_handler_fn:
32         .quad   0
33         .previous
34
35 ENTRY(s390_base_ext_handler)
36         stmg    %r0,%r15,__LC_SAVE_AREA_ASYNC
37         basr    %r13,0
38 0:      aghi    %r15,-STACK_FRAME_OVERHEAD
39         larl    %r1,s390_base_ext_handler_fn
40         lg      %r1,0(%r1)
41         ltgr    %r1,%r1
42         jz      1f
43         basr    %r14,%r1
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
47
48         .section .bss
49         .align 8
50         .globl s390_base_ext_handler_fn
51 s390_base_ext_handler_fn:
52         .quad   0
53         .previous
54
55 ENTRY(s390_base_pgm_handler)
56         stmg    %r0,%r15,__LC_SAVE_AREA_SYNC
57         basr    %r13,0
58 0:      aghi    %r15,-STACK_FRAME_OVERHEAD
59         larl    %r1,s390_base_pgm_handler_fn
60         lg      %r1,0(%r1)
61         ltgr    %r1,%r1
62         jz      1f
63         basr    %r14,%r1
64         lmg     %r0,%r15,__LC_SAVE_AREA_SYNC
65         lpswe   __LC_PGM_OLD_PSW
66 1:      lpswe   disabled_wait_psw-0b(%r13)
67
68         .align  8
69 disabled_wait_psw:
70         .quad   0x0002000180000000,0x0000000000000000 + s390_base_pgm_handler
71
72         .section .bss
73         .align 8
74         .globl s390_base_pgm_handler_fn
75 s390_base_pgm_handler_fn:
76         .quad   0
77         .previous
78
79 #
80 # Calls diag 308 subcode 1 and continues execution
81 #
82 # The following conditions must be ensured before calling this function:
83 # * Prefix register = 0
84 # * Lowcore protection is disabled
85 #
86 ENTRY(diag308_reset)
87         larl    %r4,.Lctlregs           # Save control registers
88         stctg   %c0,%c15,0(%r4)
89         larl    %r4,.Lfpctl             # Floating point control register
90         stfpc   0(%r4)
91         larl    %r4,.Lcontinue_psw      # Save PSW flags
92         epsw    %r2,%r3
93         stm     %r2,%r3,0(%r4)
94         larl    %r4,.Lrestart_psw       # Setup restart PSW at absolute 0
95         lghi    %r3,0
96         lg      %r4,0(%r4)              # Save PSW
97         sturg   %r4,%r3                 # Use sturg, because of large pages
98         lghi    %r1,1
99         diag    %r1,%r1,0x308
100 .Lrestart_part2:
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
108         lfpc    0(%r4)
109         larl    %r4,.Lcontinue_psw      # Restore PSW flags
110         lpswe   0(%r4)
111 .Lcontinue:
112         br      %r14
113 .align 16
114 .Lrestart_psw:
115         .long   0x00080000,0x80000000 + .Lrestart_part2
116
117         .section .data..nosave,"aw",@progbits
118 .align 8
119 .Lcontinue_psw:
120         .quad   0,.Lcontinue
121         .previous
122
123         .section .bss
124 .align 8
125 .Lctlregs:
126         .rept   16
127         .quad   0
128         .endr
129 .Lfpctl:
130         .long   0
131         .previous
132
133 #else /* CONFIG_64BIT */
134
135 ENTRY(s390_base_mcck_handler)
136         basr    %r13,0
137 0:      l       %r15,__LC_PANIC_STACK   # load panic stack
138         ahi     %r15,-STACK_FRAME_OVERHEAD
139         l       %r1,2f-0b(%r13)
140         l       %r1,0(%r1)
141         ltr     %r1,%r1
142         jz      1f
143         basr    %r14,%r1
144 1:      lm      %r0,%r15,__LC_GPREGS_SAVE_AREA
145         lpsw    __LC_MCK_OLD_PSW
146
147 2:      .long   s390_base_mcck_handler_fn
148
149         .section .bss
150         .align 4
151         .globl  s390_base_mcck_handler_fn
152 s390_base_mcck_handler_fn:
153         .long   0
154         .previous
155
156 ENTRY(s390_base_ext_handler)
157         stm     %r0,%r15,__LC_SAVE_AREA_ASYNC
158         basr    %r13,0
159 0:      ahi     %r15,-STACK_FRAME_OVERHEAD
160         l       %r1,2f-0b(%r13)
161         l       %r1,0(%r1)
162         ltr     %r1,%r1
163         jz      1f
164         basr    %r14,%r1
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
168
169 2:      .long   s390_base_ext_handler_fn
170
171         .section .bss
172         .align 4
173         .globl  s390_base_ext_handler_fn
174 s390_base_ext_handler_fn:
175         .long   0
176         .previous
177
178 ENTRY(s390_base_pgm_handler)
179         stm     %r0,%r15,__LC_SAVE_AREA_SYNC
180         basr    %r13,0
181 0:      ahi     %r15,-STACK_FRAME_OVERHEAD
182         l       %r1,2f-0b(%r13)
183         l       %r1,0(%r1)
184         ltr     %r1,%r1
185         jz      1f
186         basr    %r14,%r1
187         lm      %r0,%r15,__LC_SAVE_AREA_SYNC
188         lpsw    __LC_PGM_OLD_PSW
189
190 1:      lpsw    disabled_wait_psw-0b(%r13)
191
192 2:      .long   s390_base_pgm_handler_fn
193
194 disabled_wait_psw:
195         .align  8
196         .long   0x000a0000,0x00000000 + s390_base_pgm_handler
197
198         .section .bss
199         .align 4
200         .globl  s390_base_pgm_handler_fn
201 s390_base_pgm_handler_fn:
202         .long   0
203         .previous
204
205 #endif /* CONFIG_64BIT */