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