annotate TOOLS/cpuinfo.c @ 17982:c28298d1cbf7

Fix passing qdm2 extradata to lavc decoder It was broken in rev 1.142, that code does not behave the same as the old one in some cases
author rtognimp
date Mon, 27 Mar 2006 21:37:18 +0000
parents 4471c5a962ec
children 744aa553e4a1
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>
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
9
9764
f5c4c9bb9451 MINGW32 port
faust3
parents: 6686
diff changeset
10 #ifdef __MINGW32__
f5c4c9bb9451 MINGW32 port
faust3
parents: 6686
diff changeset
11 #include <sys/timeb.h>
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
12 void gettimeofday(struct timeval* t,void* timezone) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
13 struct timeb timebuffer;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
14 ftime( &timebuffer );
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
15 t->tv_sec=timebuffer.time;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
16 t->tv_usec=1000*timebuffer.millitm;
9764
f5c4c9bb9451 MINGW32 port
faust3
parents: 6686
diff changeset
17 }
f5c4c9bb9451 MINGW32 port
faust3
parents: 6686
diff changeset
18 #define MISSING_USLEEP
f5c4c9bb9451 MINGW32 port
faust3
parents: 6686
diff changeset
19 #define sleep(t) _sleep(1000*t);
f5c4c9bb9451 MINGW32 port
faust3
parents: 6686
diff changeset
20 #endif
f5c4c9bb9451 MINGW32 port
faust3
parents: 6686
diff changeset
21
13612
c0bde085511c Zeta OS support, mostly working.
reimar
parents: 12960
diff changeset
22 #ifdef __BEOS__
c0bde085511c Zeta OS support, mostly working.
reimar
parents: 12960
diff changeset
23 #define usleep(t) snooze(t)
c0bde085511c Zeta OS support, mostly working.
reimar
parents: 12960
diff changeset
24 #endif
c0bde085511c Zeta OS support, mostly working.
reimar
parents: 12960
diff changeset
25
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
26 #ifdef M_UNIX
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
27 typedef long long int64_t;
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
28 #define MISSING_USLEEP
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
29 #else
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
30 #include <inttypes.h>
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
31 #endif
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
32
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
33
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
34 typedef struct cpuid_regs {
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
35 unsigned int eax;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
36 unsigned int ebx;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
37 unsigned int ecx;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
38 unsigned int edx;
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
39 } cpuid_regs_t;
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
40
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
41 static cpuid_regs_t
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
42 cpuid(int func) {
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
43 cpuid_regs_t regs;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
44 #define CPUID ".byte 0x0f, 0xa2; "
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
45 asm("push %%ebx; "
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
46 "movl %4,%%eax; " CPUID
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
47 "movl %%eax,%0; movl %%ebx,%1; movl %%ecx,%2; movl %%edx,%3; "
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
48 "pop %%ebx"
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
49 : "=m" (regs.eax), "=m" (regs.ebx), "=m" (regs.ecx), "=m" (regs.edx)
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
50 : "g" (func)
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
51 : "%eax", "%ecx", "%edx");
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
52 return regs;
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
53 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
54
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
55
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
56 static int64_t
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
57 rdtsc(void)
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
58 {
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
59 unsigned int i, j;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
60 #define RDTSC ".byte 0x0f, 0x31; "
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
61 asm(RDTSC : "=a"(i), "=d"(j) : );
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
62 return ((int64_t)j<<32) + (int64_t)i;
1038
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
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
66 static void
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
67 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
68 {
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
69 d[0] = v & 0xff;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
70 d[1] = (v >> 8) & 0xff;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
71 d[2] = (v >> 16) & 0xff;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
72 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
73 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
74
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
75
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
76 int
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
77 main(int argc, char **argv)
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
78 {
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
79 cpuid_regs_t regs, regs_ext;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
80 char idstr[13];
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
81 unsigned max_cpuid;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
82 unsigned max_ext_cpuid;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
83 unsigned int amd_flags;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
84 unsigned int amd_flags2;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
85 char *model_name = "Unknown CPU";
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
86 int i;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
87 char processor_name[49];
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
88
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
89 regs = cpuid(0);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
90 max_cpuid = regs.eax;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
91 /* 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
92
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
93 store32(idstr+0, regs.ebx);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
94 store32(idstr+4, regs.edx);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
95 store32(idstr+8, regs.ecx);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
96 idstr[12] = 0;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
97 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
98
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
99 if (strcmp(idstr, "GenuineIntel") == 0)
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
100 model_name = "Unknown Intel CPU";
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
101 else if (strcmp(idstr, "AuthenticAMD") == 0)
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
102 model_name = "Unknown AMD CPU";
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
103
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
104 regs_ext = cpuid((1<<31) + 0);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
105 max_ext_cpuid = regs_ext.eax;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
106 if (max_ext_cpuid >= (1<<31) + 1) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
107 regs_ext = cpuid((1<<31) + 1);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
108 amd_flags = regs_ext.edx;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
109 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
110
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
111 if (max_ext_cpuid >= (1<<31) + 4) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
112 for (i = 2; i <= 4; i++) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
113 regs_ext = cpuid((1<<31) + i);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
114 store32(processor_name + (i-2)*16, regs_ext.eax);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
115 store32(processor_name + (i-2)*16 + 4, regs_ext.ebx);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
116 store32(processor_name + (i-2)*16 + 8, regs_ext.ecx);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
117 store32(processor_name + (i-2)*16 + 12, regs_ext.edx);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
118 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
119 processor_name[48] = 0;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
120 model_name = processor_name;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
121 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
122 } else {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
123 amd_flags = 0;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
124 amd_flags2 = 0;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
125 }
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 if (max_cpuid >= 1) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
128 static struct {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
129 int bit;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
130 char *desc;;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
131 char *description;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
132 } cap[] = {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
133 { 0, "fpu", "Floating-point unit on-chip" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
134 { 1, "vme", "Virtual Mode Enhancements" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
135 { 2, "de", "Debugging Extension" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
136 { 3, "pse", "Page Size Extension" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
137 { 4, "tsc", "Time Stamp Counter" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
138 { 5, "msr", "Pentium Processor MSR" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
139 { 6, "pae", "Physical Address Extension" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
140 { 7, "mce", "Machine Check Exception" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
141 { 8, "cx8", "CMPXCHG8B Instruction Supported" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
142 { 9, "apic", "On-chip CPIC Hardware Enabled" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
143 { 11, "sep", "SYSENTER and SYSEXIT" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
144 { 12, "mtrr", "Memory Type Range Registers" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
145 { 13, "pge", "PTE Global Bit" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
146 { 14, "mca", "Machine Check Architecture" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
147 { 15, "cmov", "Conditional Move/Compare Instruction" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
148 { 16, "pat", "Page Attribute Table" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
149 { 17, "pse36", "Page Size Extension 36-bit" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
150 { 18, "psn", "Processor Serial Number" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
151 { 19, "cflsh", "CFLUSH instruction" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
152 { 21, "ds", "Debug Store" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
153 { 22, "acpi", "Thermal Monitor and Clock Ctrl" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
154 { 23, "mmx", "MMX Technology" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
155 { 24, "fxsr", "FXSAVE/FXRSTOR" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
156 { 25, "sse", "SSE Extensions" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
157 { 26, "sse2", "SSE2 Extensions" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
158 { 27, "ss", "Self Snoop" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
159 { 28, "htt", "Multi-threading" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
160 { 29, "tm", "Therm. Monitor" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
161 { 30, "ia64", "IA-64 Processor" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
162 { 31, "pbe", "Pend. Brk. EN." },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
163 { -1 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
164 };
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
165 static struct {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
166 int bit;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
167 char *desc;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
168 char *description;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
169 } cap2[] = {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
170 { 0, "sse3", "SSE3 Extensions" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
171 { 3, "monitor", "MONITOR/MWAIT" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
172 { 4, "ds-cpl", "CPL Qualified Debug Store" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
173 { 5, "vmx", "Virtual Machine Extensions" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
174 { 7, "est", "Enhanced Intel SpeedStep Technology" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
175 { 8, "tm2", "Thermal Monitor 2" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
176 { 10, "cnxt-id", "L1 Context ID" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
177 { 13, "cmpxchg16b", "CMPXCHG16B Available" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
178 { -1 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
179 };
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
180 static struct {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
181 int bit;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
182 char *desc;;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
183 char *description;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
184 } cap_amd[] = {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
185 { 11, "syscall", "SYSCALL and SYSRET" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
186 { 19, "mp", "MP Capable" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
187 { 20, "nx", "No-Execute Page Protection" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
188 { 22, "mmxext","MMX Technology (AMD Extensions)" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
189 { 25, "fxsr_opt", "Fast FXSAVE/FXRSTOR" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
190 { 27, "rdtscp", "RDTSCP Instruction" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
191 { 30, "3dnowext","3Dnow! Extensions" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
192 { 31, "3dnow", "3Dnow!" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
193 { -1 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
194 };
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
195 static struct {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
196 int bit;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
197 char *desc;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
198 char *description;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
199 } cap_amd2[] = {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
200 { 0, "lahf_lm", "LAHF/SAHF Supported in 64-bit Mode" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
201 { 1, "cmp_legacy", "Chip Multi-Core" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
202 { 2, "svm", "Secure Virtual Machine" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
203 { 4, "cr8", "CR8 Available in Legacy Mode" },
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
204 { -1 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
205 };
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
206 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
207
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
208 regs = cpuid(1);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
209 printf("cpu family\t: %d\n"
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
210 "model\t\t: %d\n"
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
211 "stepping\t: %d\n" ,
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
212 family = (regs.eax >> 8) & 0xf,
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
213 model = (regs.eax >> 4) & 0xf,
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
214 stepping = regs.eax & 0xf);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
215
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
216 printf("flags\t\t:");
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
217 for (i = 0; cap[i].bit >= 0; i++) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
218 if (regs.edx & (1 << cap[i].bit)) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
219 printf(" %s", cap[i].desc);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
220 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
221 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
222 for (i = 0; cap2[i].bit >= 0; i++) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
223 if (regs.ecx & (1 << cap[i].bit)) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
224 printf(" %s", cap2[i].desc);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
225 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
226 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
227 /* k6_mtrr is supported by some AMD K6-2/K6-III CPUs but
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
228 it is not indicated by a CPUID feature bit, so we
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
229 have to check the family, model and stepping instead. */
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
230 if (strstr(idstr, "AMD") &&
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
231 family == 5 &&
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
232 (model >= 9 || model == 8 && stepping >= 8))
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
233 printf(" %s", "k6_mtrr");
17040
0bfb87188015 correct k6_mtrr detection, add a great deal of infos about newer processors
gpoirier
parents: 13612
diff changeset
234
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
235 for (i = 0; cap_amd[i].bit >= 0; i++) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
236 if (amd_flags & (1 << cap_amd[i].bit)) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
237 printf(" %s", cap_amd[i].desc);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
238 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
239 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
240 for (i = 0; cap_amd2[i].bit >= 0; i++) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
241 if (amd_flags2 & (1 << cap_amd2[i].bit)) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
242 printf(" %s", cap_amd2[i].desc);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
243 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
244 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
245 printf("\n");
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
246
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
247 if (regs.edx & (1 << 4)) {
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
248 int64_t tsc_start, tsc_end;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
249 struct timeval tv_start, tv_end;
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
250 int usec_delay;
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
251
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
252 tsc_start = rdtsc();
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
253 gettimeofday(&tv_start, NULL);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
254 #ifdef MISSING_USLEEP
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
255 sleep(1);
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
256 #else
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
257 usleep(100000);
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
258 #endif
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
259 tsc_end = rdtsc();
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
260 gettimeofday(&tv_end, NULL);
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
261
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
262 usec_delay = 1000000 * (tv_end.tv_sec - tv_start.tv_sec)
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
263 + (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
264
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
265 printf("cpu MHz\t\t: %.3f\n",
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
266 (double)(tsc_end-tsc_start) / usec_delay);
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
267 }
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
268 }
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
269
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
270 printf("model name\t: %s\n", model_name);
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
271
17041
4471c5a962ec M-x untabify
gpoirier
parents: 17040
diff changeset
272 exit(0);
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
diff changeset
273 }