[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v2 3/3] xen/x86: Cleanup of early cpuid handling



Use register names for variables, rather than their content for leaf 1.
Reduce the number of cpuid instructions issued.  Also drop some trailing
whitespace.

No functional change.

Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Jan Beulich <JBeulich@xxxxxxxx>

v2: Record the correct registers for the 0x80000001 feature leaves
---
 xen/arch/x86/cpu/common.c | 68 +++++++++++++++++++++++------------------------
 1 file changed, 33 insertions(+), 35 deletions(-)

diff --git a/xen/arch/x86/cpu/common.c b/xen/arch/x86/cpu/common.c
index ac8a258..a111ed6 100644
--- a/xen/arch/x86/cpu/common.c
+++ b/xen/arch/x86/cpu/common.c
@@ -180,7 +180,7 @@ static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb)
 static void __init early_cpu_detect(void)
 {
        struct cpuinfo_x86 *c = &boot_cpu_data;
-       u32 cap4, tfms, cap0, misc;
+       u32 eax, ebx, ecx, edx;
 
        c->x86_cache_alignment = 32;
 
@@ -192,21 +192,21 @@ static void __init early_cpu_detect(void)
 
        c->x86_vendor = get_cpu_vendor(c->x86_vendor_id, gcv_host_early);
 
-       cpuid(0x00000001, &tfms, &misc, &cap4, &cap0);
-       c->x86 = (tfms >> 8) & 15;
-       c->x86_model = (tfms >> 4) & 15;
+       cpuid(0x00000001, &eax, &ebx, &ecx, &edx);
+       c->x86 = (eax >> 8) & 15;
+       c->x86_model = (eax >> 4) & 15;
        if (c->x86 == 0xf)
-               c->x86 += (tfms >> 20) & 0xff;
+               c->x86 += (eax >> 20) & 0xff;
        if (c->x86 >= 0x6)
-               c->x86_model += ((tfms >> 16) & 0xF) << 4;
-       c->x86_mask = tfms & 15;
-       cap0 &= ~cleared_caps[cpufeat_word(X86_FEATURE_FPU)];
-       cap4 &= ~cleared_caps[cpufeat_word(X86_FEATURE_XMM3)];
-       if (cap0 & cpufeat_mask(X86_FEATURE_CLFLSH))
-               c->x86_cache_alignment = ((misc >> 8) & 0xff) * 8;
+               c->x86_model += ((eax >> 16) & 0xF) << 4;
+       c->x86_mask = eax & 15;
+       edx &= ~cleared_caps[cpufeat_word(X86_FEATURE_FPU)];
+       ecx &= ~cleared_caps[cpufeat_word(X86_FEATURE_XMM3)];
+       if (edx & cpufeat_mask(X86_FEATURE_CLFLSH))
+               c->x86_cache_alignment = ((ebx >> 8) & 0xff) * 8;
        /* Leaf 0x1 capabilities filled in early for Xen. */
-       c->x86_capability[cpufeat_word(X86_FEATURE_FPU)] = cap0;
-       c->x86_capability[cpufeat_word(X86_FEATURE_XMM3)] = cap4;
+       c->x86_capability[cpufeat_word(X86_FEATURE_FPU)] = edx;
+       c->x86_capability[cpufeat_word(X86_FEATURE_XMM3)] = ecx;
 
        if ( cpuid_eax(0x80000000) >= 0x80000008 )
                paddr_bits = cpuid_eax(0x80000008) & 0xff;
@@ -214,29 +214,29 @@ static void __init early_cpu_detect(void)
 
 static void __cpuinit generic_identify(struct cpuinfo_x86 *c)
 {
-       u32 tfms, capability, excap, ebx;
+       u32 eax, ebx, ecx, edx, tmp;
 
        /* Get vendor name */
        cpuid(0x00000000, &c->cpuid_level,
              (int *)&c->x86_vendor_id[0],
              (int *)&c->x86_vendor_id[8],
              (int *)&c->x86_vendor_id[4]);
-               
+
        c->x86_vendor = get_cpu_vendor(c->x86_vendor_id, gcv_host_late);
        /* Initialize the standard set of capabilities */
        /* Note that the vendor-specific code below might override */
-       
+
        /* Intel-defined flags: level 0x00000001 */
-       cpuid(0x00000001, &tfms, &ebx, &excap, &capability);
-       c->x86_capability[cpufeat_word(X86_FEATURE_FPU)] = capability;
-       c->x86_capability[cpufeat_word(X86_FEATURE_XMM3)] = excap;
-       c->x86 = (tfms >> 8) & 15;
-       c->x86_model = (tfms >> 4) & 15;
+       cpuid(0x00000001, &eax, &ebx, &ecx, &edx);
+       c->x86_capability[cpufeat_word(X86_FEATURE_FPU)] = edx;
+       c->x86_capability[cpufeat_word(X86_FEATURE_XMM3)] = ecx;
+       c->x86 = (eax >> 8) & 15;
+       c->x86_model = (eax >> 4) & 15;
        if (c->x86 == 0xf)
-               c->x86 += (tfms >> 20) & 0xff;
+               c->x86 += (eax >> 20) & 0xff;
        if (c->x86 >= 0x6)
-               c->x86_model += ((tfms >> 16) & 0xF) << 4;
-       c->x86_mask = tfms & 15;
+               c->x86_model += ((eax >> 16) & 0xF) << 4;
+       c->x86_mask = eax & 15;
        c->apicid = phys_pkg_id((ebx >> 24) & 0xFF, 0);
        c->phys_proc_id = c->apicid;
        if ( cpu_has(c, X86_FEATURE_CLFLSH) )
@@ -249,12 +249,11 @@ static void __cpuinit generic_identify(struct cpuinfo_x86 
*c)
        /* AMD-defined flags: level 0x80000001 */
        c->extended_cpuid_level = cpuid_eax(0x80000000);
        if ( (c->extended_cpuid_level & 0xffff0000) == 0x80000000 ) {
-               if ( c->extended_cpuid_level >= 0x80000001 ) {
-                       c->x86_capability[cpufeat_word(X86_FEATURE_SYSCALL)]
-                               = cpuid_edx(0x80000001);
-                       c->x86_capability[cpufeat_word(X86_FEATURE_LAHF_LM)]
-                               = cpuid_ecx(0x80000001);
-               }
+               if ( c->extended_cpuid_level >= 0x80000001 )
+                       cpuid(0x80000001, &tmp, &tmp,
+                             
&c->x86_capability[cpufeat_word(X86_FEATURE_LAHF_LM)],
+                             
&c->x86_capability[cpufeat_word(X86_FEATURE_SYSCALL)]);
+
                if ( c->extended_cpuid_level >= 0x80000004 )
                        get_model_name(c); /* Default name */
        }
@@ -263,11 +262,10 @@ static void __cpuinit generic_identify(struct cpuinfo_x86 
*c)
        early_intel_workaround(c);
 
        /* Intel-defined flags: level 0x00000007 */
-       if ( c->cpuid_level >= 0x00000007 ) {
-               u32 dummy;
-               cpuid_count(0x00000007, 0, &dummy, &ebx, &dummy, &dummy);
-               c->x86_capability[cpufeat_word(X86_FEATURE_FSGSBASE)] = ebx;
-       }
+       if ( c->cpuid_level >= 0x00000007 )
+               cpuid_count(0x00000007, 0, &tmp,
+                           
&c->x86_capability[cpufeat_word(X86_FEATURE_FSGSBASE)],
+                           &tmp, &tmp);
 }
 
 /*
-- 
2.1.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.