Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 66cd55d2 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'x86-alternatives-for-linus' of...

Merge branch 'x86-alternatives-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'x86-alternatives-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86, alternatives: BUG on encountering an invalid CPU feature number
  x86, alternatives: Fix one more open-coded 8-bit alternative number
  x86, alternatives: Use 16-bit numbers for cpufeature index
parents 75cb5fdc 3b770a21
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -45,10 +45,9 @@
struct alt_instr {
	u8 *instr;		/* original instruction */
	u8 *replacement;
	u8  cpuid;		/* cpuid bit set for replacement */
	u16 cpuid;		/* cpuid bit set for replacement */
	u8  instrlen;		/* length of original instruction */
	u8  replacementlen;	/* length of new instruction, <= instrlen */
	u8  pad1;
#ifdef CONFIG_X86_64
	u32 pad2;
#endif
@@ -86,9 +85,11 @@ static inline int alternatives_text_reserved(void *start, void *end)
      _ASM_ALIGN "\n"							\
      _ASM_PTR "661b\n"				/* label           */	\
      _ASM_PTR "663f\n"				/* new instruction */	\
      "	 .byte " __stringify(feature) "\n"	/* feature bit     */	\
      "	 .word " __stringify(feature) "\n"	/* feature bit     */	\
      "	 .byte 662b-661b\n"			/* sourcelen       */	\
      "	 .byte 664f-663f\n"			/* replacementlen  */	\
      ".previous\n"							\
      ".section .discard,\"aw\",@progbits\n"				\
      "	 .byte 0xff + (664f-663f) - (662b-661b)\n" /* rlen <= slen */	\
      ".previous\n"							\
      ".section .altinstr_replacement, \"ax\"\n"			\
+8 −6
Original line number Diff line number Diff line
@@ -302,7 +302,7 @@ extern const char * const x86_power_flags[32];
 * patch the target code for additional performance.
 *
 */
static __always_inline __pure bool __static_cpu_has(u8 bit)
static __always_inline __pure bool __static_cpu_has(u16 bit)
{
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
		asm goto("1: jmp %l[t_no]\n"
@@ -311,11 +311,11 @@ static __always_inline __pure bool __static_cpu_has(u8 bit)
			 _ASM_ALIGN "\n"
			 _ASM_PTR "1b\n"
			 _ASM_PTR "0\n" 	/* no replacement */
			 " .byte %P0\n"		/* feature bit */
			 " .word %P0\n"		/* feature bit */
			 " .byte 2b - 1b\n"	/* source len */
			 " .byte 0\n"		/* replacement len */
			 " .byte 0xff + 0 - (2b-1b)\n"	/* padding */
			 ".previous\n"
			 /* skipping size check since replacement size = 0 */
			 : : "i" (bit) : : t_no);
		return true;
	t_no:
@@ -329,10 +329,12 @@ static __always_inline __pure bool __static_cpu_has(u8 bit)
			     _ASM_ALIGN "\n"
			     _ASM_PTR "1b\n"
			     _ASM_PTR "3f\n"
			     " .byte %P1\n"		/* feature bit */
			     " .word %P1\n"		/* feature bit */
			     " .byte 2b - 1b\n"		/* source len */
			     " .byte 4f - 3f\n"		/* replacement len */
			     " .byte 0xff + (4f-3f) - (2b-1b)\n" /* padding */
			     ".previous\n"
			     ".section .discard,\"aw\",@progbits\n"
			     " .byte 0xff + (4f-3f) - (2b-1b)\n" /* size check */
			     ".previous\n"
			     ".section .altinstr_replacement,\"ax\"\n"
			     "3: movb $1,%0\n"
@@ -348,7 +350,7 @@ static __always_inline __pure bool __static_cpu_has(u8 bit)
(								\
	__builtin_constant_p(boot_cpu_has(bit)) ?		\
		boot_cpu_has(bit) :				\
	(__builtin_constant_p(bit) && !((bit) & ~0xff)) ?	\
	__builtin_constant_p(bit) ?				\
		__static_cpu_has(bit) :				\
		boot_cpu_has(bit)				\
)
+1 −0
Original line number Diff line number Diff line
@@ -214,6 +214,7 @@ void __init_or_module apply_alternatives(struct alt_instr *start,
		u8 *instr = a->instr;
		BUG_ON(a->replacementlen > a->instrlen);
		BUG_ON(a->instrlen > sizeof(insnbuf));
		BUG_ON(a->cpuid >= NCAPINTS*32);
		if (!boot_cpu_has(a->cpuid))
			continue;
#ifdef CONFIG_X86_64
+1 −1
Original line number Diff line number Diff line
@@ -913,7 +913,7 @@ ENTRY(simd_coprocessor_error)
	.balign 4
	.long 661b
	.long 663f
	.byte X86_FEATURE_XMM
	.word X86_FEATURE_XMM
	.byte 662b-661b
	.byte 664f-663f
.previous
+1 −1
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@ ENDPROC(clear_page)
	.align 8
	.quad clear_page
	.quad 1b
	.byte X86_FEATURE_REP_GOOD
	.word X86_FEATURE_REP_GOOD
	.byte .Lclear_page_end - clear_page
	.byte 2b - 1b
	.previous
Loading