<div dir="ltr"><div><br></div>    Here's a patch which uses cpuid to determine the number of packages and build the correct number of type 4s:<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></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Dec 6, 2013 at 1:22 PM, Bret Ketchum <span dir="ltr"><<a href="mailto:bcketchum@gmail.com" target="_blank">bcketchum@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div><br></div>    Looking at the 1.7.3 source it appears that smbios_setup creates a type 4 entry for each core rather than one per package/socket as would be typical of a bare metal bios.<br>
<br>
</div>    Is this behavior by design? Thanks in advance....<span class="HOEnZb"><font color="#888888"><br><br></font></span></div><span class="HOEnZb"><font color="#888888">    Bret<br></font></span></div>
</blockquote></div><br></div>