1
2 #include <stdio.h>
3
4 typedef unsigned int UInt;
5 typedef unsigned long long int ULong;
6
cpuid(UInt * eax,UInt * ebx,UInt * ecx,UInt * edx,UInt index,UInt ecx_in)7 void cpuid ( UInt* eax, UInt* ebx, UInt* ecx, UInt* edx,
8 UInt index, UInt ecx_in )
9 {
10 UInt a,b,c,d;
11 asm volatile ("cpuid"
12 : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
13 : "0" (index), "2"(ecx_in) );
14 *eax = a; *ebx = b; *ecx = c; *edx = d;
15 printf("%08x %08x -> %08x %08x %08x %08x\n",
16 index,ecx_in, a,b,c,d );
17 }
18
main(void)19 int main ( void )
20 {
21 UInt eax, ebx, ecx, edx;
22 UInt maxidx, maxextidx, i,ecx_in;
23
24 printf("\n");
25 cpuid(&eax,&ebx,&ecx,&edx, 0,0);
26 maxidx = eax;
27 for (i = 1; i <= maxidx +2; i++) {
28
29 cpuid(&eax,&ebx,&ecx,&edx, i,0);
30
31 if (i == 4) {
32 printf("\n");
33 for (ecx_in = 1; ecx_in < 10; ecx_in++) {
34 cpuid(&eax,&ebx,&ecx,&edx, i,ecx_in);
35 }
36 printf("\n");
37 }
38
39 if (i == 0xb) {
40 printf("\n");
41 for (ecx_in = 1; ecx_in < 10; ecx_in++) {
42 cpuid(&eax,&ebx,&ecx,&edx, i,ecx_in);
43 }
44 printf("\n");
45 }
46
47 if (i == 0xd) {
48 printf("\n");
49 for (ecx_in = 1; ecx_in < 5; ecx_in++) {
50 cpuid(&eax,&ebx,&ecx,&edx, i,ecx_in);
51 }
52 printf("\n");
53 }
54
55
56 }
57
58 printf("\n");
59
60 cpuid(&eax,&ebx,&ecx,&edx, 0x80000000,0);
61 maxextidx = eax;
62 for (i = 0x80000001; i <= maxextidx +2; i++) {
63 cpuid(&eax,&ebx,&ecx,&edx, i,0);
64 }
65
66 printf("invalid\n");
67 cpuid(&eax,&ebx,&ecx,&edx, 1234,0);
68 cpuid(&eax,&ebx,&ecx,&edx, 0x800004d3,0);
69
70
71 return 0;
72 }
73
74 #include <stdio.h>
75
76 typedef unsigned int UInt;
77 typedef unsigned long long int ULong;
78
cpuid(UInt * eax,UInt * ebx,UInt * ecx,UInt * edx,UInt index,UInt ecx_in)79 void cpuid ( UInt* eax, UInt* ebx, UInt* ecx, UInt* edx,
80 UInt index, UInt ecx_in )
81 {
82 UInt a,b,c,d;
83 asm volatile ("cpuid"
84 : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
85 : "0" (index), "2"(ecx_in) );
86 *eax = a; *ebx = b; *ecx = c; *edx = d;
87 printf("%08x %08x -> %08x %08x %08x %08x\n",
88 index,ecx_in, a,b,c,d );
89 }
90
main(void)91 int main ( void )
92 {
93 UInt eax, ebx, ecx, edx;
94 UInt maxidx, maxextidx, i,ecx_in;
95
96 printf("\n");
97 cpuid(&eax,&ebx,&ecx,&edx, 0,0);
98 maxidx = eax;
99 for (i = 1; i <= maxidx +2; i++) {
100
101 cpuid(&eax,&ebx,&ecx,&edx, i,0);
102
103 if (i == 4) {
104 printf("\n");
105 for (ecx_in = 1; ecx_in < 10; ecx_in++) {
106 cpuid(&eax,&ebx,&ecx,&edx, i,ecx_in);
107 }
108 printf("\n");
109 }
110
111 if (i == 0xb) {
112 printf("\n");
113 for (ecx_in = 1; ecx_in < 10; ecx_in++) {
114 cpuid(&eax,&ebx,&ecx,&edx, i,ecx_in);
115 }
116 printf("\n");
117 }
118
119 if (i == 0xd) {
120 printf("\n");
121 for (ecx_in = 1; ecx_in < 5; ecx_in++) {
122 cpuid(&eax,&ebx,&ecx,&edx, i,ecx_in);
123 }
124 printf("\n");
125 }
126
127
128 }
129
130 printf("\n");
131
132 cpuid(&eax,&ebx,&ecx,&edx, 0x80000000,0);
133 maxextidx = eax;
134 for (i = 0x80000001; i <= maxextidx +2; i++) {
135 cpuid(&eax,&ebx,&ecx,&edx, i,0);
136 }
137
138 printf("invalid\n");
139 cpuid(&eax,&ebx,&ecx,&edx, 1234,0);
140 cpuid(&eax,&ebx,&ecx,&edx, 0x800004d3,0);
141
142
143 return 0;
144 }
145