xref: /OK3568_Linux_fs/kernel/arch/s390/include/asm/nospec-insn.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _ASM_S390_NOSPEC_ASM_H
3*4882a593Smuzhiyun #define _ASM_S390_NOSPEC_ASM_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <asm/alternative-asm.h>
6*4882a593Smuzhiyun #include <asm/asm-offsets.h>
7*4882a593Smuzhiyun #include <asm/dwarf.h>
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifdef __ASSEMBLY__
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #ifdef CC_USING_EXPOLINE
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun _LC_BR_R1 = __LC_BR_R1
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun /*
16*4882a593Smuzhiyun  * The expoline macros are used to create thunks in the same format
17*4882a593Smuzhiyun  * as gcc generates them. The 'comdat' section flag makes sure that
18*4882a593Smuzhiyun  * the various thunks are merged into a single copy.
19*4882a593Smuzhiyun  */
20*4882a593Smuzhiyun 	.macro __THUNK_PROLOG_NAME name
21*4882a593Smuzhiyun 	.pushsection .text.\name,"axG",@progbits,\name,comdat
22*4882a593Smuzhiyun 	.globl \name
23*4882a593Smuzhiyun 	.hidden \name
24*4882a593Smuzhiyun 	.type \name,@function
25*4882a593Smuzhiyun \name:
26*4882a593Smuzhiyun 	CFI_STARTPROC
27*4882a593Smuzhiyun 	.endm
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun 	.macro __THUNK_EPILOG
30*4882a593Smuzhiyun 	CFI_ENDPROC
31*4882a593Smuzhiyun 	.popsection
32*4882a593Smuzhiyun 	.endm
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun 	.macro __THUNK_PROLOG_BR r1,r2
35*4882a593Smuzhiyun 	__THUNK_PROLOG_NAME __s390_indirect_jump_r\r2\()use_r\r1
36*4882a593Smuzhiyun 	.endm
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun 	.macro __THUNK_PROLOG_BC d0,r1,r2
39*4882a593Smuzhiyun 	__THUNK_PROLOG_NAME __s390_indirect_branch_\d0\()_\r2\()use_\r1
40*4882a593Smuzhiyun 	.endm
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun 	.macro __THUNK_BR r1,r2
43*4882a593Smuzhiyun 	jg	__s390_indirect_jump_r\r2\()use_r\r1
44*4882a593Smuzhiyun 	.endm
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun 	.macro __THUNK_BC d0,r1,r2
47*4882a593Smuzhiyun 	jg	__s390_indirect_branch_\d0\()_\r2\()use_\r1
48*4882a593Smuzhiyun 	.endm
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun 	.macro __THUNK_BRASL r1,r2,r3
51*4882a593Smuzhiyun 	brasl	\r1,__s390_indirect_jump_r\r3\()use_r\r2
52*4882a593Smuzhiyun 	.endm
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun 	.macro	__DECODE_RR expand,reg,ruse
55*4882a593Smuzhiyun 	.set __decode_fail,1
56*4882a593Smuzhiyun 	.irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
57*4882a593Smuzhiyun 	.ifc \reg,%r\r1
58*4882a593Smuzhiyun 	.irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
59*4882a593Smuzhiyun 	.ifc \ruse,%r\r2
60*4882a593Smuzhiyun 	\expand \r1,\r2
61*4882a593Smuzhiyun 	.set __decode_fail,0
62*4882a593Smuzhiyun 	.endif
63*4882a593Smuzhiyun 	.endr
64*4882a593Smuzhiyun 	.endif
65*4882a593Smuzhiyun 	.endr
66*4882a593Smuzhiyun 	.if __decode_fail == 1
67*4882a593Smuzhiyun 	.error "__DECODE_RR failed"
68*4882a593Smuzhiyun 	.endif
69*4882a593Smuzhiyun 	.endm
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun 	.macro	__DECODE_RRR expand,rsave,rtarget,ruse
72*4882a593Smuzhiyun 	.set __decode_fail,1
73*4882a593Smuzhiyun 	.irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
74*4882a593Smuzhiyun 	.ifc \rsave,%r\r1
75*4882a593Smuzhiyun 	.irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
76*4882a593Smuzhiyun 	.ifc \rtarget,%r\r2
77*4882a593Smuzhiyun 	.irp r3,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
78*4882a593Smuzhiyun 	.ifc \ruse,%r\r3
79*4882a593Smuzhiyun 	\expand \r1,\r2,\r3
80*4882a593Smuzhiyun 	.set __decode_fail,0
81*4882a593Smuzhiyun 	.endif
82*4882a593Smuzhiyun 	.endr
83*4882a593Smuzhiyun 	.endif
84*4882a593Smuzhiyun 	.endr
85*4882a593Smuzhiyun 	.endif
86*4882a593Smuzhiyun 	.endr
87*4882a593Smuzhiyun 	.if __decode_fail == 1
88*4882a593Smuzhiyun 	.error "__DECODE_RRR failed"
89*4882a593Smuzhiyun 	.endif
90*4882a593Smuzhiyun 	.endm
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun 	.macro	__DECODE_DRR expand,disp,reg,ruse
93*4882a593Smuzhiyun 	.set __decode_fail,1
94*4882a593Smuzhiyun 	.irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
95*4882a593Smuzhiyun 	.ifc \reg,%r\r1
96*4882a593Smuzhiyun 	.irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
97*4882a593Smuzhiyun 	.ifc \ruse,%r\r2
98*4882a593Smuzhiyun 	\expand \disp,\r1,\r2
99*4882a593Smuzhiyun 	.set __decode_fail,0
100*4882a593Smuzhiyun 	.endif
101*4882a593Smuzhiyun 	.endr
102*4882a593Smuzhiyun 	.endif
103*4882a593Smuzhiyun 	.endr
104*4882a593Smuzhiyun 	.if __decode_fail == 1
105*4882a593Smuzhiyun 	.error "__DECODE_DRR failed"
106*4882a593Smuzhiyun 	.endif
107*4882a593Smuzhiyun 	.endm
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	.macro __THUNK_EX_BR reg,ruse
110*4882a593Smuzhiyun 	# Be very careful when adding instructions to this macro!
111*4882a593Smuzhiyun 	# The ALTERNATIVE replacement code has a .+10 which targets
112*4882a593Smuzhiyun 	# the "br \reg" after the code has been patched.
113*4882a593Smuzhiyun #ifdef CONFIG_HAVE_MARCH_Z10_FEATURES
114*4882a593Smuzhiyun 	exrl	0,555f
115*4882a593Smuzhiyun 	j	.
116*4882a593Smuzhiyun #else
117*4882a593Smuzhiyun 	.ifc \reg,%r1
118*4882a593Smuzhiyun 	ALTERNATIVE "ex %r0,_LC_BR_R1", ".insn ril,0xc60000000000,0,.+10", 35
119*4882a593Smuzhiyun 	j	.
120*4882a593Smuzhiyun 	.else
121*4882a593Smuzhiyun 	larl	\ruse,555f
122*4882a593Smuzhiyun 	ex	0,0(\ruse)
123*4882a593Smuzhiyun 	j	.
124*4882a593Smuzhiyun 	.endif
125*4882a593Smuzhiyun #endif
126*4882a593Smuzhiyun 555:	br	\reg
127*4882a593Smuzhiyun 	.endm
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 	.macro __THUNK_EX_BC disp,reg,ruse
130*4882a593Smuzhiyun #ifdef CONFIG_HAVE_MARCH_Z10_FEATURES
131*4882a593Smuzhiyun 	exrl	0,556f
132*4882a593Smuzhiyun 	j	.
133*4882a593Smuzhiyun #else
134*4882a593Smuzhiyun 	larl	\ruse,556f
135*4882a593Smuzhiyun 	ex	0,0(\ruse)
136*4882a593Smuzhiyun 	j	.
137*4882a593Smuzhiyun #endif
138*4882a593Smuzhiyun 556:	b	\disp(\reg)
139*4882a593Smuzhiyun 	.endm
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun 	.macro GEN_BR_THUNK reg,ruse=%r1
142*4882a593Smuzhiyun 	__DECODE_RR __THUNK_PROLOG_BR,\reg,\ruse
143*4882a593Smuzhiyun 	__THUNK_EX_BR \reg,\ruse
144*4882a593Smuzhiyun 	__THUNK_EPILOG
145*4882a593Smuzhiyun 	.endm
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	.macro GEN_B_THUNK disp,reg,ruse=%r1
148*4882a593Smuzhiyun 	__DECODE_DRR __THUNK_PROLOG_BC,\disp,\reg,\ruse
149*4882a593Smuzhiyun 	__THUNK_EX_BC \disp,\reg,\ruse
150*4882a593Smuzhiyun 	__THUNK_EPILOG
151*4882a593Smuzhiyun 	.endm
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 	.macro BR_EX reg,ruse=%r1
154*4882a593Smuzhiyun 557:	__DECODE_RR __THUNK_BR,\reg,\ruse
155*4882a593Smuzhiyun 	.pushsection .s390_indirect_branches,"a",@progbits
156*4882a593Smuzhiyun 	.long	557b-.
157*4882a593Smuzhiyun 	.popsection
158*4882a593Smuzhiyun 	.endm
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 	 .macro B_EX disp,reg,ruse=%r1
161*4882a593Smuzhiyun 558:	__DECODE_DRR __THUNK_BC,\disp,\reg,\ruse
162*4882a593Smuzhiyun 	.pushsection .s390_indirect_branches,"a",@progbits
163*4882a593Smuzhiyun 	.long	558b-.
164*4882a593Smuzhiyun 	.popsection
165*4882a593Smuzhiyun 	.endm
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun 	.macro BASR_EX rsave,rtarget,ruse=%r1
168*4882a593Smuzhiyun 559:	__DECODE_RRR __THUNK_BRASL,\rsave,\rtarget,\ruse
169*4882a593Smuzhiyun 	.pushsection .s390_indirect_branches,"a",@progbits
170*4882a593Smuzhiyun 	.long	559b-.
171*4882a593Smuzhiyun 	.popsection
172*4882a593Smuzhiyun 	.endm
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun #else
175*4882a593Smuzhiyun 	.macro GEN_BR_THUNK reg,ruse=%r1
176*4882a593Smuzhiyun 	.endm
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun 	.macro GEN_B_THUNK disp,reg,ruse=%r1
179*4882a593Smuzhiyun 	.endm
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun 	 .macro BR_EX reg,ruse=%r1
182*4882a593Smuzhiyun 	br	\reg
183*4882a593Smuzhiyun 	.endm
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun 	 .macro B_EX disp,reg,ruse=%r1
186*4882a593Smuzhiyun 	b	\disp(\reg)
187*4882a593Smuzhiyun 	.endm
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	.macro BASR_EX rsave,rtarget,ruse=%r1
190*4882a593Smuzhiyun 	basr	\rsave,\rtarget
191*4882a593Smuzhiyun 	.endm
192*4882a593Smuzhiyun #endif /* CC_USING_EXPOLINE */
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun #endif /* _ASM_S390_NOSPEC_ASM_H */
197