Merge tag 'arm-dt-6.0' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
[linux-2.6-microblaze.git] / arch / s390 / include / asm / nospec-insn.h
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 */