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
This commit is contained in:
Коммит
66cd55d2b9
|
@ -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)
|
||||||
_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];
|
||||||
* 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)
|
||||||
_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)
|
||||||
_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)
|
||||||
( \
|
( \
|
||||||
__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,
|
||||||
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)
|
||||||
.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)
|
||||||
.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)
|
||||||
.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 @@
|
||||||
.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)
|
||||||
.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)
|
||||||
.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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче