Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86/asm: Use _ASM_BYTES() in <asm/nops.h>

Use the new generalized _ASM_BYTES() macro from <asm/asm.h> instead of
the "home grown" _ASM_MK_NOP() in <asm/nops.h>.

Add <asm/asm.h> and update <asm/nops.h> in the tools directory...

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20210510090940.924953-4-hpa@zytor.com

authored by

H. Peter Anvin (Intel) and committed by
Ingo Molnar
eef23e72 d88be187

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