x86: Don't use potentially incorrect CPUID values for topology information
authorJan H. Schönherr <jschoenh@amazon.de>
Sun, 7 Jan 2018 20:28:20 +0000 (12:28 -0800)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Mon, 8 Jan 2018 10:48:24 +0000 (10:48 +0000)
Intel says for CPUID leaf 0Bh:

  "Software must not use EBX[15:0] to enumerate processor
   topology of the system. This value in this field
   (EBX[15:0]) is only intended for display/diagnostic
   purposes. The actual number of logical processors
   available to BIOS/OS/Applications may be different from
   the value of EBX[15:0], depending on software and platform
   hardware configurations."

And yet, we're using them to derive the number cores in a package
and the number of siblings in a core.

Derive the number of siblings and cores from EAX instead, which is
intended for that.

Signed-off-by: Jan H. Schönherr <jschoenh@amazon.de>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
xen/arch/x86/cpu/common.c

index e9588b3c0d1cb14330bef593397771b0b849fe6b..06e0eab13298492d985de8d4ad39417cc27cea70 100644 (file)
@@ -479,8 +479,8 @@ void detect_extended_topology(struct cpuinfo_x86 *c)
        initial_apicid = edx;
 
        /* Populate HT related information from sub-leaf level 0 */
-       core_level_siblings = c->x86_num_siblings = LEVEL_MAX_SIBLINGS(ebx);
        core_plus_mask_width = ht_mask_width = BITS_SHIFT_NEXT_LEVEL(eax);
+       core_level_siblings = c->x86_num_siblings = 1u << ht_mask_width;
 
        sub_index = 1;
        do {
@@ -488,8 +488,8 @@ void detect_extended_topology(struct cpuinfo_x86 *c)
 
                /* Check for the Core type in the implemented sub leaves */
                if ( LEAFB_SUBTYPE(ecx) == CORE_TYPE ) {
-                       core_level_siblings = LEVEL_MAX_SIBLINGS(ebx);
                        core_plus_mask_width = BITS_SHIFT_NEXT_LEVEL(eax);
+                       core_level_siblings = 1u << core_plus_mask_width;
                        break;
                }