| #include "libcflat.h" |
| #include "processor.h" |
| |
| #define CPUID_80000001_EDX_RDTSCP (1 << 27) |
| int check_cpuid_80000001_edx(unsigned int bit) |
| { |
| return (cpuid(0x80000001).d & bit) != 0; |
| } |
| |
| |
| void test_wrtsc(u64 t1) |
| { |
| u64 t2; |
| |
| wrtsc(t1); |
| t2 = rdtsc(); |
| printf("rdtsc after wrtsc(%" PRId64 "): %" PRId64 "\n", t1, t2); |
| } |
| |
| void test_rdtscp(u64 aux) |
| { |
| u32 ecx; |
| |
| wrmsr(MSR_TSC_AUX, aux); |
| rdtscp(&ecx); |
| report("Test RDTSCP %d", ecx == aux, aux); |
| } |
| |
| int main() |
| { |
| u64 t1, t2; |
| |
| t1 = rdtsc(); |
| t2 = rdtsc(); |
| printf("rdtsc latency %u\n", (unsigned)(t2 - t1)); |
| |
| test_wrtsc(0); |
| test_wrtsc(100000000000ull); |
| |
| if (check_cpuid_80000001_edx(CPUID_80000001_EDX_RDTSCP)) { |
| test_rdtscp(0); |
| test_rdtscp(10); |
| test_rdtscp(0x100); |
| } else |
| printf("rdtscp not supported\n"); |
| return report_summary(); |
| } |