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