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

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
...@@ -45,10 +45,9 @@ ...@@ -45,10 +45,9 @@
struct alt_instr { struct alt_instr {
u8 *instr; /* original instruction */ u8 *instr; /* original instruction */
u8 *replacement; u8 *replacement;
u8 cpuid; /* cpuid bit set for replacement */ u16 cpuid; /* cpuid bit set for replacement */
u8 instrlen; /* length of original instruction */ u8 instrlen; /* length of original instruction */
u8 replacementlen; /* length of new instruction, <= instrlen */ u8 replacementlen; /* length of new instruction, <= instrlen */
u8 pad1;
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
u32 pad2; u32 pad2;
#endif #endif
...@@ -86,9 +85,11 @@ static inline int alternatives_text_reserved(void *start, void *end) ...@@ -86,9 +85,11 @@ static inline int alternatives_text_reserved(void *start, void *end)
_ASM_ALIGN "\n" \ _ASM_ALIGN "\n" \
_ASM_PTR "661b\n" /* label */ \ _ASM_PTR "661b\n" /* label */ \
_ASM_PTR "663f\n" /* new instruction */ \ _ASM_PTR "663f\n" /* new instruction */ \
" .byte " __stringify(feature) "\n" /* feature bit */ \ " .word " __stringify(feature) "\n" /* feature bit */ \
" .byte 662b-661b\n" /* sourcelen */ \ " .byte 662b-661b\n" /* sourcelen */ \
" .byte 664f-663f\n" /* replacementlen */ \ " .byte 664f-663f\n" /* replacementlen */ \
".previous\n" \
".section .discard,\"aw\",@progbits\n" \
" .byte 0xff + (664f-663f) - (662b-661b)\n" /* rlen <= slen */ \ " .byte 0xff + (664f-663f) - (662b-661b)\n" /* rlen <= slen */ \
".previous\n" \ ".previous\n" \
".section .altinstr_replacement, \"ax\"\n" \ ".section .altinstr_replacement, \"ax\"\n" \
......
...@@ -302,7 +302,7 @@ extern const char * const x86_power_flags[32]; ...@@ -302,7 +302,7 @@ extern const char * const x86_power_flags[32];
* patch the target code for additional performance. * 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) #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
asm goto("1: jmp %l[t_no]\n" asm goto("1: jmp %l[t_no]\n"
...@@ -311,11 +311,11 @@ static __always_inline __pure bool __static_cpu_has(u8 bit) ...@@ -311,11 +311,11 @@ static __always_inline __pure bool __static_cpu_has(u8 bit)
_ASM_ALIGN "\n" _ASM_ALIGN "\n"
_ASM_PTR "1b\n" _ASM_PTR "1b\n"
_ASM_PTR "0\n" /* no replacement */ _ASM_PTR "0\n" /* no replacement */
" .byte %P0\n" /* feature bit */ " .word %P0\n" /* feature bit */
" .byte 2b - 1b\n" /* source len */ " .byte 2b - 1b\n" /* source len */
" .byte 0\n" /* replacement len */ " .byte 0\n" /* replacement len */
" .byte 0xff + 0 - (2b-1b)\n" /* padding */
".previous\n" ".previous\n"
/* skipping size check since replacement size = 0 */
: : "i" (bit) : : t_no); : : "i" (bit) : : t_no);
return true; return true;
t_no: t_no:
...@@ -329,10 +329,12 @@ static __always_inline __pure bool __static_cpu_has(u8 bit) ...@@ -329,10 +329,12 @@ static __always_inline __pure bool __static_cpu_has(u8 bit)
_ASM_ALIGN "\n" _ASM_ALIGN "\n"
_ASM_PTR "1b\n" _ASM_PTR "1b\n"
_ASM_PTR "3f\n" _ASM_PTR "3f\n"
" .byte %P1\n" /* feature bit */ " .word %P1\n" /* feature bit */
" .byte 2b - 1b\n" /* source len */ " .byte 2b - 1b\n" /* source len */
" .byte 4f - 3f\n" /* replacement 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" ".previous\n"
".section .altinstr_replacement,\"ax\"\n" ".section .altinstr_replacement,\"ax\"\n"
"3: movb $1,%0\n" "3: movb $1,%0\n"
...@@ -348,7 +350,7 @@ static __always_inline __pure bool __static_cpu_has(u8 bit) ...@@ -348,7 +350,7 @@ static __always_inline __pure bool __static_cpu_has(u8 bit)
( \ ( \
__builtin_constant_p(boot_cpu_has(bit)) ? \ __builtin_constant_p(boot_cpu_has(bit)) ? \
boot_cpu_has(bit) : \ boot_cpu_has(bit) : \
(__builtin_constant_p(bit) && !((bit) & ~0xff)) ? \ __builtin_constant_p(bit) ? \
__static_cpu_has(bit) : \ __static_cpu_has(bit) : \
boot_cpu_has(bit) \ boot_cpu_has(bit) \
) )
......
...@@ -214,6 +214,7 @@ void __init_or_module apply_alternatives(struct alt_instr *start, ...@@ -214,6 +214,7 @@ void __init_or_module apply_alternatives(struct alt_instr *start,
u8 *instr = a->instr; u8 *instr = a->instr;
BUG_ON(a->replacementlen > a->instrlen); BUG_ON(a->replacementlen > a->instrlen);
BUG_ON(a->instrlen > sizeof(insnbuf)); BUG_ON(a->instrlen > sizeof(insnbuf));
BUG_ON(a->cpuid >= NCAPINTS*32);
if (!boot_cpu_has(a->cpuid)) if (!boot_cpu_has(a->cpuid))
continue; continue;
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
......
...@@ -913,7 +913,7 @@ ENTRY(simd_coprocessor_error) ...@@ -913,7 +913,7 @@ ENTRY(simd_coprocessor_error)
.balign 4 .balign 4
.long 661b .long 661b
.long 663f .long 663f
.byte X86_FEATURE_XMM .word X86_FEATURE_XMM
.byte 662b-661b .byte 662b-661b
.byte 664f-663f .byte 664f-663f
.previous .previous
......
...@@ -52,7 +52,7 @@ ENDPROC(clear_page) ...@@ -52,7 +52,7 @@ ENDPROC(clear_page)
.align 8 .align 8
.quad clear_page .quad clear_page
.quad 1b .quad 1b
.byte X86_FEATURE_REP_GOOD .word X86_FEATURE_REP_GOOD
.byte .Lclear_page_end - clear_page .byte .Lclear_page_end - clear_page
.byte 2b - 1b .byte 2b - 1b
.previous .previous
...@@ -113,7 +113,7 @@ ENDPROC(copy_page) ...@@ -113,7 +113,7 @@ ENDPROC(copy_page)
.align 8 .align 8
.quad copy_page .quad copy_page
.quad 1b .quad 1b
.byte X86_FEATURE_REP_GOOD .word X86_FEATURE_REP_GOOD
.byte .Lcopy_page_end - copy_page .byte .Lcopy_page_end - copy_page
.byte 2b - 1b .byte 2b - 1b
.previous .previous
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
.align 8 .align 8
.quad 0b .quad 0b
.quad 2b .quad 2b
.byte \feature /* when feature is set */ .word \feature /* when feature is set */
.byte 5 .byte 5
.byte 5 .byte 5
.previous .previous
......
...@@ -131,7 +131,7 @@ ENDPROC(__memcpy) ...@@ -131,7 +131,7 @@ ENDPROC(__memcpy)
.align 8 .align 8
.quad memcpy .quad memcpy
.quad .Lmemcpy_c .quad .Lmemcpy_c
.byte X86_FEATURE_REP_GOOD .word X86_FEATURE_REP_GOOD
/* /*
* Replace only beginning, memcpy is used to apply alternatives, * Replace only beginning, memcpy is used to apply alternatives,
......
...@@ -121,7 +121,7 @@ ENDPROC(__memset) ...@@ -121,7 +121,7 @@ ENDPROC(__memset)
.align 8 .align 8
.quad memset .quad memset
.quad .Lmemset_c .quad .Lmemset_c
.byte X86_FEATURE_REP_GOOD .word X86_FEATURE_REP_GOOD
.byte .Lfinal - memset .byte .Lfinal - memset
.byte .Lmemset_e - .Lmemset_c .byte .Lmemset_e - .Lmemset_c
.previous .previous
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment