]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge branch 'x86-alternatives-for-linus' of git://git.kernel.org/pub/scm/linux/kerne...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 6 Aug 2010 23:24:17 +0000 (16:24 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 6 Aug 2010 23:24:17 +0000 (16:24 -0700)
* '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

1  2 
arch/x86/include/asm/cpufeature.h
arch/x86/kernel/entry_32.S

index 0b205b8a4308f6317d2ae2f00eb2ee2bb7dd2ec1,e8b88967de35ad8bdc5c9ef8f1d8aead2f7ef3f8..781a50b29a4917545e71c3e74bdcbbda7faa383d
@@@ -6,7 -6,7 +6,7 @@@
  
  #include <asm/required-features.h>
  
 -#define NCAPINTS            /* N 32-bit words worth of info */
 +#define NCAPINTS      10      /* N 32-bit words worth of info */
  
  /*
   * Note: If the comment begins with a quoted string, that string is used
@@@ -89,7 -89,7 +89,7 @@@
  #define X86_FEATURE_LFENCE_RDTSC (3*32+18) /* "" Lfence synchronizes RDTSC */
  #define X86_FEATURE_11AP      (3*32+19) /* "" Bad local APIC aka 11AP */
  #define X86_FEATURE_NOPL      (3*32+20) /* The NOPL (0F 1F) instructions */
 -#define X86_FEATURE_AMDC1E    (3*32+21) /* AMD C1E detected */
 +                                        /* 21 available, was AMD_C1E */
  #define X86_FEATURE_XTOPOLOGY (3*32+22) /* cpu topology enum extensions */
  #define X86_FEATURE_TSC_RELIABLE (3*32+23) /* TSC is known to be reliable */
  #define X86_FEATURE_NONSTOP_TSC       (3*32+24) /* TSC does not stop in C states */
  #define X86_FEATURE_XSAVE     (4*32+26) /* XSAVE/XRSTOR/XSETBV/XGETBV */
  #define X86_FEATURE_OSXSAVE   (4*32+27) /* "" XSAVE enabled in the OS */
  #define X86_FEATURE_AVX               (4*32+28) /* Advanced Vector Extensions */
 +#define X86_FEATURE_F16C      (4*32+29) /* 16-bit fp conversions */
 +#define X86_FEATURE_RDRND     (4*32+30) /* The RDRAND instruction */
  #define X86_FEATURE_HYPERVISOR        (4*32+31) /* Running on a hypervisor */
  
  /* VIA/Cyrix/Centaur-defined CPU features, CPUID level 0xC0000001, word 5 */
  
  /*
   * Auxiliary flags: Linux defined - For features scattered in various
 - * CPUID levels like 0x6, 0xA etc
 + * CPUID levels like 0x6, 0xA etc, word 7
   */
  #define X86_FEATURE_IDA               (7*32+ 0) /* Intel Dynamic Acceleration */
  #define X86_FEATURE_ARAT      (7*32+ 1) /* Always Running APIC Timer */
  #define X86_FEATURE_CPB               (7*32+ 2) /* AMD Core Performance Boost */
 +#define X86_FEATURE_EPB               (7*32+ 3) /* IA32_ENERGY_PERF_BIAS support */
 +#define X86_FEATURE_XSAVEOPT  (7*32+ 4) /* Optimized Xsave */
 +#define X86_FEATURE_PLN               (7*32+ 5) /* Intel Power Limit Notification */
 +#define X86_FEATURE_PTS               (7*32+ 6) /* Intel Package Thermal Status */
  
 -/* Virtualization flags: Linux defined */
 +/* Virtualization flags: Linux defined, word 8 */
  #define X86_FEATURE_TPR_SHADOW  (8*32+ 0) /* Intel TPR Shadow */
  #define X86_FEATURE_VNMI        (8*32+ 1) /* Intel Virtual NMI */
  #define X86_FEATURE_FLEXPRIORITY (8*32+ 2) /* Intel FlexPriority */
  #define X86_FEATURE_EPT         (8*32+ 3) /* Intel Extended Page Table */
  #define X86_FEATURE_VPID        (8*32+ 4) /* Intel Virtual Processor ID */
 -#define X86_FEATURE_NPT               (8*32+5)  /* AMD Nested Page Table support */
 -#define X86_FEATURE_LBRV      (8*32+6)  /* AMD LBR Virtualization support */
 -#define X86_FEATURE_SVML      (8*32+7)  /* "svm_lock" AMD SVM locking MSR */
 -#define X86_FEATURE_NRIPS     (8*32+8)  /* "nrip_save" AMD SVM next_rip save */
 +#define X86_FEATURE_NPT               (8*32+ 5) /* AMD Nested Page Table support */
 +#define X86_FEATURE_LBRV      (8*32+ 6) /* AMD LBR Virtualization support */
 +#define X86_FEATURE_SVML      (8*32+ 7) /* "svm_lock" AMD SVM locking MSR */
 +#define X86_FEATURE_NRIPS     (8*32+ 8) /* "nrip_save" AMD SVM next_rip save */
 +
 +/* Intel-defined CPU features, CPUID level 0x00000007:0 (ebx), word 9 */
 +#define X86_FEATURE_FSGSBASE  (9*32+ 0) /* {RD/WR}{FS/GS}BASE instructions*/
  
  #if defined(__KERNEL__) && !defined(__ASSEMBLY__)
  
@@@ -203,9 -194,7 +203,9 @@@ extern const char * const x86_power_fla
           (((bit)>>5)==4 && (1UL<<((bit)&31) & REQUIRED_MASK4)) ||     \
           (((bit)>>5)==5 && (1UL<<((bit)&31) & REQUIRED_MASK5)) ||     \
           (((bit)>>5)==6 && (1UL<<((bit)&31) & REQUIRED_MASK6)) ||     \
 -         (((bit)>>5)==7 && (1UL<<((bit)&31) & REQUIRED_MASK7)) )      \
 +         (((bit)>>5)==7 && (1UL<<((bit)&31) & REQUIRED_MASK7)) ||     \
 +         (((bit)>>5)==8 && (1UL<<((bit)&31) & REQUIRED_MASK8)) ||     \
 +         (((bit)>>5)==9 && (1UL<<((bit)&31) & REQUIRED_MASK9)) )      \
          ? 1 :                                                         \
         test_cpu_cap(c, bit))
  
   * 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"
                         _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:
                             _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"
  (                                                             \
        __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)                               \
  )
index 258e93fa26304d08fddcc5f9b75f5ff0757eafba,7862cf510ea94ae8b0340bca4de9b7961eae5088..227d00920d2f8eaa1d90340ced0261ffe0a8f859
@@@ -611,14 -611,14 +611,14 @@@ ldt_ss
   * compensating for the offset by changing to the ESPFIX segment with
   * a base address that matches for the difference.
   */
 +#define GDT_ESPFIX_SS PER_CPU_VAR(gdt_page) + (GDT_ENTRY_ESPFIX_SS * 8)
        mov %esp, %edx                  /* load kernel esp */
        mov PT_OLDESP(%esp), %eax       /* load userspace esp */
        mov %dx, %ax                    /* eax: new kernel esp */
        sub %eax, %edx                  /* offset (low word is 0) */
 -      PER_CPU(gdt_page, %ebx)
        shr $16, %edx
 -      mov %dl, GDT_ENTRY_ESPFIX_SS * 8 + 4(%ebx) /* bits 16..23 */
 -      mov %dh, GDT_ENTRY_ESPFIX_SS * 8 + 7(%ebx) /* bits 24..31 */
 +      mov %dl, GDT_ESPFIX_SS + 4 /* bits 16..23 */
 +      mov %dh, GDT_ESPFIX_SS + 7 /* bits 24..31 */
        pushl $__ESPFIX_SS
        CFI_ADJUST_CFA_OFFSET 4
        push %eax                       /* new kernel esp */
@@@ -791,8 -791,9 +791,8 @@@ ptregs_clone
   * normal stack and adjusts ESP with the matching offset.
   */
        /* fixup the stack */
 -      PER_CPU(gdt_page, %ebx)
 -      mov GDT_ENTRY_ESPFIX_SS * 8 + 4(%ebx), %al /* bits 16..23 */
 -      mov GDT_ENTRY_ESPFIX_SS * 8 + 7(%ebx), %ah /* bits 24..31 */
 +      mov GDT_ESPFIX_SS + 4, %al /* bits 16..23 */
 +      mov GDT_ESPFIX_SS + 7, %ah /* bits 24..31 */
        shl $16, %eax
        addl %esp, %eax                 /* the adjusted stack pointer */
        pushl $__KERNEL_DS
@@@ -913,7 -914,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
@@@ -1165,9 -1166,6 +1165,9 @@@ ENTRY(xen_failsafe_callback
  .previous
  ENDPROC(xen_failsafe_callback)
  
 +BUILD_INTERRUPT3(xen_hvm_callback_vector, XEN_HVM_EVTCHN_CALLBACK,
 +              xen_evtchn_do_upcall)
 +
  #endif        /* CONFIG_XEN */
  
  #ifdef CONFIG_FUNCTION_TRACER