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