Warning: This file is not a C or C++ file. It does not have highlighting.

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 .
90555: 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
106557: __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
113559: __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

Warning: This file is not a C or C++ file. It does not have highlighting.

source code of linux/arch/s390/include/asm/nospec-insn.h