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