//WBL 24 Oct 2019 taken from: //https://github.com/vusec/ridl/blob/2c155e849d55185e203449ce2faced5698341176/source/x86/gcc/cpuid.c //NOT USEFUL static info only //compile: gcc base_max_frequency.c //only on advanced intel CPU #include #include #include void cpuid(unsigned regs[4], unsigned leaf) { __get_cpuid(leaf, regs + 0, regs + 1, regs + 2, regs + 3); } void cpuidex(unsigned regs[4], unsigned leaf, unsigned subleaf) { #if __GNUC__ > 5 __get_cpuid_count(leaf, subleaf, regs + 0, regs + 1, regs + 2, regs + 3); #else asm volatile( "cpuid\n" : "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d" (regs[3]) : "a" (regs[0]), "c" (regs[2])); #endif } //WBL 24 Oct 2019 int main(int argc, char * argv[]) { /*WBL 24 Oct 2019 rewrite for github.com/vusec (above) */ int leaf = 0x00000001; //cpu_query_meltdown_info & cpu_query_l1tf_info //int leaf = 0; //see also https://github.com/vusec/ridl/blob/a07d5efca77b308a56adacee50df4fa13e362618/source/x86/cpuid.c int cpuInfo[4] = { 0, 0, 0, 0 }; cpuid(cpuInfo,leaf); printf("%d %08x %08x %08x %08x\n",leaf,cpuInfo[0],cpuInfo[1],cpuInfo[2],cpuInfo[3]); /* char vendor[13]; memcpy(vendor, cpuInfo + 1, 4); memcpy(vendor + 4, cpuInfo + 3, 4); memcpy(vendor + 8, cpuInfo + 2, 4); vendor[12] = '\0'; printf("vendor %s\n",vendor); */ /* this stuff not working on pchuckle !! use saunders-608-31 */ if (cpuInfo[0] >= 0x16) { cpuid(cpuInfo, 0x16); //My example saunders-608-31 //EAX: 0x000008fc EBX: 0x00000c80 ECX: 00000064 //Processor Base Frequency: 2300 MHz //Maximum Frequency: 3200 MHz //Bus (Reference) Frequency: 0100 MHz //Example 1 //Intel Core i7-6700K Skylake-H/S Family 6 model 94 (506E3) //cpuInfo[0] = 0x00000FA0; //= 4000 MHz //cpuInfo[1] = 0x00001068; //= 4200 MHz //cpuInfo[2] = 0x00000064; //= 100 MHz //Example 2 //Intel Core m3-6Y30 Skylake-U/Y Family 6 model 78 (406E3) //cpuInfo[0] = 0x000005DC; //= 1500 MHz //cpuInfo[1] = 0x00000898; //= 2200 MHz //cpuInfo[2] = 0x00000064; //= 100 MHz //Example 3 //Intel Core i5-7200 Kabylake-U/Y Family 6 model 142 (806E9) //cpuInfo[0] = 0x00000A8C; //= 2700 MHz //cpuInfo[1] = 0x00000C1C; //= 3100 MHz //cpuInfo[2] = 0x00000064; //= 100 MHz printf("EAX: 0x%08x EBX: 0x%08x ECX: %08x\r\n", cpuInfo[0], cpuInfo[1], cpuInfo[2]); printf("Processor Base Frequency: %04d MHz\r\n", cpuInfo[0]); printf("Maximum Frequency: %04d MHz\r\n", cpuInfo[1]); printf("Bus (Reference) Frequency: %04d MHz\r\n", cpuInfo[2]); } else { printf("CPUID level 16h unsupported\r\n"); } return 0; }