diff options
author | dfr <dfr@FreeBSD.org> | 2001-06-25 15:11:33 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 2001-06-25 15:11:33 +0000 |
commit | c5db765727427cb4de9912aba78cee81dfad64fe (patch) | |
tree | d65a9cb58f6147c4dfe59c1b6b4f353e545a3f1f /sys | |
parent | 672e483c4a4647360db01b528ab3cc5bb1696f19 (diff) | |
download | FreeBSD-src-c5db765727427cb4de9912aba78cee81dfad64fe.zip FreeBSD-src-c5db765727427cb4de9912aba78cee81dfad64fe.tar.gz |
Add code to detect Transmeta Crusoe cpus.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/amd64/amd64/identcpu.c | 57 | ||||
-rw-r--r-- | sys/i386/i386/identcpu.c | 57 |
2 files changed, 110 insertions, 4 deletions
diff --git a/sys/amd64/amd64/identcpu.c b/sys/amd64/amd64/identcpu.c index b379e73..fe2b98b 100644 --- a/sys/amd64/amd64/identcpu.c +++ b/sys/amd64/amd64/identcpu.c @@ -76,6 +76,7 @@ static void identifycyrix(void); static void print_AMD_features(u_int *regs); static void print_AMD_info(u_int amd_maxregs); static void print_AMD_assoc(int i); +static void print_transmeta_info(void); static void do_cpuid(u_int ax, u_int *p); u_int cyrix_did; /* Device ID of Cyrix CPU */ @@ -130,7 +131,6 @@ int has_f00f_bug = 0; void printcpuinfo(void) { - u_int regs[4], nreg = 0; cpu_class = i386_cpus[cpu].cpu_class; printf("CPU: "); @@ -489,8 +489,22 @@ printcpuinfo(void) default: strcat(cpu_model, "Unknown"); } - } else if (strcmp(cpu_vendor, "IBM") == 0) + } 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'; + } #endif printf("%s (", cpu_model); @@ -611,6 +625,10 @@ printcpuinfo(void) if (strcmp(cpu_vendor, "AuthenticAMD") == 0) print_AMD_info(nreg); + else if (strcmp(cpu_vendor, "GenuineTMx86") == 0 || + strcmp(cpu_vendor, "TransmetaCPU") == 0) + print_transmeta_info(); + #ifdef I686_CPU /* * XXX - Do PPro CPUID level=2 stuff here? @@ -1006,3 +1024,38 @@ print_AMD_features(u_int *regs) "\0403DNow!" ); } + +static void +print_transmeta_info() +{ + u_int regs[4], nreg = 0; + + do_cpuid(0x80860000, regs); + nreg = regs[0]; + if (nreg >= 0x80860001) { + do_cpuid(0x80860001, regs); + printf(" Processor revision %u.%u.%u.%u\n", + (regs[1] >> 24) & 0xff, + (regs[1] >> 16) & 0xff, + (regs[1] >> 8) & 0xff, + regs[1] & 0xff); + } + if (nreg >= 0x80860002) { + do_cpuid(0x80860002, regs); + printf(" Code Morphing Software revision %u.%u.%u-%u-%u\n", + (regs[1] >> 24) & 0xff, + (regs[1] >> 16) & 0xff, + (regs[1] >> 8) & 0xff, + regs[1] & 0xff, + regs[2]); + } + if (nreg >= 0x80860006) { + char info[65]; + do_cpuid(0x80860003, (u_int*) &info[0]); + do_cpuid(0x80860004, (u_int*) &info[16]); + do_cpuid(0x80860005, (u_int*) &info[32]); + do_cpuid(0x80860006, (u_int*) &info[48]); + info[64] = 0; + printf(" %s\n", info); + } +} diff --git a/sys/i386/i386/identcpu.c b/sys/i386/i386/identcpu.c index b379e73..fe2b98b 100644 --- a/sys/i386/i386/identcpu.c +++ b/sys/i386/i386/identcpu.c @@ -76,6 +76,7 @@ static void identifycyrix(void); static void print_AMD_features(u_int *regs); static void print_AMD_info(u_int amd_maxregs); static void print_AMD_assoc(int i); +static void print_transmeta_info(void); static void do_cpuid(u_int ax, u_int *p); u_int cyrix_did; /* Device ID of Cyrix CPU */ @@ -130,7 +131,6 @@ int has_f00f_bug = 0; void printcpuinfo(void) { - u_int regs[4], nreg = 0; cpu_class = i386_cpus[cpu].cpu_class; printf("CPU: "); @@ -489,8 +489,22 @@ printcpuinfo(void) default: strcat(cpu_model, "Unknown"); } - } else if (strcmp(cpu_vendor, "IBM") == 0) + } 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'; + } #endif printf("%s (", cpu_model); @@ -611,6 +625,10 @@ printcpuinfo(void) if (strcmp(cpu_vendor, "AuthenticAMD") == 0) print_AMD_info(nreg); + else if (strcmp(cpu_vendor, "GenuineTMx86") == 0 || + strcmp(cpu_vendor, "TransmetaCPU") == 0) + print_transmeta_info(); + #ifdef I686_CPU /* * XXX - Do PPro CPUID level=2 stuff here? @@ -1006,3 +1024,38 @@ print_AMD_features(u_int *regs) "\0403DNow!" ); } + +static void +print_transmeta_info() +{ + u_int regs[4], nreg = 0; + + do_cpuid(0x80860000, regs); + nreg = regs[0]; + if (nreg >= 0x80860001) { + do_cpuid(0x80860001, regs); + printf(" Processor revision %u.%u.%u.%u\n", + (regs[1] >> 24) & 0xff, + (regs[1] >> 16) & 0xff, + (regs[1] >> 8) & 0xff, + regs[1] & 0xff); + } + if (nreg >= 0x80860002) { + do_cpuid(0x80860002, regs); + printf(" Code Morphing Software revision %u.%u.%u-%u-%u\n", + (regs[1] >> 24) & 0xff, + (regs[1] >> 16) & 0xff, + (regs[1] >> 8) & 0xff, + regs[1] & 0xff, + regs[2]); + } + if (nreg >= 0x80860006) { + char info[65]; + do_cpuid(0x80860003, (u_int*) &info[0]); + do_cpuid(0x80860004, (u_int*) &info[16]); + do_cpuid(0x80860005, (u_int*) &info[32]); + do_cpuid(0x80860006, (u_int*) &info[48]); + info[64] = 0; + printf(" %s\n", info); + } +} |