| #include "libcflat.h" |
| #include "processor.h" |
| |
| static void test_wrtsc(u64 t1) |
| { |
| u64 t2; |
| |
| wrtsc(t1); |
| t2 = rdtsc(); |
| printf("rdtsc after wrtsc(%" PRId64 "): %" PRId64 "\n", t1, t2); |
| } |
| |
| static void test_rdtscp(u64 aux) |
| { |
| u32 ecx; |
| |
| wrmsr(MSR_TSC_AUX, aux); |
| rdtscp(&ecx); |
| report(ecx == aux, "Test RDTSCP %" PRIu64, aux); |
| } |
| |
| static void test_rdpid(u64 aux) |
| { |
| u32 eax; |
| |
| wrmsr(MSR_TSC_AUX, aux); |
| asm volatile (".byte 0xf3, 0x0f, 0xc7, 0xf8" : "=a" (eax)); |
| report(eax == aux, "Test rdpid %%eax %" PRId64, aux); |
| } |
| |
| int main(void) |
| { |
| u64 t1, t2; |
| |
| t1 = rdtsc(); |
| t2 = rdtsc(); |
| printf("rdtsc latency %u\n", (unsigned)(t2 - t1)); |
| |
| test_wrtsc(0); |
| test_wrtsc(100000000000ull); |
| |
| if (this_cpu_has(X86_FEATURE_RDTSCP)) { |
| test_rdtscp(0); |
| test_rdtscp(10); |
| test_rdtscp(0x100); |
| } else |
| printf("rdtscp not supported\n"); |
| |
| if (this_cpu_has(X86_FEATURE_RDPID)) { |
| test_rdpid(0); |
| test_rdpid(10); |
| test_rdpid(0x100); |
| } else |
| printf("rdpid not supported\n"); |
| return report_summary(); |
| } |