static int smbios_write_type4(unsigned long *current, int handle) { struct cpuid_result res; struct smbios_type4 *t = (struct smbios_type4 *)*current; int len = sizeof(struct smbios_type4); /* Provide sane defaults even for CPU without CPUID */ res.eax = res.edx = 0; res.ebx = 0x10000; if (cpu_have_cpuid()) { res = cpuid(1); } memset(t, 0, sizeof(struct smbios_type4)); t->type = SMBIOS_PROCESSOR_INFORMATION; t->handle = handle; t->length = len - 2; t->processor_id[0] = res.eax; t->processor_id[1] = res.edx; t->processor_manufacturer = smbios_cpu_vendor(t->eos); t->processor_version = smbios_processor_name(t->eos); t->processor_family = (res.eax > 0) ? 0x0c : 0x6; t->processor_type = 3; /* System Processor */ t->processor_upgrade = 0x06; t->core_count = (res.ebx >> 16) & 0xff; t->l1_cache_handle = 0xffff; t->l2_cache_handle = 0xffff; t->l3_cache_handle = 0xffff; t->processor_upgrade = 1; len = t->length + smbios_string_table_len(t->eos); *current += len; return len; }
static int smbios_cpu_vendor(u8 *start) { if (cpu_have_cpuid()) { u32 tmp[4]; const struct cpuid_result res = cpuid(0); tmp[0] = res.ebx; tmp[1] = res.edx; tmp[2] = res.ecx; tmp[3] = 0; return smbios_add_string(start, (const char *)tmp); } else { return smbios_add_string(start, "Unknown"); } }
static int smbios_cpu_vendor(char *start) { char tmp[13] = "Unknown"; u32 *_tmp = (u32 *)tmp; struct cpuid_result res; if (cpu_have_cpuid()) { res = cpuid(0); _tmp[0] = res.ebx; _tmp[1] = res.edx; _tmp[2] = res.ecx; tmp[12] = '\0'; } return smbios_add_string(start, tmp); }
static int smbios_processor_name(char *start) { char tmp[49] = "Unknown Processor Name"; u32 *_tmp = (u32 *)tmp; struct cpuid_result res; int i; if (cpu_have_cpuid()) { res = cpuid(0x80000000); if (res.eax >= 0x80000004) { for (i = 0; i < 3; i++) { res = cpuid(0x80000002 + i); _tmp[i * 4 + 0] = res.eax; _tmp[i * 4 + 1] = res.ebx; _tmp[i * 4 + 2] = res.ecx; _tmp[i * 4 + 3] = res.edx; } tmp[48] = 0; } } return smbios_add_string(start, tmp); }
static int smbios_processor_name(u8 *start) { u32 tmp[13]; const char *str = "Unknown Processor Name"; if (cpu_have_cpuid()) { int i; struct cpuid_result res = cpuid(0x80000000); if (res.eax >= 0x80000004) { int j = 0; for (i = 0; i < 3; i++) { res = cpuid(0x80000002 + i); tmp[j++] = res.eax; tmp[j++] = res.ebx; tmp[j++] = res.ecx; tmp[j++] = res.edx; } tmp[12] = 0; str = (const char *)tmp; } } return smbios_add_string(start, str); }