17d36db35SAvi Kivity #include "libcflat.h" 20d7251beSJason Wang #include "processor.h" 37d36db35SAvi Kivity 4db4898e8SThomas Huth static void test_wrtsc(u64 t1) 57d36db35SAvi Kivity { 67d36db35SAvi Kivity u64 t2; 77d36db35SAvi Kivity 87d36db35SAvi Kivity wrtsc(t1); 97d36db35SAvi Kivity t2 = rdtsc(); 10b006d7ebSAndrew Jones printf("rdtsc after wrtsc(%" PRId64 "): %" PRId64 "\n", t1, t2); 117d36db35SAvi Kivity } 127d36db35SAvi Kivity 13db4898e8SThomas Huth static void test_rdtscp(u64 aux) 14867f820dSPaolo Bonzini { 15867f820dSPaolo Bonzini u32 ecx; 16867f820dSPaolo Bonzini 17867f820dSPaolo Bonzini wrmsr(MSR_TSC_AUX, aux); 18867f820dSPaolo Bonzini rdtscp(&ecx); 19*a299895bSThomas Huth report(ecx == aux, "Test RDTSCP %" PRIu64, aux); 20867f820dSPaolo Bonzini } 21867f820dSPaolo Bonzini 22b29804b8SThomas Huth static void test_rdpid(u64 aux) 2310631a5bSPaolo Bonzini { 2410631a5bSPaolo Bonzini u32 eax; 2510631a5bSPaolo Bonzini 2610631a5bSPaolo Bonzini wrmsr(MSR_TSC_AUX, aux); 2710631a5bSPaolo Bonzini asm (".byte 0xf3, 0x0f, 0xc7, 0xf8" : "=a" (eax)); 28*a299895bSThomas Huth report(eax == aux, "Test rdpid %%eax %" PRId64, aux); 2910631a5bSPaolo Bonzini } 3010631a5bSPaolo Bonzini 317db17e21SThomas Huth int main(void) 327d36db35SAvi Kivity { 337d36db35SAvi Kivity u64 t1, t2; 347d36db35SAvi Kivity 357d36db35SAvi Kivity t1 = rdtsc(); 367d36db35SAvi Kivity t2 = rdtsc(); 37b006d7ebSAndrew Jones printf("rdtsc latency %u\n", (unsigned)(t2 - t1)); 387d36db35SAvi Kivity 397d36db35SAvi Kivity test_wrtsc(0); 407d36db35SAvi Kivity test_wrtsc(100000000000ull); 41867f820dSPaolo Bonzini 42badc98caSKrish Sadhukhan if (this_cpu_has(X86_FEATURE_RDTSCP)) { 43867f820dSPaolo Bonzini test_rdtscp(0); 44867f820dSPaolo Bonzini test_rdtscp(10); 45867f820dSPaolo Bonzini test_rdtscp(0x100); 46867f820dSPaolo Bonzini } else 47867f820dSPaolo Bonzini printf("rdtscp not supported\n"); 4810631a5bSPaolo Bonzini 49badc98caSKrish Sadhukhan if (this_cpu_has(X86_FEATURE_RDPID)) { 5010631a5bSPaolo Bonzini test_rdpid(0); 5110631a5bSPaolo Bonzini test_rdpid(10); 5210631a5bSPaolo Bonzini test_rdpid(0x100); 5310631a5bSPaolo Bonzini } else 5410631a5bSPaolo Bonzini printf("rdpid not supported\n"); 5532b9603cSRadim Krčmář return report_summary(); 567d36db35SAvi Kivity } 57