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