• 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 +5; i++) {
28 
29     UInt subleaf = 0;
30 
31     if (i == 4) subleaf = 10;
32     if (i == 7) subleaf = 10;
33     if (i == 0xB) subleaf = 10;
34     if (i == 0xD) subleaf = 10;
35 
36     if (subleaf > 0) printf("\n");
37 
38     cpuid(&eax,&ebx,&ecx,&edx, i,0);
39 
40     for (ecx_in = 1; ecx_in < subleaf; ecx_in++) {
41        cpuid(&eax,&ebx,&ecx,&edx, i,ecx_in);
42     }
43 
44     if (subleaf > 0) printf("\n");
45 
46   }
47 
48   printf("\n");
49 
50   cpuid(&eax,&ebx,&ecx,&edx, 0x80000000,0);
51   maxextidx = eax;
52   for (i = 0x80000001; i <= maxextidx +5; i++) {
53      cpuid(&eax,&ebx,&ecx,&edx, i,0);
54   }
55 
56   printf("invalid\n");
57   cpuid(&eax,&ebx,&ecx,&edx, 1234,0);
58   cpuid(&eax,&ebx,&ecx,&edx, 0x800004d3,0);
59 
60 
61   return 0;
62 }
63