#include <string.h>
enum {
- CPU_PROC_BRAND_STRING_INTERNAL0 = 0x80000003,
- CPU_PROC_BRAND_STRING_INTERNAL1 = 0x80000004
+ CPUID_PROC_BRAND_STRING_INTERNAL0 = 0x80000003,
+ CPUID_PROC_BRAND_STRING_INTERNAL1 = 0x80000004
};
#ifndef _MSC_VER
bool cpuid_test_feature(cpuid_t feature)
{
- if (feature > CPU_VIRT_PHYS_ADDR_SIZES || feature < CPU_EXTENDED_PROC_INFO_FEATURE_BITS)
+ if (feature > CPUID_VIRT_PHYS_ADDR_SIZES || feature < CPUID_EXTENDED_PROC_INFO_FEATURE_BITS)
return false;
return (feature <= cpuid_highest_ext_func_supported());
asm volatile(
"cpuid\n\t"
: "=c" (_ecx)
- : "a" (CPU_PROCINFO_AND_FEATUREBITS)
+ : "a" (CPUID_PROCINFO_AND_FEATUREBITS)
);
#elif defined _MSC_VER
__asm {
- mov eax, CPU_PROCINFO_AND_FEATUREBITS
+ mov eax, CPUID_PROCINFO_AND_FEATUREBITS
cpuid
mov _ecx, ecx
};
asm volatile(
"cpuid\n\t"
: "=d" (_edx)
- : "a" (CPU_PROCINFO_AND_FEATUREBITS)
+ : "a" (CPUID_PROCINFO_AND_FEATUREBITS)
);
#elif defined _MSC_VER
__asm {
- mov eax, CPU_PROCINFO_AND_FEATUREBITS
+ mov eax, CPUID_PROCINFO_AND_FEATUREBITS
cpuid
mov _edx, edx
};
} u;
uint32_t i;
- ___cpuid(CPU_VENDORID, &i, &u.bufu32[0], &u.bufu32[2], &u.bufu32[1]);
+ ___cpuid(CPUID_VENDORID, &i, &u.bufu32[0], &u.bufu32[2], &u.bufu32[1]);
for (i = 0; i < sizeof(cpuids) / sizeof(cpuids[0]); ++i) {
if (strncmp(cpuids[i], u.buf, 12) == 0) {
cputype = (cputype_t)i;
asm volatile(
"cpuid\n\t"
: "=a" (highest)
- : "a" (CPU_HIGHEST_EXTENDED_FUNCTION_SUPPORTED)
+ : "a" (CPUID_HIGHEST_EXTENDED_FUNCTION_SUPPORTED)
);
#elif defined _MSC_VER
__asm {
- mov eax, CPU_HIGHEST_EXTENDED_FUNCTION_SUPPORTED
+ mov eax, CPUID_HIGHEST_EXTENDED_FUNCTION_SUPPORTED
cpuid
mov highest, eax
};
/* Sanity checks, make sure we're not trying to do something
* invalid or we are trying to get information that isn't supported
* by the CPU. */
- if (info > CPU_VIRT_PHYS_ADDR_SIZES || (info > CPU_HIGHEST_EXTENDED_FUNCTION_SUPPORTED
+ if (info > CPUID_VIRT_PHYS_ADDR_SIZES || (info > CPUID_HIGHEST_EXTENDED_FUNCTION_SUPPORTED
&& !cpuid_test_feature(info)))
return;
- if (info == CPU_PROC_BRAND_STRING) {
+ if (info == CPUID_PROC_BRAND_STRING) {
static char cached[48] = { 0 };
if (cached[0] == '\0') {
- ___cpuid(CPU_PROC_BRAND_STRING, &buf[0], &buf[1], &buf[2], &buf[3]);
- ___cpuid(CPU_PROC_BRAND_STRING_INTERNAL0, &buf[4], &buf[5], &buf[6], &buf[7]);
- ___cpuid(CPU_PROC_BRAND_STRING_INTERNAL1, &buf[8], &buf[9], &buf[10], &buf[11]);
+ ___cpuid(CPUID_PROC_BRAND_STRING, &buf[0], &buf[1], &buf[2], &buf[3]);
+ ___cpuid(CPUID_PROC_BRAND_STRING_INTERNAL0, &buf[4], &buf[5], &buf[6], &buf[7]);
+ ___cpuid(CPUID_PROC_BRAND_STRING_INTERNAL1, &buf[8], &buf[9], &buf[10], &buf[11]);
memcpy(cached, buf, sizeof cached);
} else
buf = (uint32_t *)cached;
return;
- } else if (info == CPU_HIGHEST_EXTENDED_FUNCTION_SUPPORTED) {
+ } else if (info == CPUID_HIGHEST_EXTENDED_FUNCTION_SUPPORTED) {
*buf = cpuid_highest_ext_func_supported();
return;
}
___cpuid(info, &eax, &ebx, &ecx, &edx);
switch (info) {
- case CPU_VENDORID:
+ case CPUID_VENDORID:
buf[0] = ebx;
buf[1] = edx;
buf[2] = ecx;
break;
- case CPU_PROCINFO_AND_FEATUREBITS:
+ case CPUID_PROCINFO_AND_FEATUREBITS:
buf[0] = (eax & 0x0F); /* Stepping */
buf[1] = (eax >> 4) & 0x0F; /* Model */
buf[2] = (eax >> 8) & 0x0F; /* Family */
buf[9] = (ebx >> 16) & 0xFF;
buf[10] = (ebx >> 24) & 0xFF;
break;
- case CPU_CACHE_AND_TLBD_INFO:
+ case CPUID_CACHE_AND_TLBD_INFO:
buf[0] = eax;
buf[1] = ebx;
buf[2] = ecx;
buf[3] = edx;
break;
- case CPU_EXTENDED_PROC_INFO_FEATURE_BITS:
+ case CPUID_EXTENDED_PROC_INFO_FEATURE_BITS:
buf[0] = edx;
buf[1] = ecx;
break;
- case CPU_L1_CACHE_AND_TLB_IDS:
+ case CPUID_L1_CACHE_AND_TLB_IDS:
buf[0] = eax;
buf[1] = ebx;
buf[2] = ecx;
buf[3] = edx;
break;
- case CPU_EXTENDED_L2_CACHE_FEATURES:
+ case CPUID_EXTENDED_L2_CACHE_FEATURES:
buf[0] = ecx & 0xFF; /* Line size. */
buf[1] = (ecx >> 12) & 0xFF; /* Associativity. */
buf[2] = ecx >> 16; /* Cache size. */
break;
- case CPU_ADV_POWER_MGT_INFO:
+ case CPUID_ADV_POWER_MGT_INFO:
*buf = edx;
break;
- case CPU_VIRT_PHYS_ADDR_SIZES:
+ case CPUID_VIRT_PHYS_ADDR_SIZES:
buf[0] = eax & 0xFF; /* physical. */
buf[1] = (eax >> 8) & 0xFF; /* virtual. */
break;
*
* This is used as a parameter in cpuid().
*
- * CPU_VENDORID:
+ * CPUID_VENDORID:
* The CPU's Vendor ID.
*
- * CPU_PROCINFO_AND_FEATUREBITS:
+ * CPUID_PROCINFO_AND_FEATUREBITS:
* Processor information and feature bits (SSE, etc.).
*
- * CPU_CACHE_AND_TLBD_INFO
+ * CPUID_CACHE_AND_TLBD_INFO
* Cache and TLBD Information.
*
- * CPU_HIGHEST_EXTENDED_FUNCTION_SUPPORTED:
+ * CPUID_HIGHEST_EXTENDED_FUNCTION_SUPPORTED:
* Highest extended function supported address.
* Can be like 0x80000008.
*
- * CPU_EXTENDED_PROC_INFO_FEATURE_BITS:
+ * CPUID_EXTENDED_PROC_INFO_FEATURE_BITS:
* Extended processor information and feature bits (64bit etc.)
*
- * CPU_PROC_BRAND_STRING:
+ * CPUID_PROC_BRAND_STRING:
* The Processor's brand string.
*
- * CPU_L1_CACHE_AND_TLB_IDS:
+ * CPUID_L1_CACHE_AND_TLB_IDS:
* L1 Cache and TLB Identifications.
*
- * CPU_EXTENDED_L2_CACHE_FEATURES:
+ * CPUID_EXTENDED_L2_CACHE_FEATURES:
* Extended L2 Cache features.
*
- * CPU_ADV_POWER_MGT_INFO:
+ * CPUID_ADV_POWER_MGT_INFO:
* Advaned power management information.
*
- * CPU_VIRT_PHYS_ADDR_SIZES:
+ * CPUID_VIRT_PHYS_ADDR_SIZES:
* Virtual and physical address sizes.
*/
typedef enum cpuid {
- CPU_VENDORID = 0,
- CPU_PROCINFO_AND_FEATUREBITS = 1,
- CPU_CACHE_AND_TLBD_INFO = 2,
+ CPUID_VENDORID = 0,
+ CPUID_PROCINFO_AND_FEATUREBITS = 1,
+ CPUID_CACHE_AND_TLBD_INFO = 2,
- CPU_HIGHEST_EXTENDED_FUNCTION_SUPPORTED = 0x80000000,
- CPU_EXTENDED_PROC_INFO_FEATURE_BITS = 0x80000001,
- CPU_PROC_BRAND_STRING = 0x80000002,
- CPU_L1_CACHE_AND_TLB_IDS = 0x80000005,
- CPU_EXTENDED_L2_CACHE_FEATURES = 0x80000006,
- CPU_ADV_POWER_MGT_INFO = 0x80000007,
- CPU_VIRT_PHYS_ADDR_SIZES = 0x80000008
+ CPUID_HIGHEST_EXTENDED_FUNCTION_SUPPORTED = 0x80000000,
+ CPUID_EXTENDED_PROC_INFO_FEATURE_BITS = 0x80000001,
+ CPUID_PROC_BRAND_STRING = 0x80000002,
+ CPUID_L1_CACHE_AND_TLB_IDS = 0x80000005,
+ CPUID_EXTENDED_L2_CACHE_FEATURES = 0x80000006,
+ CPUID_ADV_POWER_MGT_INFO = 0x80000007,
+ CPUID_VIRT_PHYS_ADDR_SIZES = 0x80000008
} cpuid_t;
enum {
* Returns the highest extended function supported.
*
* This is the same as calling:
- * cpuid(CPU_HIGHEST_EEXTENDED_FUNCTION_SUPPORTED, &highest);
+ * cpuid(CPUID_HIGHEST_EEXTENDED_FUNCTION_SUPPORTED, &highest);
*
* This is made visible to the linker because it's easier to call it
* instead of calling cpuid with less type-checking. cpuid calls this.
* This function expects buf to be a valid pointer to a string/int/...
* depending on the requested information.
*
- * For CPU_VENDOR_ID:
+ * For CPUID_VENDOR_ID:
* Returns a string into buf.
*
- * For CPU_PROCINFO_AND_FEATUREBITS:
+ * For CPUID_PROCINFO_AND_FEATUREBITS:
* buf[0]: Stepping
* buf[1]: Model
* buf[2]: Family
* buf[9]: Logical Processors
* buf[10]: Initial APICID
*
- * For CPU_L1_CACHE_AND_TLB_IDS:
+ * For CPUID_L1_CACHE_AND_TLB_IDS:
* buf[0]: (eax):
* - 7..0 Number of times to exec cpuid to get all descriptors.
* - 15..8 Instruction TLB: 4K Pages, 4-way set associtive, 128 entries.
* - 16..23 Data TLB: 4M Pages, 4-way set associtive, 8 entires.
* - 24..31 1st-level data cache: 32K, 8-way set associtive, 64 byte line size
*
- * For CPU_HIGHEST_EXTENDED_FUNCTION_SUPPORTED:
+ * For CPUID_HIGHEST_EXTENDED_FUNCTION_SUPPORTED:
* Returns the highest supported function in *buf (expects an integer ofc)
*
- * For CPU_EXTENDED_PROC_INFO_FEATURE_BITS:
+ * For CPUID_EXTENDED_PROC_INFO_FEATURE_BITS:
* Returns them in buf[0] and buf[1].
*
- * For CPU_EXTENDED_L2_CACHE_FEATURES:
+ * For CPUID_EXTENDED_L2_CACHE_FEATURES:
* buf[0]: Line size
* buf[1]: Associativity
* buf[2]: Cache size.
*
- * For CPU_VIRT_PHYS_ADDR_SIZES:
+ * For CPUID_VIRT_PHYS_ADDR_SIZES:
* buf[0]: Physical
* buf[1]: Virtual
*
- * For CPU_PROC_BRAND_STRING:
+ * For CPUID_PROC_BRAND_STRING:
* Have a char array with at least 48 bytes assigned to it.
*
* Here's a page which will help you parse the data provided by this function.
*
* Returns true if feature is supported, false otherwise.
*
- * The feature parameter must be >= CPU_EXTENDED_PROC_INFO_FEATURE_BITS
- * and <= CPU_VIRT_PHYS_ADDR_SIZES.
+ * The feature parameter must be >= CPUID_EXTENDED_PROC_INFO_FEATURE_BITS
+ * and <= CPUID_VIRT_PHYS_ADDR_SIZES.
*/
bool cpuid_test_feature(cpuid_t feature);
printf ("Vendor ID: %s\n", cputype);
char buf[48];
- cpuid(CPU_PROC_BRAND_STRING, (uint32_t *)buf);
+ cpuid(CPUID_PROC_BRAND_STRING, (uint32_t *)buf);
printf ("Processor Brand: %s\n", buf);
uint32_t procinfo[11];
- cpuid(CPU_PROCINFO_AND_FEATUREBITS, procinfo);
+ cpuid(CPUID_PROCINFO_AND_FEATUREBITS, procinfo);
printf("Stepping: %d Model: 0x%X Family: %d extended model: %d extended family: %d\n",
procinfo[0], procinfo[1], procinfo[2], procinfo[3], procinfo[4]);
printf("Brand Index: %d CL Flush Line Size: %d Logical Processors: %d Initial APICID: %d\n",
printf ("Highest extended function supported: %#010x\n", cpuid_highest_ext_func_supported());
uint32_t phys_virt[2];
- cpuid(CPU_VIRT_PHYS_ADDR_SIZES, phys_virt);
+ cpuid(CPUID_VIRT_PHYS_ADDR_SIZES, phys_virt);
printf ("Physical address size: %d\nVirtual address size: %d\n", phys_virt[0], phys_virt[1]);
uint32_t extfeatures[2];
- cpuid(CPU_EXTENDED_PROC_INFO_FEATURE_BITS, extfeatures);
+ cpuid(CPUID_EXTENDED_PROC_INFO_FEATURE_BITS, extfeatures);
printf ("Extended processor info and feature bits: %d %d\n", extfeatures[0], extfeatures[1]);
uint32_t l2c[3];
- cpuid(CPU_EXTENDED_L2_CACHE_FEATURES, l2c);
+ cpuid(CPUID_EXTENDED_L2_CACHE_FEATURES, l2c);
printf("L2 Line size: %u bytes\tAssociativity: %02xh\tCache Size: %u KB\n",
l2c[0], l2c[1], l2c[2]);