+#define FIXED_PMC (1 << 30)
+#define FIXED_PMC0 (FIXED_PMC)
+#define FIXED_PMC1 (FIXED_PMC | 1)
+#define FIXED_PMC2 (FIXED_PMC | 2)
+
+static inline uint64_t read_pmc(uint32_t counter)
+{
+ uint32_t lo = 0, hi = 0;
+ __asm__ volatile("rdpmc" : "=a" (lo), "=d" (hi) : "c" (counter));
+ return ((((uint64_t)hi) << 32) | ((uint64_t)lo));
+}