xref: /OK3568_Linux_fs/kernel/arch/x86/include/asm/asm.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _ASM_X86_ASM_H
3*4882a593Smuzhiyun #define _ASM_X86_ASM_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #ifdef __ASSEMBLY__
6*4882a593Smuzhiyun # define __ASM_FORM(x)	x
7*4882a593Smuzhiyun # define __ASM_FORM_RAW(x)     x
8*4882a593Smuzhiyun # define __ASM_FORM_COMMA(x) x,
9*4882a593Smuzhiyun #else
10*4882a593Smuzhiyun #include <linux/stringify.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun # define __ASM_FORM(x)	" " __stringify(x) " "
13*4882a593Smuzhiyun # define __ASM_FORM_RAW(x)     __stringify(x)
14*4882a593Smuzhiyun # define __ASM_FORM_COMMA(x) " " __stringify(x) ","
15*4882a593Smuzhiyun #endif
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #ifndef __x86_64__
18*4882a593Smuzhiyun /* 32 bit */
19*4882a593Smuzhiyun # define __ASM_SEL(a,b) __ASM_FORM(a)
20*4882a593Smuzhiyun # define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(a)
21*4882a593Smuzhiyun #else
22*4882a593Smuzhiyun /* 64 bit */
23*4882a593Smuzhiyun # define __ASM_SEL(a,b) __ASM_FORM(b)
24*4882a593Smuzhiyun # define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(b)
25*4882a593Smuzhiyun #endif
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #define __ASM_SIZE(inst, ...)	__ASM_SEL(inst##l##__VA_ARGS__, \
28*4882a593Smuzhiyun 					  inst##q##__VA_ARGS__)
29*4882a593Smuzhiyun #define __ASM_REG(reg)         __ASM_SEL_RAW(e##reg, r##reg)
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #define _ASM_PTR	__ASM_SEL(.long, .quad)
32*4882a593Smuzhiyun #define _ASM_ALIGN	__ASM_SEL(.balign 4, .balign 8)
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #define _ASM_MOV	__ASM_SIZE(mov)
35*4882a593Smuzhiyun #define _ASM_INC	__ASM_SIZE(inc)
36*4882a593Smuzhiyun #define _ASM_DEC	__ASM_SIZE(dec)
37*4882a593Smuzhiyun #define _ASM_ADD	__ASM_SIZE(add)
38*4882a593Smuzhiyun #define _ASM_SUB	__ASM_SIZE(sub)
39*4882a593Smuzhiyun #define _ASM_XADD	__ASM_SIZE(xadd)
40*4882a593Smuzhiyun #define _ASM_MUL	__ASM_SIZE(mul)
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define _ASM_AX		__ASM_REG(ax)
43*4882a593Smuzhiyun #define _ASM_BX		__ASM_REG(bx)
44*4882a593Smuzhiyun #define _ASM_CX		__ASM_REG(cx)
45*4882a593Smuzhiyun #define _ASM_DX		__ASM_REG(dx)
46*4882a593Smuzhiyun #define _ASM_SP		__ASM_REG(sp)
47*4882a593Smuzhiyun #define _ASM_BP		__ASM_REG(bp)
48*4882a593Smuzhiyun #define _ASM_SI		__ASM_REG(si)
49*4882a593Smuzhiyun #define _ASM_DI		__ASM_REG(di)
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #ifndef __x86_64__
52*4882a593Smuzhiyun /* 32 bit */
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun #define _ASM_ARG1	_ASM_AX
55*4882a593Smuzhiyun #define _ASM_ARG2	_ASM_DX
56*4882a593Smuzhiyun #define _ASM_ARG3	_ASM_CX
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #define _ASM_ARG1L	eax
59*4882a593Smuzhiyun #define _ASM_ARG2L	edx
60*4882a593Smuzhiyun #define _ASM_ARG3L	ecx
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun #define _ASM_ARG1W	ax
63*4882a593Smuzhiyun #define _ASM_ARG2W	dx
64*4882a593Smuzhiyun #define _ASM_ARG3W	cx
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun #define _ASM_ARG1B	al
67*4882a593Smuzhiyun #define _ASM_ARG2B	dl
68*4882a593Smuzhiyun #define _ASM_ARG3B	cl
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun #else
71*4882a593Smuzhiyun /* 64 bit */
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun #define _ASM_ARG1	_ASM_DI
74*4882a593Smuzhiyun #define _ASM_ARG2	_ASM_SI
75*4882a593Smuzhiyun #define _ASM_ARG3	_ASM_DX
76*4882a593Smuzhiyun #define _ASM_ARG4	_ASM_CX
77*4882a593Smuzhiyun #define _ASM_ARG5	r8
78*4882a593Smuzhiyun #define _ASM_ARG6	r9
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun #define _ASM_ARG1Q	rdi
81*4882a593Smuzhiyun #define _ASM_ARG2Q	rsi
82*4882a593Smuzhiyun #define _ASM_ARG3Q	rdx
83*4882a593Smuzhiyun #define _ASM_ARG4Q	rcx
84*4882a593Smuzhiyun #define _ASM_ARG5Q	r8
85*4882a593Smuzhiyun #define _ASM_ARG6Q	r9
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun #define _ASM_ARG1L	edi
88*4882a593Smuzhiyun #define _ASM_ARG2L	esi
89*4882a593Smuzhiyun #define _ASM_ARG3L	edx
90*4882a593Smuzhiyun #define _ASM_ARG4L	ecx
91*4882a593Smuzhiyun #define _ASM_ARG5L	r8d
92*4882a593Smuzhiyun #define _ASM_ARG6L	r9d
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun #define _ASM_ARG1W	di
95*4882a593Smuzhiyun #define _ASM_ARG2W	si
96*4882a593Smuzhiyun #define _ASM_ARG3W	dx
97*4882a593Smuzhiyun #define _ASM_ARG4W	cx
98*4882a593Smuzhiyun #define _ASM_ARG5W	r8w
99*4882a593Smuzhiyun #define _ASM_ARG6W	r9w
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun #define _ASM_ARG1B	dil
102*4882a593Smuzhiyun #define _ASM_ARG2B	sil
103*4882a593Smuzhiyun #define _ASM_ARG3B	dl
104*4882a593Smuzhiyun #define _ASM_ARG4B	cl
105*4882a593Smuzhiyun #define _ASM_ARG5B	r8b
106*4882a593Smuzhiyun #define _ASM_ARG6B	r9b
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun #endif
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun /*
111*4882a593Smuzhiyun  * Macros to generate condition code outputs from inline assembly,
112*4882a593Smuzhiyun  * The output operand must be type "bool".
113*4882a593Smuzhiyun  */
114*4882a593Smuzhiyun #ifdef __GCC_ASM_FLAG_OUTPUTS__
115*4882a593Smuzhiyun # define CC_SET(c) "\n\t/* output condition code " #c "*/\n"
116*4882a593Smuzhiyun # define CC_OUT(c) "=@cc" #c
117*4882a593Smuzhiyun #else
118*4882a593Smuzhiyun # define CC_SET(c) "\n\tset" #c " %[_cc_" #c "]\n"
119*4882a593Smuzhiyun # define CC_OUT(c) [_cc_ ## c] "=qm"
120*4882a593Smuzhiyun #endif
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun /* Exception table entry */
123*4882a593Smuzhiyun #ifdef __ASSEMBLY__
124*4882a593Smuzhiyun # define _ASM_EXTABLE_HANDLE(from, to, handler)			\
125*4882a593Smuzhiyun 	.pushsection "__ex_table","a" ;				\
126*4882a593Smuzhiyun 	.balign 4 ;						\
127*4882a593Smuzhiyun 	.long (from) - . ;					\
128*4882a593Smuzhiyun 	.long (to) - . ;					\
129*4882a593Smuzhiyun 	.long (handler) - . ;					\
130*4882a593Smuzhiyun 	.popsection
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun # define _ASM_EXTABLE(from, to)					\
133*4882a593Smuzhiyun 	_ASM_EXTABLE_HANDLE(from, to, ex_handler_default)
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun # define _ASM_EXTABLE_UA(from, to)				\
136*4882a593Smuzhiyun 	_ASM_EXTABLE_HANDLE(from, to, ex_handler_uaccess)
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun # define _ASM_EXTABLE_CPY(from, to)				\
139*4882a593Smuzhiyun 	_ASM_EXTABLE_HANDLE(from, to, ex_handler_copy)
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun # define _ASM_EXTABLE_FAULT(from, to)				\
142*4882a593Smuzhiyun 	_ASM_EXTABLE_HANDLE(from, to, ex_handler_fault)
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun # ifdef CONFIG_KPROBES
145*4882a593Smuzhiyun #  define _ASM_NOKPROBE(entry)					\
146*4882a593Smuzhiyun 	.pushsection "_kprobe_blacklist","aw" ;			\
147*4882a593Smuzhiyun 	_ASM_ALIGN ;						\
148*4882a593Smuzhiyun 	_ASM_PTR (entry);					\
149*4882a593Smuzhiyun 	.popsection
150*4882a593Smuzhiyun # else
151*4882a593Smuzhiyun #  define _ASM_NOKPROBE(entry)
152*4882a593Smuzhiyun # endif
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun #else /* ! __ASSEMBLY__ */
155*4882a593Smuzhiyun # define _EXPAND_EXTABLE_HANDLE(x) #x
156*4882a593Smuzhiyun # define _ASM_EXTABLE_HANDLE(from, to, handler)			\
157*4882a593Smuzhiyun 	" .pushsection \"__ex_table\",\"a\"\n"			\
158*4882a593Smuzhiyun 	" .balign 4\n"						\
159*4882a593Smuzhiyun 	" .long (" #from ") - .\n"				\
160*4882a593Smuzhiyun 	" .long (" #to ") - .\n"				\
161*4882a593Smuzhiyun 	" .long (" _EXPAND_EXTABLE_HANDLE(handler) ") - .\n"	\
162*4882a593Smuzhiyun 	" .popsection\n"
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun # define _ASM_EXTABLE(from, to)					\
165*4882a593Smuzhiyun 	_ASM_EXTABLE_HANDLE(from, to, ex_handler_default)
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun # define _ASM_EXTABLE_UA(from, to)				\
168*4882a593Smuzhiyun 	_ASM_EXTABLE_HANDLE(from, to, ex_handler_uaccess)
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun # define _ASM_EXTABLE_CPY(from, to)				\
171*4882a593Smuzhiyun 	_ASM_EXTABLE_HANDLE(from, to, ex_handler_copy)
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun # define _ASM_EXTABLE_FAULT(from, to)				\
174*4882a593Smuzhiyun 	_ASM_EXTABLE_HANDLE(from, to, ex_handler_fault)
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun /* For C file, we already have NOKPROBE_SYMBOL macro */
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun /*
179*4882a593Smuzhiyun  * This output constraint should be used for any inline asm which has a "call"
180*4882a593Smuzhiyun  * instruction.  Otherwise the asm may be inserted before the frame pointer
181*4882a593Smuzhiyun  * gets set up by the containing function.  If you forget to do this, objtool
182*4882a593Smuzhiyun  * may print a "call without frame pointer save/setup" warning.
183*4882a593Smuzhiyun  */
184*4882a593Smuzhiyun register unsigned long current_stack_pointer asm(_ASM_SP);
185*4882a593Smuzhiyun #define ASM_CALL_CONSTRAINT "+r" (current_stack_pointer)
186*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun #endif /* _ASM_X86_ASM_H */
189