diff options
author | phk <phk@FreeBSD.org> | 1997-09-20 13:18:48 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 1997-09-20 13:18:48 +0000 |
commit | e01112caaec58eafdf7c0d9d26ccccf46de737b3 (patch) | |
tree | bffcaefea93197ec946224926b7c5c4b8b1b8d60 /sys/amd64 | |
parent | ad28c59277051c90fe57dbe74684b0e95ab16c0d (diff) | |
download | FreeBSD-src-e01112caaec58eafdf7c0d9d26ccccf46de737b3.zip FreeBSD-src-e01112caaec58eafdf7c0d9d26ccccf46de737b3.tar.gz |
For AMD chips, pick up the long description from the chip if
possible. (This is not really a typographical improvement in the
case of the K6 it seems, but AMD appearantly want it too look
that way). Also if bootverbose, dump some more info about the
chip.
Diffstat (limited to 'sys/amd64')
-rw-r--r-- | sys/amd64/amd64/identcpu.c | 72 |
1 files changed, 71 insertions, 1 deletions
diff --git a/sys/amd64/amd64/identcpu.c b/sys/amd64/amd64/identcpu.c index d0bc035..ddb8d5c 100644 --- a/sys/amd64/amd64/identcpu.c +++ b/sys/amd64/amd64/identcpu.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * from: Id: machdep.c,v 1.193 1996/06/18 01:22:04 bde Exp - * $Id: identcpu.c,v 1.26 1997/07/20 08:37:18 bde Exp $ + * $Id: identcpu.c,v 1.27 1997/07/24 14:19:23 kato Exp $ */ #include "opt_cpu.h" @@ -62,6 +62,9 @@ void finishidentcpu(void); void earlysetcpuclass(void); void panicifcpuunsupported(void); static void identifycyrix(void); +static void print_AMD_info(void); +static void print_AMD_assoc(int i); +static void do_cpuid(u_long ax, u_long *p); u_long cyrix_did; /* Device ID of Cyrix CPU */ int cpu_class = CPUCLASS_386; /* least common denominator */ @@ -88,10 +91,26 @@ static struct cpu_nameclass i386_cpus[] = { { "Cyrix 486S/DX", CPUCLASS_486 }, /* CPU_CY486DX */ }; +static void +do_cpuid(u_long ax, u_long *p) +{ + __asm __volatile( + ".byte 0x0f, 0xa2;" + "movl %%eax, (%%esi);" + "movl %%ebx, (4)(%%esi);" + "movl %%ecx, (8)(%%esi);" + "movl %%edx, (12)(%%esi);" + : + : "a" (ax), "S" (p) + : "ax", "bx", "cx", "dx" + ); +} + void printcpuinfo(void) { + u_long regs[4], nreg; cpu_class = i386_cpus[cpu].cpu_class; printf("CPU: "); strncpy(cpu_model, i386_cpus[cpu].cpu_name, sizeof cpu_model); @@ -193,6 +212,16 @@ printcpuinfo(void) strcat(cpu_model, "Unknown"); break; } + 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 & 0xf00) { @@ -425,10 +454,18 @@ printcpuinfo(void) /* Avoid ugly blank lines: only print newline when we have to. */ if (*cpu_vendor || cpu_id) printf("\n"); + #endif + if (!bootverbose) + return; + + if (strcmp(cpu_vendor, "AuthenticAMD") == 0) + print_AMD_info(); #ifdef I686_CPU /* * XXX - Do PPro CPUID level=2 stuff here? + * + * No, but maybe in a print_Intel_info() function called from here. */ #endif } @@ -633,3 +670,36 @@ earlysetcpuclass(void) cpu_class = i386_cpus[cpu].cpu_class; } + +static void +print_AMD_assoc(int i) +{ + if (i == 255) + printf(", fully associative\n"); + else + printf(", %d-way associative\n", i); +} + +static void +print_AMD_info(void) +{ + u_long regs[4]; + int i; + + do_cpuid(0x80000000, regs); + if (regs[0] >= 0x80000005) { + do_cpuid(0x80000005, regs); + printf("Data TLB: %d entries", (regs[1] >> 16) & 0xff); + print_AMD_assoc(regs[1] >> 24); + printf("Instruction TLB: %d entries", regs[1] & 0xff); + print_AMD_assoc((regs[1] >> 8) & 0xff); + printf("L1 data cache: %d kbytes", regs[2] >> 24); + printf(", %d bytes/line", regs[2] & 0xff); + printf(", %d lines/tag", (regs[2] >> 8) & 0xff); + print_AMD_assoc((regs[2] >> 16) & 0xff); + printf("L1 instruction cache: %d kbytes", regs[3] >> 24); + printf(", %d bytes/line", regs[3] & 0xff); + printf(", %d lines/tag", (regs[3] >> 8) & 0xff); + print_AMD_assoc((regs[3] >> 16) & 0xff); + } +} |