195aa910fda7473eab317346f80130c187e9f7ecfsewardj
295aa910fda7473eab317346f80130c187e9f7ecfsewardj#include <stdio.h>
395aa910fda7473eab317346f80130c187e9f7ecfsewardj
495aa910fda7473eab317346f80130c187e9f7ecfsewardjtypedef  unsigned int            UInt;
595aa910fda7473eab317346f80130c187e9f7ecfsewardjtypedef  unsigned long long int  ULong;
695aa910fda7473eab317346f80130c187e9f7ecfsewardj
795aa910fda7473eab317346f80130c187e9f7ecfsewardjvoid cpuid ( UInt* eax, UInt* ebx, UInt* ecx, UInt* edx,
895aa910fda7473eab317346f80130c187e9f7ecfsewardj             UInt index, UInt ecx_in )
995aa910fda7473eab317346f80130c187e9f7ecfsewardj{
1095aa910fda7473eab317346f80130c187e9f7ecfsewardj   UInt a,b,c,d;
1195aa910fda7473eab317346f80130c187e9f7ecfsewardj   asm volatile ("cpuid"
1295aa910fda7473eab317346f80130c187e9f7ecfsewardj                 : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
1395aa910fda7473eab317346f80130c187e9f7ecfsewardj                 : "0" (index), "2"(ecx_in) );
1495aa910fda7473eab317346f80130c187e9f7ecfsewardj   *eax = a; *ebx = b; *ecx = c; *edx = d;
1595aa910fda7473eab317346f80130c187e9f7ecfsewardj   printf("%08x %08x -> %08x %08x %08x %08x\n",
1695aa910fda7473eab317346f80130c187e9f7ecfsewardj          index,ecx_in, a,b,c,d );
1795aa910fda7473eab317346f80130c187e9f7ecfsewardj}
1895aa910fda7473eab317346f80130c187e9f7ecfsewardj
1995aa910fda7473eab317346f80130c187e9f7ecfsewardjint main ( void )
2095aa910fda7473eab317346f80130c187e9f7ecfsewardj{
2195aa910fda7473eab317346f80130c187e9f7ecfsewardj  UInt eax, ebx, ecx, edx;
2295aa910fda7473eab317346f80130c187e9f7ecfsewardj  UInt maxidx, maxextidx, i,ecx_in;
2395aa910fda7473eab317346f80130c187e9f7ecfsewardj
243d738105dc4923b83135dccb72b3285ad3420b07sewardj  printf("\n");
2595aa910fda7473eab317346f80130c187e9f7ecfsewardj  cpuid(&eax,&ebx,&ecx,&edx, 0,0);
2695aa910fda7473eab317346f80130c187e9f7ecfsewardj  maxidx = eax;
27fe0c5e78ee12edb0a857e73dd21181b03299e560sewardj  for (i = 1; i <= maxidx +5; i++) {
283d738105dc4923b83135dccb72b3285ad3420b07sewardj
29fe0c5e78ee12edb0a857e73dd21181b03299e560sewardj    UInt subleaf = 0;
303d738105dc4923b83135dccb72b3285ad3420b07sewardj
31fe0c5e78ee12edb0a857e73dd21181b03299e560sewardj    if (i == 4) subleaf = 10;
32fe0c5e78ee12edb0a857e73dd21181b03299e560sewardj    if (i == 7) subleaf = 10;
33fe0c5e78ee12edb0a857e73dd21181b03299e560sewardj    if (i == 0xB) subleaf = 10;
34fe0c5e78ee12edb0a857e73dd21181b03299e560sewardj    if (i == 0xD) subleaf = 10;
353d738105dc4923b83135dccb72b3285ad3420b07sewardj
36fe0c5e78ee12edb0a857e73dd21181b03299e560sewardj    if (subleaf > 0) printf("\n");
37fe0c5e78ee12edb0a857e73dd21181b03299e560sewardj
38fe0c5e78ee12edb0a857e73dd21181b03299e560sewardj    cpuid(&eax,&ebx,&ecx,&edx, i,0);
393d738105dc4923b83135dccb72b3285ad3420b07sewardj
40fe0c5e78ee12edb0a857e73dd21181b03299e560sewardj    for (ecx_in = 1; ecx_in < subleaf; ecx_in++) {
41fe0c5e78ee12edb0a857e73dd21181b03299e560sewardj       cpuid(&eax,&ebx,&ecx,&edx, i,ecx_in);
423d738105dc4923b83135dccb72b3285ad3420b07sewardj    }
433d738105dc4923b83135dccb72b3285ad3420b07sewardj
44fe0c5e78ee12edb0a857e73dd21181b03299e560sewardj    if (subleaf > 0) printf("\n");
453d738105dc4923b83135dccb72b3285ad3420b07sewardj
4695aa910fda7473eab317346f80130c187e9f7ecfsewardj  }
4795aa910fda7473eab317346f80130c187e9f7ecfsewardj
483d738105dc4923b83135dccb72b3285ad3420b07sewardj  printf("\n");
493d738105dc4923b83135dccb72b3285ad3420b07sewardj
5095aa910fda7473eab317346f80130c187e9f7ecfsewardj  cpuid(&eax,&ebx,&ecx,&edx, 0x80000000,0);
5195aa910fda7473eab317346f80130c187e9f7ecfsewardj  maxextidx = eax;
52fe0c5e78ee12edb0a857e73dd21181b03299e560sewardj  for (i = 0x80000001; i <= maxextidx +5; i++) {
5395aa910fda7473eab317346f80130c187e9f7ecfsewardj     cpuid(&eax,&ebx,&ecx,&edx, i,0);
5495aa910fda7473eab317346f80130c187e9f7ecfsewardj  }
5595aa910fda7473eab317346f80130c187e9f7ecfsewardj
5695aa910fda7473eab317346f80130c187e9f7ecfsewardj  printf("invalid\n");
5795aa910fda7473eab317346f80130c187e9f7ecfsewardj  cpuid(&eax,&ebx,&ecx,&edx, 1234,0);
5895aa910fda7473eab317346f80130c187e9f7ecfsewardj  cpuid(&eax,&ebx,&ecx,&edx, 0x800004d3,0);
5995aa910fda7473eab317346f80130c187e9f7ecfsewardj
6095aa910fda7473eab317346f80130c187e9f7ecfsewardj
6195aa910fda7473eab317346f80130c187e9f7ecfsewardj  return 0;
6295aa910fda7473eab317346f80130c187e9f7ecfsewardj}
63