1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdio.h>
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef  unsigned int            UInt;
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovtypedef  unsigned long long int  ULong;
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid cpuid ( UInt* eax, UInt* ebx, UInt* ecx, UInt* edx,
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             UInt index, UInt ecx_in )
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UInt a,b,c,d;
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   asm volatile ("cpuid"
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 : "0" (index), "2"(ecx_in) );
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *eax = a; *ebx = b; *ecx = c; *edx = d;
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   printf("%08x %08x -> %08x %08x %08x %08x\n",
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          index,ecx_in, a,b,c,d );
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint main ( void )
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  UInt eax, ebx, ecx, edx;
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  UInt maxidx, maxextidx, i,ecx_in;
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  printf("\n");
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  cpuid(&eax,&ebx,&ecx,&edx, 0,0);
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  maxidx = eax;
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  for (i = 1; i <= maxidx +5; i++) {
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    UInt subleaf = 0;
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    if (i == 4) subleaf = 10;
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    if (i == 7) subleaf = 10;
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    if (i == 0xB) subleaf = 10;
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    if (i == 0xD) subleaf = 10;
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    if (subleaf > 0) printf("\n");
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    cpuid(&eax,&ebx,&ecx,&edx, i,0);
39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    for (ecx_in = 1; ecx_in < subleaf; ecx_in++) {
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       cpuid(&eax,&ebx,&ecx,&edx, i,ecx_in);
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    if (subleaf > 0) printf("\n");
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  }
47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  printf("\n");
49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  cpuid(&eax,&ebx,&ecx,&edx, 0x80000000,0);
51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  maxextidx = eax;
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  for (i = 0x80000001; i <= maxextidx +5; i++) {
53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov     cpuid(&eax,&ebx,&ecx,&edx, i,0);
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  }
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  printf("invalid\n");
57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  cpuid(&eax,&ebx,&ecx,&edx, 1234,0);
58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  cpuid(&eax,&ebx,&ecx,&edx, 0x800004d3,0);
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  return 0;
62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
63