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