Merge tag 'trace-v6.0' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux...
[linux-block.git] / arch / s390 / kernel / text_amode31.S
CommitLineData
a80313ff
GS
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Code that needs to run below 2 GB.
4 *
5 * Copyright IBM Corp. 2019
6 */
7
8#include <linux/linkage.h>
d09a307f 9#include <asm/asm-extable.h>
a80313ff
GS
10#include <asm/errno.h>
11#include <asm/sigp.h>
12
c78d0c74 13 .section .amode31.text,"ax"
a80313ff
GS
14/*
15 * Simplified version of expoline thunk. The normal thunks can not be used here,
16 * because they might be more than 2 GB away, and not reachable by the relative
17 * branch. No comdat, exrl, etc. optimizations used here, because it only
18 * affects a few functions that are not performance-relevant.
19 */
c78d0c74 20 .macro BR_EX_AMODE31_r14
463f36c7
AE
21 larl %r1,0f
22 ex 0,0(%r1)
23 j .
240: br %r14
a80313ff
GS
25 .endm
26
27/*
c78d0c74 28 * int _diag14_amode31(unsigned long rx, unsigned long ry1, unsigned long subcode)
a80313ff 29 */
c78d0c74 30ENTRY(_diag14_amode31)
a80313ff
GS
31 lgr %r1,%r2
32 lgr %r2,%r3
33 lgr %r3,%r4
34 lhi %r5,-EIO
35 sam31
36 diag %r1,%r2,0x14
37.Ldiag14_ex:
38 ipm %r5
39 srl %r5,28
40.Ldiag14_fault:
41 sam64
42 lgfr %r2,%r5
c78d0c74
HC
43 BR_EX_AMODE31_r14
44 EX_TABLE_AMODE31(.Ldiag14_ex, .Ldiag14_fault)
45ENDPROC(_diag14_amode31)
a80313ff
GS
46
47/*
c78d0c74 48 * int _diag210_amode31(struct diag210 *addr)
a80313ff 49 */
c78d0c74 50ENTRY(_diag210_amode31)
a80313ff
GS
51 lgr %r1,%r2
52 lhi %r2,-1
53 sam31
54 diag %r1,%r0,0x210
55.Ldiag210_ex:
56 ipm %r2
57 srl %r2,28
58.Ldiag210_fault:
59 sam64
60 lgfr %r2,%r2
c78d0c74
HC
61 BR_EX_AMODE31_r14
62 EX_TABLE_AMODE31(.Ldiag210_ex, .Ldiag210_fault)
63ENDPROC(_diag210_amode31)
a80313ff
GS
64
65/*
c78d0c74 66 * int _diag26c_amode31(void *req, void *resp, enum diag26c_sc subcode)
a80313ff 67 */
c78d0c74 68ENTRY(_diag26c_amode31)
a80313ff
GS
69 lghi %r5,-EOPNOTSUPP
70 sam31
71 diag %r2,%r4,0x26c
72.Ldiag26c_ex:
73 sam64
74 lgfr %r2,%r5
c78d0c74
HC
75 BR_EX_AMODE31_r14
76 EX_TABLE_AMODE31(.Ldiag26c_ex, .Ldiag26c_ex)
77ENDPROC(_diag26c_amode31)
a80313ff
GS
78
79/*
c78d0c74 80 * void _diag0c_amode31(struct hypfs_diag0c_entry *entry)
a80313ff 81 */
c78d0c74 82ENTRY(_diag0c_amode31)
a80313ff
GS
83 sam31
84 diag %r2,%r2,0x0c
85 sam64
c78d0c74
HC
86 BR_EX_AMODE31_r14
87ENDPROC(_diag0c_amode31)
a80313ff 88
a80313ff 89/*
c78d0c74 90 * void _diag308_reset_amode31(void)
a80313ff
GS
91 *
92 * Calls diag 308 subcode 1 and continues execution
93 */
c78d0c74 94ENTRY(_diag308_reset_amode31)
a80313ff
GS
95 larl %r4,.Lctlregs # Save control registers
96 stctg %c0,%c15,0(%r4)
97 lg %r2,0(%r4) # Disable lowcore protection
98 nilh %r2,0xefff
99 larl %r4,.Lctlreg0
100 stg %r2,0(%r4)
101 lctlg %c0,%c0,0(%r4)
102 larl %r4,.Lfpctl # Floating point control register
103 stfpc 0(%r4)
104 larl %r4,.Lprefix # Save prefix register
105 stpx 0(%r4)
106 larl %r4,.Lprefix_zero # Set prefix register to 0
107 spx 0(%r4)
108 larl %r4,.Lcontinue_psw # Save PSW flags
109 epsw %r2,%r3
110 stm %r2,%r3,0(%r4)
2879048c 111 larl %r4,.Lrestart_part2 # Setup restart PSW at absolute 0
a80313ff
GS
112 larl %r3,.Lrestart_diag308_psw
113 og %r4,0(%r3) # Save PSW
114 lghi %r3,0
115 sturg %r4,%r3 # Use sturg, because of large pages
116 lghi %r1,1
117 lghi %r0,0
118 diag %r0,%r1,0x308
2879048c 119.Lrestart_part2:
a80313ff
GS
120 lhi %r0,0 # Load r0 with zero
121 lhi %r1,2 # Use mode 2 = ESAME (dump)
122 sigp %r1,%r0,SIGP_SET_ARCHITECTURE # Switch to ESAME mode
123 sam64 # Switch to 64 bit addressing mode
124 larl %r4,.Lctlregs # Restore control registers
125 lctlg %c0,%c15,0(%r4)
126 larl %r4,.Lfpctl # Restore floating point ctl register
127 lfpc 0(%r4)
128 larl %r4,.Lprefix # Restore prefix register
129 spx 0(%r4)
130 larl %r4,.Lcontinue_psw # Restore PSW flags
7accd1f8
AE
131 larl %r2,.Lcontinue
132 stg %r2,8(%r4)
a80313ff
GS
133 lpswe 0(%r4)
134.Lcontinue:
c78d0c74
HC
135 BR_EX_AMODE31_r14
136ENDPROC(_diag308_reset_amode31)
a80313ff 137
c78d0c74 138 .section .amode31.data,"aw",@progbits
a80313ff
GS
139.align 8
140.Lrestart_diag308_psw:
141 .long 0x00080000,0x80000000
142
143.align 8
144.Lcontinue_psw:
7accd1f8 145 .quad 0,0
a80313ff
GS
146
147.align 8
148.Lctlreg0:
149 .quad 0
150.Lctlregs:
151 .rept 16
152 .quad 0
153 .endr
154.Lfpctl:
155 .long 0
156.Lprefix:
157 .long 0
158.Lprefix_zero:
159 .long 0