• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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