xref: /linux/arch/s390/include/asm/nospec-insn.h (revision bc46b7cbc58c4cb562b6a45a1fbc7b8e7b23df58)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _ASM_S390_NOSPEC_ASM_H
3 #define _ASM_S390_NOSPEC_ASM_H
4 
5 #include <linux/linkage.h>
6 #include <linux/export.h>
7 #include <asm/dwarf.h>
8 
9 #ifdef __ASSEMBLER__
10 
11 #ifdef CC_USING_EXPOLINE
12 
13 /*
14  * The expoline macros are used to create thunks in the same format
15  * as gcc generates them. The 'comdat' section flag makes sure that
16  * the various thunks are merged into a single copy.
17  */
18 	.macro __THUNK_PROLOG_NAME name
19 #ifdef CONFIG_EXPOLINE_EXTERN
20 	SYM_CODE_START(\name)
21 #else
22 	.pushsection .text.\name,"axG",@progbits,\name,comdat
23 	.globl \name
24 	.hidden \name
25 	.type \name,@function
26 \name:
27 	CFI_STARTPROC
28 #endif
29 	.endm
30 
31 	.macro __THUNK_EPILOG_NAME name
32 #ifdef CONFIG_EXPOLINE_EXTERN
33 	SYM_CODE_END(\name)
34 	EXPORT_SYMBOL(\name)
35 #else
36 	CFI_ENDPROC
37 	.popsection
38 #endif
39 	.endm
40 
41 	.macro __THUNK_PROLOG_BR r1
42 	__THUNK_PROLOG_NAME __s390_indirect_jump_r\r1
43 	.endm
44 
45 	.macro __THUNK_EPILOG_BR r1
46 	__THUNK_EPILOG_NAME __s390_indirect_jump_r\r1
47 	.endm
48 
49 	.macro __THUNK_BR r1
50 	jg	__s390_indirect_jump_r\r1
51 	.endm
52 
53 	.macro __THUNK_BRASL r1,r2
54 	brasl	\r1,__s390_indirect_jump_r\r2
55 	.endm
56 
57 	.macro	__DECODE_R expand,reg
58 	.set .L__decode_fail,1
59 	.irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
60 	.ifc \reg,%r\r1
61 	\expand \r1
62 	.set .L__decode_fail,0
63 	.endif
64 	.endr
65 	.if .L__decode_fail == 1
66 	.error "__DECODE_R failed"
67 	.endif
68 	.endm
69 
70 	.macro	__DECODE_RR expand,rsave,rtarget
71 	.set .L__decode_fail,1
72 	.irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
73 	.ifc \rsave,%r\r1
74 	.irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
75 	.ifc \rtarget,%r\r2
76 	\expand \r1,\r2
77 	.set .L__decode_fail,0
78 	.endif
79 	.endr
80 	.endif
81 	.endr
82 	.if .L__decode_fail == 1
83 	.error "__DECODE_RR failed"
84 	.endif
85 	.endm
86 
87 	.macro __THUNK_EX_BR reg
88 	exrl	0,555f
89 	j	.
90 555:	br	\reg
91 	.endm
92 
93 #ifdef CONFIG_EXPOLINE_EXTERN
94 	.macro GEN_BR_THUNK reg
95 	.endm
96 	.macro GEN_BR_THUNK_EXTERN reg
97 #else
98 	.macro GEN_BR_THUNK reg
99 #endif
100 	__DECODE_R __THUNK_PROLOG_BR,\reg
101 	__THUNK_EX_BR \reg
102 	__DECODE_R __THUNK_EPILOG_BR,\reg
103 	.endm
104 
105 	.macro BR_EX reg
106 557:	__DECODE_R __THUNK_BR,\reg
107 	.pushsection .s390_indirect_branches,"a",@progbits
108 	.long	557b-.
109 	.popsection
110 	.endm
111 
112 	.macro BASR_EX rsave,rtarget
113 559:	__DECODE_RR __THUNK_BRASL,\rsave,\rtarget
114 	.pushsection .s390_indirect_branches,"a",@progbits
115 	.long	559b-.
116 	.popsection
117 	.endm
118 
119 #else
120 	.macro GEN_BR_THUNK reg
121 	.endm
122 
123 	 .macro BR_EX reg
124 	br	\reg
125 	.endm
126 
127 	.macro BASR_EX rsave,rtarget
128 	basr	\rsave,\rtarget
129 	.endm
130 #endif /* CC_USING_EXPOLINE */
131 
132 #endif /* __ASSEMBLER__ */
133 
134 #endif /* _ASM_S390_NOSPEC_ASM_H */
135