- Use cpu_exthigh instead of executing cpuid again to retrieve it for the
print_AMD_foo() functions. - Add a brand name table for the brand index provided on Intel CPU's in %ebx after cpuid 1. - For Intel CPUs, if we don't get a processor name from the extended cpuid then use the brand index in cpuid_cpuinfo to pick a name from the brand table and copy that name into cpu_brand. - Replace the duplicated code to use the extended cpuid to replace cpu_model with the processor name in the AMD and Transmeta sections of printcpuinfo() with generic code that replaces cpu_model with cpu_brand if cpu_brand is not an empty string. We also trim leading spaces from cpu_brand prior to doing this since at least some processor names (notably those of Intel CPUs) have leading spaces in the name. - Give print_AMD_features() its own private regs[] array since printcpuinfo() doesn't use the one it has anymore.
This commit is contained in:
parent
26aa6d02bf
commit
5b1e7cb257
@ -77,9 +77,9 @@ void panicifcpuunsupported(void);
|
||||
|
||||
static void identifycyrix(void);
|
||||
#if defined(I486_CPU) || defined(I586_CPU) || defined(I686_CPU)
|
||||
static void print_AMD_features(u_int *regs);
|
||||
static void print_AMD_features(void);
|
||||
#endif
|
||||
static void print_AMD_info(u_int amd_maxregs);
|
||||
static void print_AMD_info(void);
|
||||
static void print_AMD_assoc(int i);
|
||||
static void print_transmeta_info(void);
|
||||
static void setup_tmx86_longrun(void);
|
||||
@ -94,6 +94,20 @@ static char cpu_model[128];
|
||||
SYSCTL_STRING(_hw, HW_MODEL, model, CTLFLAG_RD,
|
||||
cpu_model, 0, "Machine model");
|
||||
|
||||
#define MAX_BRAND_INDEX 8
|
||||
|
||||
static const char *cpu_brandtable[MAX_BRAND_INDEX + 1] = {
|
||||
NULL, /* No brand */
|
||||
"Intel Celeron",
|
||||
"Intel Pentium III",
|
||||
"Intel Pentium III Xeon",
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
"Intel Pentium 4"
|
||||
};
|
||||
|
||||
static struct cpu_nameclass i386_cpus[] = {
|
||||
{ "Intel 80286", CPUCLASS_286 }, /* CPU_286 */
|
||||
{ "i386SX", CPUCLASS_386 }, /* CPU_386SX */
|
||||
@ -121,10 +135,8 @@ int has_f00f_bug = 0; /* Initialized so that it can be patched. */
|
||||
void
|
||||
printcpuinfo(void)
|
||||
{
|
||||
#if defined(I486_CPU) || defined(I586_CPU) || defined(I686_CPU)
|
||||
u_int regs[4];
|
||||
#endif
|
||||
u_int nreg = 0;
|
||||
char *brand;
|
||||
|
||||
cpu_class = i386_cpus[cpu].cpu_class;
|
||||
printf("CPU: ");
|
||||
strncpy(cpu_model, i386_cpus[cpu].cpu_name, sizeof cpu_model);
|
||||
@ -132,6 +144,8 @@ printcpuinfo(void)
|
||||
#if defined(I486_CPU) || defined(I586_CPU) || defined(I686_CPU)
|
||||
if (strcmp(cpu_vendor,"GenuineIntel") == 0) {
|
||||
if ((cpu_id & 0xf00) > 0x300) {
|
||||
u_int brand_index;
|
||||
|
||||
cpu_model[0] = '\0';
|
||||
|
||||
switch (cpu_id & 0x3000) {
|
||||
@ -249,6 +263,17 @@ printcpuinfo(void)
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we didn't get a brand name from the extended
|
||||
* CPUID, try to look it up in the brand table.
|
||||
*/
|
||||
if (cpu_high > 0 && *cpu_brand == '\0') {
|
||||
brand_index = cpuid_cpuinfo & CPUID_BRAND_INDEX;
|
||||
if (brand_index <= MAX_BRAND_INDEX &&
|
||||
cpu_brandtable[brand_index] != NULL)
|
||||
strcpy(cpu_brand,
|
||||
cpu_brandtable[brand_index]);
|
||||
}
|
||||
}
|
||||
} else if (strcmp(cpu_vendor,"AuthenticAMD") == 0) {
|
||||
/*
|
||||
@ -322,16 +347,6 @@ printcpuinfo(void)
|
||||
enable_K6_wt_alloc();
|
||||
}
|
||||
#endif
|
||||
do_cpuid(0x80000000, regs);
|
||||
nreg = regs[0];
|
||||
if (nreg >= 0x80000004) {
|
||||
do_cpuid(0x80000002, regs);
|
||||
memcpy(cpu_model, regs, sizeof regs);
|
||||
do_cpuid(0x80000003, regs);
|
||||
memcpy(cpu_model+16, regs, sizeof regs);
|
||||
do_cpuid(0x80000004, regs);
|
||||
memcpy(cpu_model+32, regs, sizeof regs);
|
||||
}
|
||||
} else if (strcmp(cpu_vendor,"CyrixInstead") == 0) {
|
||||
strcpy(cpu_model, "Cyrix ");
|
||||
switch (cpu_id & 0xff0) {
|
||||
@ -493,20 +508,18 @@ printcpuinfo(void)
|
||||
}
|
||||
} else if (strcmp(cpu_vendor, "IBM") == 0) {
|
||||
strcpy(cpu_model, "Blue Lightning CPU");
|
||||
} else if (strcmp(cpu_vendor, "GenuineTMx86") == 0 ||
|
||||
strcmp(cpu_vendor, "TransmetaCPU") == 0) {
|
||||
do_cpuid(0x80000000, regs);
|
||||
nreg = regs[0];
|
||||
if (nreg >= 0x80000004) {
|
||||
do_cpuid(0x80000002, regs);
|
||||
memcpy(cpu_model, regs, sizeof regs);
|
||||
do_cpuid(0x80000003, regs);
|
||||
memcpy(cpu_model+16, regs, sizeof regs);
|
||||
do_cpuid(0x80000004, regs);
|
||||
memcpy(cpu_model+32, regs, sizeof regs);
|
||||
}
|
||||
cpu_model[64] = '\0';
|
||||
}
|
||||
|
||||
/*
|
||||
* Replace cpu_model with cpu_brand minus leading spaces if
|
||||
* we have one.
|
||||
*/
|
||||
brand = cpu_brand;
|
||||
while (*brand == ' ')
|
||||
++brand;
|
||||
if (*brand != '\0')
|
||||
strcpy(cpu_model, brand);
|
||||
|
||||
#endif
|
||||
|
||||
printf("%s (", cpu_model);
|
||||
@ -615,8 +628,8 @@ printcpuinfo(void)
|
||||
(cpuid_cpuinfo & CPUID_HTT_CORES) >> 16);
|
||||
}
|
||||
if (strcmp(cpu_vendor, "AuthenticAMD") == 0 &&
|
||||
nreg >= 0x80000001)
|
||||
print_AMD_features(regs);
|
||||
cpu_exthigh >= 0x80000001)
|
||||
print_AMD_features();
|
||||
} else if (strcmp(cpu_vendor, "CyrixInstead") == 0) {
|
||||
printf(" DIR=0x%04x", cyrix_did);
|
||||
printf(" Stepping=%u", (cyrix_did & 0xf000) >> 12);
|
||||
@ -640,7 +653,7 @@ printcpuinfo(void)
|
||||
return;
|
||||
|
||||
if (strcmp(cpu_vendor, "AuthenticAMD") == 0)
|
||||
print_AMD_info(nreg);
|
||||
print_AMD_info();
|
||||
else if (strcmp(cpu_vendor, "GenuineTMx86") == 0 ||
|
||||
strcmp(cpu_vendor, "TransmetaCPU") == 0)
|
||||
print_transmeta_info();
|
||||
@ -937,11 +950,11 @@ print_AMD_assoc(int i)
|
||||
}
|
||||
|
||||
static void
|
||||
print_AMD_info(u_int amd_maxregs)
|
||||
print_AMD_info(void)
|
||||
{
|
||||
quad_t amd_whcr;
|
||||
|
||||
if (amd_maxregs >= 0x80000005) {
|
||||
if (cpu_exthigh >= 0x80000005) {
|
||||
u_int regs[4];
|
||||
|
||||
do_cpuid(0x80000005, regs);
|
||||
@ -957,7 +970,7 @@ print_AMD_info(u_int amd_maxregs)
|
||||
printf(", %d bytes/line", regs[3] & 0xff);
|
||||
printf(", %d lines/tag", (regs[3] >> 8) & 0xff);
|
||||
print_AMD_assoc((regs[3] >> 16) & 0xff);
|
||||
if (amd_maxregs >= 0x80000006) { /* K6-III only */
|
||||
if (cpu_exthigh >= 0x80000006) { /* K6-III only */
|
||||
do_cpuid(0x80000006, regs);
|
||||
printf("L2 internal cache: %d kbytes", regs[2] >> 16);
|
||||
printf(", %d bytes/line", regs[2] & 0xff);
|
||||
@ -998,8 +1011,10 @@ print_AMD_info(u_int amd_maxregs)
|
||||
|
||||
#if defined(I486_CPU) || defined(I586_CPU) || defined(I686_CPU)
|
||||
static void
|
||||
print_AMD_features(u_int *regs)
|
||||
print_AMD_features(void)
|
||||
{
|
||||
u_int regs[4];
|
||||
|
||||
/*
|
||||
* Values taken from AMD Processor Recognition
|
||||
* http://www.amd.com/products/cpg/athlon/techdocs/pdf/20734.pdf
|
||||
|
@ -77,9 +77,9 @@ void panicifcpuunsupported(void);
|
||||
|
||||
static void identifycyrix(void);
|
||||
#if defined(I486_CPU) || defined(I586_CPU) || defined(I686_CPU)
|
||||
static void print_AMD_features(u_int *regs);
|
||||
static void print_AMD_features(void);
|
||||
#endif
|
||||
static void print_AMD_info(u_int amd_maxregs);
|
||||
static void print_AMD_info(void);
|
||||
static void print_AMD_assoc(int i);
|
||||
static void print_transmeta_info(void);
|
||||
static void setup_tmx86_longrun(void);
|
||||
@ -94,6 +94,20 @@ static char cpu_model[128];
|
||||
SYSCTL_STRING(_hw, HW_MODEL, model, CTLFLAG_RD,
|
||||
cpu_model, 0, "Machine model");
|
||||
|
||||
#define MAX_BRAND_INDEX 8
|
||||
|
||||
static const char *cpu_brandtable[MAX_BRAND_INDEX + 1] = {
|
||||
NULL, /* No brand */
|
||||
"Intel Celeron",
|
||||
"Intel Pentium III",
|
||||
"Intel Pentium III Xeon",
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
"Intel Pentium 4"
|
||||
};
|
||||
|
||||
static struct cpu_nameclass i386_cpus[] = {
|
||||
{ "Intel 80286", CPUCLASS_286 }, /* CPU_286 */
|
||||
{ "i386SX", CPUCLASS_386 }, /* CPU_386SX */
|
||||
@ -121,10 +135,8 @@ int has_f00f_bug = 0; /* Initialized so that it can be patched. */
|
||||
void
|
||||
printcpuinfo(void)
|
||||
{
|
||||
#if defined(I486_CPU) || defined(I586_CPU) || defined(I686_CPU)
|
||||
u_int regs[4];
|
||||
#endif
|
||||
u_int nreg = 0;
|
||||
char *brand;
|
||||
|
||||
cpu_class = i386_cpus[cpu].cpu_class;
|
||||
printf("CPU: ");
|
||||
strncpy(cpu_model, i386_cpus[cpu].cpu_name, sizeof cpu_model);
|
||||
@ -132,6 +144,8 @@ printcpuinfo(void)
|
||||
#if defined(I486_CPU) || defined(I586_CPU) || defined(I686_CPU)
|
||||
if (strcmp(cpu_vendor,"GenuineIntel") == 0) {
|
||||
if ((cpu_id & 0xf00) > 0x300) {
|
||||
u_int brand_index;
|
||||
|
||||
cpu_model[0] = '\0';
|
||||
|
||||
switch (cpu_id & 0x3000) {
|
||||
@ -249,6 +263,17 @@ printcpuinfo(void)
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we didn't get a brand name from the extended
|
||||
* CPUID, try to look it up in the brand table.
|
||||
*/
|
||||
if (cpu_high > 0 && *cpu_brand == '\0') {
|
||||
brand_index = cpuid_cpuinfo & CPUID_BRAND_INDEX;
|
||||
if (brand_index <= MAX_BRAND_INDEX &&
|
||||
cpu_brandtable[brand_index] != NULL)
|
||||
strcpy(cpu_brand,
|
||||
cpu_brandtable[brand_index]);
|
||||
}
|
||||
}
|
||||
} else if (strcmp(cpu_vendor,"AuthenticAMD") == 0) {
|
||||
/*
|
||||
@ -322,16 +347,6 @@ printcpuinfo(void)
|
||||
enable_K6_wt_alloc();
|
||||
}
|
||||
#endif
|
||||
do_cpuid(0x80000000, regs);
|
||||
nreg = regs[0];
|
||||
if (nreg >= 0x80000004) {
|
||||
do_cpuid(0x80000002, regs);
|
||||
memcpy(cpu_model, regs, sizeof regs);
|
||||
do_cpuid(0x80000003, regs);
|
||||
memcpy(cpu_model+16, regs, sizeof regs);
|
||||
do_cpuid(0x80000004, regs);
|
||||
memcpy(cpu_model+32, regs, sizeof regs);
|
||||
}
|
||||
} else if (strcmp(cpu_vendor,"CyrixInstead") == 0) {
|
||||
strcpy(cpu_model, "Cyrix ");
|
||||
switch (cpu_id & 0xff0) {
|
||||
@ -493,20 +508,18 @@ printcpuinfo(void)
|
||||
}
|
||||
} else if (strcmp(cpu_vendor, "IBM") == 0) {
|
||||
strcpy(cpu_model, "Blue Lightning CPU");
|
||||
} else if (strcmp(cpu_vendor, "GenuineTMx86") == 0 ||
|
||||
strcmp(cpu_vendor, "TransmetaCPU") == 0) {
|
||||
do_cpuid(0x80000000, regs);
|
||||
nreg = regs[0];
|
||||
if (nreg >= 0x80000004) {
|
||||
do_cpuid(0x80000002, regs);
|
||||
memcpy(cpu_model, regs, sizeof regs);
|
||||
do_cpuid(0x80000003, regs);
|
||||
memcpy(cpu_model+16, regs, sizeof regs);
|
||||
do_cpuid(0x80000004, regs);
|
||||
memcpy(cpu_model+32, regs, sizeof regs);
|
||||
}
|
||||
cpu_model[64] = '\0';
|
||||
}
|
||||
|
||||
/*
|
||||
* Replace cpu_model with cpu_brand minus leading spaces if
|
||||
* we have one.
|
||||
*/
|
||||
brand = cpu_brand;
|
||||
while (*brand == ' ')
|
||||
++brand;
|
||||
if (*brand != '\0')
|
||||
strcpy(cpu_model, brand);
|
||||
|
||||
#endif
|
||||
|
||||
printf("%s (", cpu_model);
|
||||
@ -615,8 +628,8 @@ printcpuinfo(void)
|
||||
(cpuid_cpuinfo & CPUID_HTT_CORES) >> 16);
|
||||
}
|
||||
if (strcmp(cpu_vendor, "AuthenticAMD") == 0 &&
|
||||
nreg >= 0x80000001)
|
||||
print_AMD_features(regs);
|
||||
cpu_exthigh >= 0x80000001)
|
||||
print_AMD_features();
|
||||
} else if (strcmp(cpu_vendor, "CyrixInstead") == 0) {
|
||||
printf(" DIR=0x%04x", cyrix_did);
|
||||
printf(" Stepping=%u", (cyrix_did & 0xf000) >> 12);
|
||||
@ -640,7 +653,7 @@ printcpuinfo(void)
|
||||
return;
|
||||
|
||||
if (strcmp(cpu_vendor, "AuthenticAMD") == 0)
|
||||
print_AMD_info(nreg);
|
||||
print_AMD_info();
|
||||
else if (strcmp(cpu_vendor, "GenuineTMx86") == 0 ||
|
||||
strcmp(cpu_vendor, "TransmetaCPU") == 0)
|
||||
print_transmeta_info();
|
||||
@ -937,11 +950,11 @@ print_AMD_assoc(int i)
|
||||
}
|
||||
|
||||
static void
|
||||
print_AMD_info(u_int amd_maxregs)
|
||||
print_AMD_info(void)
|
||||
{
|
||||
quad_t amd_whcr;
|
||||
|
||||
if (amd_maxregs >= 0x80000005) {
|
||||
if (cpu_exthigh >= 0x80000005) {
|
||||
u_int regs[4];
|
||||
|
||||
do_cpuid(0x80000005, regs);
|
||||
@ -957,7 +970,7 @@ print_AMD_info(u_int amd_maxregs)
|
||||
printf(", %d bytes/line", regs[3] & 0xff);
|
||||
printf(", %d lines/tag", (regs[3] >> 8) & 0xff);
|
||||
print_AMD_assoc((regs[3] >> 16) & 0xff);
|
||||
if (amd_maxregs >= 0x80000006) { /* K6-III only */
|
||||
if (cpu_exthigh >= 0x80000006) { /* K6-III only */
|
||||
do_cpuid(0x80000006, regs);
|
||||
printf("L2 internal cache: %d kbytes", regs[2] >> 16);
|
||||
printf(", %d bytes/line", regs[2] & 0xff);
|
||||
@ -998,8 +1011,10 @@ print_AMD_info(u_int amd_maxregs)
|
||||
|
||||
#if defined(I486_CPU) || defined(I586_CPU) || defined(I686_CPU)
|
||||
static void
|
||||
print_AMD_features(u_int *regs)
|
||||
print_AMD_features(void)
|
||||
{
|
||||
u_int regs[4];
|
||||
|
||||
/*
|
||||
* Values taken from AMD Processor Recognition
|
||||
* http://www.amd.com/products/cpg/athlon/techdocs/pdf/20734.pdf
|
||||
|
Loading…
x
Reference in New Issue
Block a user