#include #include #include #include typedef struct { unsigned int version:8; unsigned int num_cnt:8; unsigned int cnt_width:8; unsigned int ebx_length:8; } pmu_eax_t; static inline void cpuid(unsigned int op, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx) { __asm__("cpuid" : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) : "0" (op), "c"(0)); } int main(void) { unsigned int ecx, ebx, edx; union { unsigned int val; pmu_eax_t eax; } eax; cpuid(0, &eax.val, &ebx, &ecx, &edx); if (eax.val < 0xa) { printf("does not support architected PMU\n"); return 0; } cpuid(0xa, &eax.val, &ebx, &ecx, &edx); printf("eax=0x%lx: version=%d num_cnt=%d\n", eax.val, eax.eax.version, eax.eax.num_cnt); return 0; }