<div dir="ltr">This patch uses cpuid to determine the number of packages/sockets in which to <br>generate the proper number of DMI/SMBIOS Type 4 (Processor Information)<br>records. <br><br>Use "dmidevcode -t 4" to show that only the configured number of <br>
packages/sockets are shown versus the number of CPUs (sockets*cores*threads).<br><br>Signed-off-by: Bret Ketchum <bcketchum at <a href="http://gmail.com">gmail.com</a>><br>---<br> src/fw/smbios.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++--<br>
 1 file changed, 48 insertions(+), 2 deletions(-)<br><br>diff --git a/src/fw/smbios.c b/src/fw/smbios.c<br>index affb9be..23869b1 100644<br>--- a/src/fw/smbios.c<br>+++ b/src/fw/smbios.c<br>@@ -505,6 +505,52 @@ smbios_init_type_127(void *start)<br>
 <br> #define TEMPSMBIOSSIZE (32 * 1024)<br> <br>+static inline void<br>+cpuid_count(u32 index, u32 sub, u32 *eax, u32 *ebx, u32 *ecx, u32 *edx)<br>+{<br>+    asm volatile("cpuid"<br>+                 : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)<br>
+                 :  "0" (index), "c" (sub));<br>+}<br>+<br>+static int package_count(void)<br>+{<br>+    char vendor[12];<br>+    int ret = CountCPUs;<br>+    u32 cpuid_features, cpuid_high, cpuid_procinfo, cpuid_signature;<br>
+    u32 eax, ebx, ecx, edx;<br>+<br>+    cpuid(0, &cpuid_high, &ebx, &ecx, &edx);<br>+    ((u32 *)&vendor)[0] = ebx;<br>+    ((u32 *)&vendor)[1] = edx;<br>+    ((u32 *)&vendor)[2] = ecx;<br>+<br>
+    cpuid(1, &cpuid_signature, &cpuid_procinfo, &ecx, &cpuid_features);<br>+<br>+    if (memcmp(vendor, "GenuineIntel", sizeof(vendor)) == 0) {<br>+        int logical =   (cpuid_features & 0x10000000) != 0<br>
+                        ? (cpuid_procinfo >> 16) & 0xff<br>+                        : 1;<br>+<br>+        cpuid_count(4, 0, &eax, &ebx, &ecx, &edx);<br>+<br>+        /* number of packages/sockets equals the number ACPI IDs <br>
+         * divided by the "Maximum number of addressable IDs for<br>+         * logical processors in this physical package.<br>+         */<br>+        ret = MaxCountCPUs / ((logical == 1) <br>+                              ? (((eax >> 26) & 0x3f) + 1)<br>
+                              : logical);<br>+<br>+    } else {<br>+        cpuid(0x80000008, &eax, &ebx, &ecx, &edx);<br>+<br>+        ret = ((cpuid_procinfo >> 16) & 0xff) / ((ecx & 0xff) + 1);<br>
+    }<br>+<br>+    return(ret);<br>+}<br>+<br> void<br> smbios_setup(void)<br> {<br>@@ -538,8 +584,8 @@ smbios_setup(void)<br>     add_struct(1, p);<br>     add_struct(3, p);<br> <br>-    int cpu_num;<br>-    for (cpu_num = 1; cpu_num <= MaxCountCPUs; cpu_num++)<br>
+    int cpu_num, pkg_count = package_count();<br>+    for (cpu_num = 1; cpu_num <= pkg_count; cpu_num++)<br>         add_struct(4, p, cpu_num);<br> <br>     int ram_mb = (RamSize + RamSizeOver4G) >> 20;<br>-- <br>
1.8.3.1<br><br></div>