annotate TOOLS/cpuinfo.c @ 19619:a83e5b8d2e63

Patch from Karolina Lindqvist <karolina.lindqvist@kramnet.se> "There is a bug in the zoran -vo zr driver, that makes the output garbled always. It also probably affects the zrmjpeg filter. This patch takes care of the problem." Patch tested and OK. And 10l to me, because this bug probably has existed for a looong time.
author rik
date Fri, 01 Sep 2006 18:49:40 +0000
parents a163f6de7bdc
children 1ffb54bae960
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12960
a85bfb689e62 Some explanation what the tool is good for added.
diego
parents: 11113
diff changeset
1 /* small utility to extract CPU information
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
2 Used by configure to set CPU optimization levels on some operating
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
3 systems where /proc/cpuinfo is non-existent or unreliable. */
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
4
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
5 #include <stdio.h>
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
6 #include <sys/time.h>
17040
0bfb87188015 correct k6_mtrr detection, add a great deal of infos about newer processors
gpoirier
parents: 13612
diff changeset
7 #include <stdlib.h>
0bfb87188015 correct k6_mtrr detection, add a great deal of infos about newer processors
gpoirier
parents: 13612
diff changeset
8 #include <string.h>
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
9 #include <unistd.h>
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
10
18910
5f31565951f7 MinGW 3.1 has added gettimeofday.
diego
parents: 18847
diff changeset
11 #if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION <= 3) && (__MINGW32_MINOR_VERSION < 10)
9764
f5c4c9bb9451 MINGW32 port
faust3
parents: 6686
diff changeset
12 #include <sys/timeb.h>
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
13 void gettimeofday(struct timeval* t,void* timezone) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
14 struct timeb timebuffer;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
15 ftime( &timebuffer );
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
16 t->tv_sec=timebuffer.time;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
17 t->tv_usec=1000*timebuffer.millitm;
9764
f5c4c9bb9451 MINGW32 port
faust3
parents: 6686
diff changeset
18 }
18926
a163f6de7bdc usleep is still missing in MinGW, so leave it out of the MinGW version check.
diego
parents: 18910
diff changeset
19 #endif
a163f6de7bdc usleep is still missing in MinGW, so leave it out of the MinGW version check.
diego
parents: 18910
diff changeset
20 #ifdef __MINGW32__
9764
f5c4c9bb9451 MINGW32 port
faust3
parents: 6686
diff changeset
21 #define MISSING_USLEEP
f5c4c9bb9451 MINGW32 port
faust3
parents: 6686
diff changeset
22 #define sleep(t) _sleep(1000*t);
f5c4c9bb9451 MINGW32 port
faust3
parents: 6686
diff changeset
23 #endif
f5c4c9bb9451 MINGW32 port
faust3
parents: 6686
diff changeset
24
13612
c0bde085511c Zeta OS support, mostly working.
reimar
parents: 12960
diff changeset
25 #ifdef __BEOS__
c0bde085511c Zeta OS support, mostly working.
reimar
parents: 12960
diff changeset
26 #define usleep(t) snooze(t)
c0bde085511c Zeta OS support, mostly working.
reimar
parents: 12960
diff changeset
27 #endif
c0bde085511c Zeta OS support, mostly working.
reimar
parents: 12960
diff changeset
28
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
29 #ifdef M_UNIX
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
30 typedef long long int64_t;
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
31 #define MISSING_USLEEP
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
32 #else
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
33 #include <inttypes.h>
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
34 #endif
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
35
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
36
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
37 typedef struct cpuid_regs {
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
38 unsigned int eax;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
39 unsigned int ebx;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
40 unsigned int ecx;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
41 unsigned int edx;
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
42 } cpuid_regs_t;
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
43
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
44 static cpuid_regs_t
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
45 cpuid(int func) {
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
46 cpuid_regs_t regs;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
47 #define CPUID ".byte 0x0f, 0xa2; "
18534
cbcea803efa1 x86_64 only saves ebx, not rbx. Fix some potential compilation problem on amd64.
gpoirier
parents: 18517
diff changeset
48 #ifdef __x86_64__
cbcea803efa1 x86_64 only saves ebx, not rbx. Fix some potential compilation problem on amd64.
gpoirier
parents: 18517
diff changeset
49 asm("mov %%rbx, %%rsi\n\t"
cbcea803efa1 x86_64 only saves ebx, not rbx. Fix some potential compilation problem on amd64.
gpoirier
parents: 18517
diff changeset
50 #else
18517
31c96e2b64b4 fix build on macintel, patch by Zuxy Meng
gpoirier
parents: 18511
diff changeset
51 asm("mov %%ebx, %%esi\n\t"
18534
cbcea803efa1 x86_64 only saves ebx, not rbx. Fix some potential compilation problem on amd64.
gpoirier
parents: 18517
diff changeset
52 #endif
18517
31c96e2b64b4 fix build on macintel, patch by Zuxy Meng
gpoirier
parents: 18511
diff changeset
53 CPUID"\n\t"
18534
cbcea803efa1 x86_64 only saves ebx, not rbx. Fix some potential compilation problem on amd64.
gpoirier
parents: 18517
diff changeset
54 #ifdef __x86_64__
cbcea803efa1 x86_64 only saves ebx, not rbx. Fix some potential compilation problem on amd64.
gpoirier
parents: 18517
diff changeset
55 "xchg %%rsi, %%rbx\n\t"
cbcea803efa1 x86_64 only saves ebx, not rbx. Fix some potential compilation problem on amd64.
gpoirier
parents: 18517
diff changeset
56 #else
cbcea803efa1 x86_64 only saves ebx, not rbx. Fix some potential compilation problem on amd64.
gpoirier
parents: 18517
diff changeset
57 "xchg %%esi, %%ebx\n\t"
cbcea803efa1 x86_64 only saves ebx, not rbx. Fix some potential compilation problem on amd64.
gpoirier
parents: 18517
diff changeset
58 #endif
18517
31c96e2b64b4 fix build on macintel, patch by Zuxy Meng
gpoirier
parents: 18511
diff changeset
59 : "=a" (regs.eax), "=S" (regs.ebx), "=c" (regs.ecx), "=d" (regs.edx)
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
60 : "0" (func));
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
61 return regs;
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
62 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
63
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
64
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
65 static int64_t
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
66 rdtsc(void)
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
67 {
18847
0e2d54a7cb61 merges two asm constraints to one, patch by Zuxy Meng zuxy PP meng AHH gmail PP com
gpoirier
parents: 18552
diff changeset
68 uint64_t i;
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
69 #define RDTSC ".byte 0x0f, 0x31; "
18847
0e2d54a7cb61 merges two asm constraints to one, patch by Zuxy Meng zuxy PP meng AHH gmail PP com
gpoirier
parents: 18552
diff changeset
70 asm volatile (RDTSC : "=A"(i) : );
0e2d54a7cb61 merges two asm constraints to one, patch by Zuxy Meng zuxy PP meng AHH gmail PP com
gpoirier
parents: 18552
diff changeset
71 return i;
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
72 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
73
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
74 static const char*
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
75 brandname(int i)
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
76 {
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
77 const static char* brandmap[] = {
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
78 NULL,
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
79 "Intel(R) Celeron(R) processor",
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
80 "Intel(R) Pentium(R) III processor",
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
81 "Intel(R) Pentium(R) III Xeon(tm) processor",
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
82 "Intel(R) Pentium(R) III processor",
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
83 NULL,
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
84 "Mobile Intel(R) Pentium(R) III processor-M",
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
85 "Mobile Intel(R) Celeron(R) processor"
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
86 };
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
87
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
88 if (i >= sizeof(brandmap))
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
89 return NULL;
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
90 else
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
91 return brandmap[i];
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
92 }
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
93
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
94 static void
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
95 store32(char *d, unsigned int v)
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
96 {
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
97 d[0] = v & 0xff;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
98 d[1] = (v >> 8) & 0xff;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
99 d[2] = (v >> 16) & 0xff;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
100 d[3] = (v >> 24) & 0xff;
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
101 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
102
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
103
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
104 int
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
105 main(int argc, char **argv)
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
106 {
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
107 cpuid_regs_t regs, regs_ext;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
108 char idstr[13];
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
109 unsigned max_cpuid;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
110 unsigned max_ext_cpuid;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
111 unsigned int amd_flags;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
112 unsigned int amd_flags2;
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
113 const char *model_name = NULL;
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
114 int i;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
115 char processor_name[49];
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
116
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
117 regs = cpuid(0);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
118 max_cpuid = regs.eax;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
119 /* printf("%d CPUID function codes\n", max_cpuid+1); */
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
120
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
121 store32(idstr+0, regs.ebx);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
122 store32(idstr+4, regs.edx);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
123 store32(idstr+8, regs.ecx);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
124 idstr[12] = 0;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
125 printf("vendor_id\t: %s\n", idstr);
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
126
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
127 regs_ext = cpuid((1<<31) + 0);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
128 max_ext_cpuid = regs_ext.eax;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
129 if (max_ext_cpuid >= (1<<31) + 1) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
130 regs_ext = cpuid((1<<31) + 1);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
131 amd_flags = regs_ext.edx;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
132 amd_flags2 = regs_ext.ecx;
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
133
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
134 if (max_ext_cpuid >= (1<<31) + 4) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
135 for (i = 2; i <= 4; i++) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
136 regs_ext = cpuid((1<<31) + i);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
137 store32(processor_name + (i-2)*16, regs_ext.eax);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
138 store32(processor_name + (i-2)*16 + 4, regs_ext.ebx);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
139 store32(processor_name + (i-2)*16 + 8, regs_ext.ecx);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
140 store32(processor_name + (i-2)*16 + 12, regs_ext.edx);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
141 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
142 processor_name[48] = 0;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
143 model_name = processor_name;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
144 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
145 } else {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
146 amd_flags = 0;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
147 amd_flags2 = 0;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
148 }
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
149
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
150 if (max_cpuid >= 1) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
151 static struct {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
152 int bit;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
153 char *desc;;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
154 char *description;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
155 } cap[] = {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
156 { 0, "fpu", "Floating-point unit on-chip" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
157 { 1, "vme", "Virtual Mode Enhancements" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
158 { 2, "de", "Debugging Extension" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
159 { 3, "pse", "Page Size Extension" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
160 { 4, "tsc", "Time Stamp Counter" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
161 { 5, "msr", "Pentium Processor MSR" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
162 { 6, "pae", "Physical Address Extension" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
163 { 7, "mce", "Machine Check Exception" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
164 { 8, "cx8", "CMPXCHG8B Instruction Supported" },
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
165 { 9, "apic", "On-chip APIC Hardware Enabled" },
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
166 { 11, "sep", "SYSENTER and SYSEXIT" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
167 { 12, "mtrr", "Memory Type Range Registers" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
168 { 13, "pge", "PTE Global Bit" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
169 { 14, "mca", "Machine Check Architecture" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
170 { 15, "cmov", "Conditional Move/Compare Instruction" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
171 { 16, "pat", "Page Attribute Table" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
172 { 17, "pse36", "Page Size Extension 36-bit" },
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
173 { 18, "pn", "Processor Serial Number" },
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
174 { 19, "cflsh", "CFLUSH instruction" },
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
175 { 21, "dts", "Debug Store" },
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
176 { 22, "acpi", "Thermal Monitor and Clock Ctrl" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
177 { 23, "mmx", "MMX Technology" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
178 { 24, "fxsr", "FXSAVE/FXRSTOR" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
179 { 25, "sse", "SSE Extensions" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
180 { 26, "sse2", "SSE2 Extensions" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
181 { 27, "ss", "Self Snoop" },
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
182 { 28, "ht", "Multi-threading" },
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
183 { 29, "tm", "Therm. Monitor" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
184 { 30, "ia64", "IA-64 Processor" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
185 { 31, "pbe", "Pend. Brk. EN." },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
186 { -1 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
187 };
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
188 static struct {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
189 int bit;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
190 char *desc;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
191 char *description;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
192 } cap2[] = {
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
193 { 0, "pni", "SSE3 Extensions" },
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
194 { 3, "monitor", "MONITOR/MWAIT" },
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
195 { 4, "ds_cpl", "CPL Qualified Debug Store" },
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
196 { 5, "vmx", "Virtual Machine Extensions" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
197 { 7, "est", "Enhanced Intel SpeedStep Technology" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
198 { 8, "tm2", "Thermal Monitor 2" },
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
199 { 10, "cid", "L1 Context ID" },
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
200 { 13, "cx16", "CMPXCHG16B Available" },
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
201 { 14, "xtpr", "xTPR Disable" },
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
202 { -1 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
203 };
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
204 static struct {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
205 int bit;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
206 char *desc;;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
207 char *description;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
208 } cap_amd[] = {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
209 { 11, "syscall", "SYSCALL and SYSRET" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
210 { 19, "mp", "MP Capable" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
211 { 20, "nx", "No-Execute Page Protection" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
212 { 22, "mmxext","MMX Technology (AMD Extensions)" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
213 { 25, "fxsr_opt", "Fast FXSAVE/FXRSTOR" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
214 { 27, "rdtscp", "RDTSCP Instruction" },
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
215 { 29, "lm", "Long Mode Capable" },
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
216 { 30, "3dnowext","3DNow! Extensions" },
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
217 { 31, "3dnow", "3DNow!" },
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
218 { -1 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
219 };
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
220 static struct {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
221 int bit;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
222 char *desc;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
223 char *description;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
224 } cap_amd2[] = {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
225 { 0, "lahf_lm", "LAHF/SAHF Supported in 64-bit Mode" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
226 { 1, "cmp_legacy", "Chip Multi-Core" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
227 { 2, "svm", "Secure Virtual Machine" },
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
228 { 4, "cr8legacy", "CR8 Available in Legacy Mode" },
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
229 { -1 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
230 };
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
231 unsigned int family, model, stepping;
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
232
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
233 regs = cpuid(1);
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
234 family = (regs.eax >> 8) & 0xf;
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
235 model = (regs.eax >> 4) & 0xf;
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
236 stepping = regs.eax & 0xf;
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
237
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
238 if (family == 0xf)
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
239 {
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
240 family += (regs.eax >> 20) & 0xff;
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
241 model += ((regs.eax >> 16) & 0xf) << 4;
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
242 }
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
243
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
244 printf("cpu family\t: %d\n"
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
245 "model\t\t: %d\n"
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
246 "stepping\t: %d\n" ,
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
247 family,
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
248 model,
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
249 stepping);
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
250
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
251 if (strstr(idstr, "Intel") && !model_name) {
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
252 if (family == 6 && model == 0xb && stepping == 1)
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
253 model_name = "Intel (R) Celeron (R) processor";
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
254 else
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
255 model_name = brandname(regs.ebx & 0xf);
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
256 }
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
257
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
258 printf("flags\t\t:");
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
259 for (i = 0; cap[i].bit >= 0; i++) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
260 if (regs.edx & (1 << cap[i].bit)) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
261 printf(" %s", cap[i].desc);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
262 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
263 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
264 for (i = 0; cap2[i].bit >= 0; i++) {
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
265 if (regs.ecx & (1 << cap2[i].bit)) {
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
266 printf(" %s", cap2[i].desc);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
267 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
268 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
269 /* k6_mtrr is supported by some AMD K6-2/K6-III CPUs but
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
270 it is not indicated by a CPUID feature bit, so we
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
271 have to check the family, model and stepping instead. */
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
272 if (strstr(idstr, "AMD") &&
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
273 family == 5 &&
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
274 (model >= 9 || model == 8 && stepping >= 8))
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
275 printf(" %s", "k6_mtrr");
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
276 /* similar for cyrix_arr. */
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
277 if (strstr(idstr, "Cyrix") &&
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
278 (family == 5 && model < 4 || family == 6))
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
279 printf(" %s", "cyrix_arr");
18552
2d996eb065d4 On old WinChips Linux kernel use this to emulate MTRR, patch by Zuxy Meng < zuxy P meng A gmail P com>
poirierg
parents: 18534
diff changeset
280 /* as well as centaur_mcr. */
2d996eb065d4 On old WinChips Linux kernel use this to emulate MTRR, patch by Zuxy Meng < zuxy P meng A gmail P com>
poirierg
parents: 18534
diff changeset
281 if (strstr(idstr, "Centaur") &&
2d996eb065d4 On old WinChips Linux kernel use this to emulate MTRR, patch by Zuxy Meng < zuxy P meng A gmail P com>
poirierg
parents: 18534
diff changeset
282 family == 5)
2d996eb065d4 On old WinChips Linux kernel use this to emulate MTRR, patch by Zuxy Meng < zuxy P meng A gmail P com>
poirierg
parents: 18534
diff changeset
283 printf(" %s", "centaur_mcr");
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
284
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
285 for (i = 0; cap_amd[i].bit >= 0; i++) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
286 if (amd_flags & (1 << cap_amd[i].bit)) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
287 printf(" %s", cap_amd[i].desc);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
288 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
289 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
290 for (i = 0; cap_amd2[i].bit >= 0; i++) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
291 if (amd_flags2 & (1 << cap_amd2[i].bit)) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
292 printf(" %s", cap_amd2[i].desc);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
293 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
294 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
295 printf("\n");
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
296
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
297 if (regs.edx & (1 << 4)) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
298 int64_t tsc_start, tsc_end;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
299 struct timeval tv_start, tv_end;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
300 int usec_delay;
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
301
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
302 tsc_start = rdtsc();
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
303 gettimeofday(&tv_start, NULL);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
304 #ifdef MISSING_USLEEP
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
305 sleep(1);
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
306 #else
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
307 usleep(100000);
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
308 #endif
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
309 tsc_end = rdtsc();
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
310 gettimeofday(&tv_end, NULL);
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
311
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
312 usec_delay = 1000000 * (tv_end.tv_sec - tv_start.tv_sec)
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
313 + (tv_end.tv_usec - tv_start.tv_usec);
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
314
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
315 printf("cpu MHz\t\t: %.3f\n",
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
316 (double)(tsc_end-tsc_start) / usec_delay);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
317 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
318 }
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
319
18511
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
320 printf("model name\t: ");
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
321 if (model_name)
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
322 printf("%s\n", model_name);
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
323 else
744aa553e4a1 Various improvement, fix build on AMD-64 and icc
gpoirier
parents: 17041
diff changeset
324 printf("Unknown %s CPU\n", idstr);
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
325 }