Commit c3462ba9 authored by Ingo Molnar's avatar Ingo Molnar
Browse files

Revert "x86/cpufeature: Macrofy inline assembly code to work around GCC inlining bugs"



This reverts commit d5a581d8.

See this commit for details about the revert:

  e769742d ("Revert "x86/jump-labels: Macrofy inline assembly code to work around GCC inlining bugs"")

Reported-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
Reviewed-by: default avatarBorislav Petkov <bp@alien8.de>
Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: Juergen Gross <jgross@suse.com>
Cc: Richard Biener <rguenther@suse.de>
Cc: Kees Cook <keescook@chromium.org>
Cc: Segher Boessenkool <segher@kernel.crashing.org>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Nadav Amit <namit@vmware.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent e769742d
Loading
Loading
Loading
Loading
+35 −47
Original line number Diff line number Diff line
@@ -2,10 +2,10 @@
#ifndef _ASM_X86_CPUFEATURE_H
#define _ASM_X86_CPUFEATURE_H

#ifdef __KERNEL__
#ifndef __ASSEMBLY__

#include <asm/processor.h>

#if defined(__KERNEL__) && !defined(__ASSEMBLY__)

#include <asm/asm.h>
#include <linux/bitops.h>

@@ -161,10 +161,37 @@ extern void clear_cpu_cap(struct cpuinfo_x86 *c, unsigned int bit);
 */
static __always_inline __pure bool _static_cpu_has(u16 bit)
{
	asm_volatile_goto("STATIC_CPU_HAS bitnum=%[bitnum] "
			  "cap_byte=\"%[cap_byte]\" "
			  "feature=%P[feature] t_yes=%l[t_yes] "
			  "t_no=%l[t_no] always=%P[always]"
	asm_volatile_goto("1: jmp 6f\n"
		 "2:\n"
		 ".skip -(((5f-4f) - (2b-1b)) > 0) * "
			 "((5f-4f) - (2b-1b)),0x90\n"
		 "3:\n"
		 ".section .altinstructions,\"a\"\n"
		 " .long 1b - .\n"		/* src offset */
		 " .long 4f - .\n"		/* repl offset */
		 " .word %P[always]\n"		/* always replace */
		 " .byte 3b - 1b\n"		/* src len */
		 " .byte 5f - 4f\n"		/* repl len */
		 " .byte 3b - 2b\n"		/* pad len */
		 ".previous\n"
		 ".section .altinstr_replacement,\"ax\"\n"
		 "4: jmp %l[t_no]\n"
		 "5:\n"
		 ".previous\n"
		 ".section .altinstructions,\"a\"\n"
		 " .long 1b - .\n"		/* src offset */
		 " .long 0\n"			/* no replacement */
		 " .word %P[feature]\n"		/* feature bit */
		 " .byte 3b - 1b\n"		/* src len */
		 " .byte 0\n"			/* repl len */
		 " .byte 0\n"			/* pad len */
		 ".previous\n"
		 ".section .altinstr_aux,\"ax\"\n"
		 "6:\n"
		 " testb %[bitnum],%[cap_byte]\n"
		 " jnz %l[t_yes]\n"
		 " jmp %l[t_no]\n"
		 ".previous\n"
		 : : [feature]  "i" (bit),
		     [always]   "i" (X86_FEATURE_ALWAYS),
		     [bitnum]   "i" (1 << (bit & 7)),
@@ -199,44 +226,5 @@ t_no:
#define CPU_FEATURE_TYPEVAL		boot_cpu_data.x86_vendor, boot_cpu_data.x86, \
					boot_cpu_data.x86_model

#else /* __ASSEMBLY__ */

.macro STATIC_CPU_HAS bitnum:req cap_byte:req feature:req t_yes:req t_no:req always:req
1:
	jmp 6f
2:
	.skip -(((5f-4f) - (2b-1b)) > 0) * ((5f-4f) - (2b-1b)),0x90
3:
	.section .altinstructions,"a"
	.long 1b - .		/* src offset */
	.long 4f - .		/* repl offset */
	.word \always		/* always replace */
	.byte 3b - 1b		/* src len */
	.byte 5f - 4f		/* repl len */
	.byte 3b - 2b		/* pad len */
	.previous
	.section .altinstr_replacement,"ax"
4:
	jmp \t_no
5:
	.previous
	.section .altinstructions,"a"
	.long 1b - .		/* src offset */
	.long 0			/* no replacement */
	.word \feature		/* feature bit */
	.byte 3b - 1b		/* src len */
	.byte 0			/* repl len */
	.byte 0			/* pad len */
	.previous
	.section .altinstr_aux,"ax"
6:
	testb \bitnum,\cap_byte
	jnz \t_yes
	jmp \t_no
	.previous
.endm

#endif /* __ASSEMBLY__ */

#endif /* __KERNEL__ */
#endif /* defined(__KERNEL__) && !defined(__ASSEMBLY__) */
#endif /* _ASM_X86_CPUFEATURE_H */
+0 −1
Original line number Diff line number Diff line
@@ -12,4 +12,3 @@
#include <asm/bug.h>
#include <asm/paravirt.h>
#include <asm/asm.h>
#include <asm/cpufeature.h>