GNU Linux-libre 4.9.309-gnu1
[releases.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/nospec-insn.h>
12 #include <asm/ptrace.h>
13 #include <asm/sigp.h>
14
15         GEN_BR_THUNK %r9
16         GEN_BR_THUNK %r14
17
18 ENTRY(s390_base_mcck_handler)
19         basr    %r13,0
20 0:      lg      %r15,__LC_PANIC_STACK   # load panic stack
21         aghi    %r15,-STACK_FRAME_OVERHEAD
22         larl    %r1,s390_base_mcck_handler_fn
23         lg      %r9,0(%r1)
24         ltgr    %r9,%r9
25         jz      1f
26         BASR_EX %r14,%r9
27 1:      la      %r1,4095
28         lmg     %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)
29         lpswe   __LC_MCK_OLD_PSW
30
31         .section .bss
32         .align 8
33         .globl  s390_base_mcck_handler_fn
34 s390_base_mcck_handler_fn:
35         .quad   0
36         .previous
37
38 ENTRY(s390_base_ext_handler)
39         stmg    %r0,%r15,__LC_SAVE_AREA_ASYNC
40         basr    %r13,0
41 0:      aghi    %r15,-STACK_FRAME_OVERHEAD
42         larl    %r1,s390_base_ext_handler_fn
43         lg      %r9,0(%r1)
44         ltgr    %r9,%r9
45         jz      1f
46         BASR_EX %r14,%r9
47 1:      lmg     %r0,%r15,__LC_SAVE_AREA_ASYNC
48         ni      __LC_EXT_OLD_PSW+1,0xfd # clear wait state bit
49         lpswe   __LC_EXT_OLD_PSW
50
51         .section .bss
52         .align 8
53         .globl s390_base_ext_handler_fn
54 s390_base_ext_handler_fn:
55         .quad   0
56         .previous
57
58 ENTRY(s390_base_pgm_handler)
59         stmg    %r0,%r15,__LC_SAVE_AREA_SYNC
60         basr    %r13,0
61 0:      aghi    %r15,-STACK_FRAME_OVERHEAD
62         larl    %r1,s390_base_pgm_handler_fn
63         lg      %r9,0(%r1)
64         ltgr    %r9,%r9
65         jz      1f
66         BASR_EX %r14,%r9
67         lmg     %r0,%r15,__LC_SAVE_AREA_SYNC
68         lpswe   __LC_PGM_OLD_PSW
69 1:      lpswe   disabled_wait_psw-0b(%r13)
70
71         .align  8
72 disabled_wait_psw:
73         .quad   0x0002000180000000,0x0000000000000000 + s390_base_pgm_handler
74
75         .section .bss
76         .align 8
77         .globl s390_base_pgm_handler_fn
78 s390_base_pgm_handler_fn:
79         .quad   0
80         .previous
81
82 #
83 # Calls diag 308 subcode 1 and continues execution
84 #
85 ENTRY(diag308_reset)
86         larl    %r4,.Lctlregs           # Save control registers
87         stctg   %c0,%c15,0(%r4)
88         lg      %r2,0(%r4)              # Disable lowcore protection
89         nilh    %r2,0xefff
90         larl    %r4,.Lctlreg0
91         stg     %r2,0(%r4)
92         lctlg   %c0,%c0,0(%r4)
93         larl    %r4,.Lfpctl             # Floating point control register
94         stfpc   0(%r4)
95         larl    %r4,.Lprefix            # Save prefix register
96         stpx    0(%r4)
97         larl    %r4,.Lprefix_zero       # Set prefix register to 0
98         spx     0(%r4)
99         larl    %r4,.Lcontinue_psw      # Save PSW flags
100         epsw    %r2,%r3
101         stm     %r2,%r3,0(%r4)
102         larl    %r4,.Lrestart_psw       # Setup restart PSW at absolute 0
103         lghi    %r3,0
104         lg      %r4,0(%r4)              # Save PSW
105         sturg   %r4,%r3                 # Use sturg, because of large pages
106         lghi    %r1,1
107         lghi    %r0,0
108         diag    %r0,%r1,0x308
109 .Lrestart_part2:
110         lhi     %r0,0                   # Load r0 with zero
111         lhi     %r1,2                   # Use mode 2 = ESAME (dump)
112         sigp    %r1,%r0,SIGP_SET_ARCHITECTURE   # Switch to ESAME mode
113         sam64                           # Switch to 64 bit addressing mode
114         larl    %r4,.Lctlregs           # Restore control registers
115         lctlg   %c0,%c15,0(%r4)
116         larl    %r4,.Lfpctl             # Restore floating point ctl register
117         lfpc    0(%r4)
118         larl    %r4,.Lprefix            # Restore prefix register
119         spx     0(%r4)
120         larl    %r4,.Lcontinue_psw      # Restore PSW flags
121         lpswe   0(%r4)
122 .Lcontinue:
123         BR_EX   %r14
124 .align 16
125 .Lrestart_psw:
126         .long   0x00080000,0x80000000 + .Lrestart_part2
127
128         .section .data..nosave,"aw",@progbits
129 .align 8
130 .Lcontinue_psw:
131         .quad   0,.Lcontinue
132         .previous
133
134         .section .bss
135 .align 8
136 .Lctlreg0:
137         .quad   0
138 .Lctlregs:
139         .rept   16
140         .quad   0
141         .endr
142 .Lfpctl:
143         .long   0
144 .Lprefix:
145         .long   0
146 .Lprefix_zero:
147         .long   0
148         .previous