lkml.org 
[lkml]   [2010]   [Jun]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:x86/alternatives] x86, alternatives: Use 16-bit numbers for cpufeature index
    Commit-ID:  f88731e3068f9d1392ba71cc9f50f035d26a0d4f
    Gitweb: http://git.kernel.org/tip/f88731e3068f9d1392ba71cc9f50f035d26a0d4f
    Author: H. Peter Anvin <hpa@linux.intel.com>
    AuthorDate: Wed, 9 Jun 2010 16:03:09 -0700
    Committer: H. Peter Anvin <hpa@linux.intel.com>
    CommitDate: Wed, 9 Jun 2010 16:03:09 -0700

    x86, alternatives: Use 16-bit numbers for cpufeature index

    We already have cpufeature indicies above 255, so use a 16-bit number
    for the alternatives index. This consumes a padding field and so
    doesn't add any size, but it means that abusing the padding field to
    create assembly errors on overflow no longer works. We can retain the
    test simply by redirecting it to the .discard section, however.

    Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
    LKML-Reference: <tip-*@git.kernel.org>
    ---
    arch/x86/include/asm/alternative.h | 7 ++++---
    arch/x86/include/asm/cpufeature.h | 10 ++++++----
    2 files changed, 10 insertions(+), 7 deletions(-)

    diff --git a/arch/x86/include/asm/alternative.h b/arch/x86/include/asm/alternative.h
    index 03b6bb5..bc6abb7 100644
    --- a/arch/x86/include/asm/alternative.h
    +++ b/arch/x86/include/asm/alternative.h
    @@ -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" \
    diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
    index 4681459..66878c5 100644
    --- a/arch/x86/include/asm/cpufeature.h
    +++ b/arch/x86/include/asm/cpufeature.h
    @@ -300,11 +300,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:
    @@ -318,10 +318,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"

    \
     
     \ /
      Last update: 2010-06-10 02:13    [W:0.042 / U:0.012 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site