17d36db35SAvi Kivity #include "libcflat.h" 20d7251beSJason Wang #include "processor.h" 37d36db35SAvi Kivity 4*867f820dSPaolo Bonzini #define CPUID_80000001_EDX_RDTSCP (1 << 27) 5*867f820dSPaolo Bonzini int check_cpuid_80000001_edx(unsigned int bit) 6*867f820dSPaolo Bonzini { 7*867f820dSPaolo Bonzini return (cpuid(0x80000001).d & bit) != 0; 8*867f820dSPaolo Bonzini } 9*867f820dSPaolo Bonzini 10*867f820dSPaolo Bonzini 117d36db35SAvi Kivity void test_wrtsc(u64 t1) 127d36db35SAvi Kivity { 137d36db35SAvi Kivity u64 t2; 147d36db35SAvi Kivity 157d36db35SAvi Kivity wrtsc(t1); 167d36db35SAvi Kivity t2 = rdtsc(); 177d36db35SAvi Kivity printf("rdtsc after wrtsc(%lld): %lld\n", t1, t2); 187d36db35SAvi Kivity } 197d36db35SAvi Kivity 20*867f820dSPaolo Bonzini void test_rdtscp(u64 aux) 21*867f820dSPaolo Bonzini { 22*867f820dSPaolo Bonzini u32 ecx; 23*867f820dSPaolo Bonzini 24*867f820dSPaolo Bonzini wrmsr(MSR_TSC_AUX, aux); 25*867f820dSPaolo Bonzini rdtscp(&ecx); 26*867f820dSPaolo Bonzini report("Test RDTSCP %d", ecx == aux, aux); 27*867f820dSPaolo Bonzini } 28*867f820dSPaolo Bonzini 297d36db35SAvi Kivity int main() 307d36db35SAvi Kivity { 317d36db35SAvi Kivity u64 t1, t2; 327d36db35SAvi Kivity 337d36db35SAvi Kivity t1 = rdtsc(); 347d36db35SAvi Kivity t2 = rdtsc(); 357d36db35SAvi Kivity printf("rdtsc latency %lld\n", (unsigned)(t2 - t1)); 367d36db35SAvi Kivity 377d36db35SAvi Kivity test_wrtsc(0); 387d36db35SAvi Kivity test_wrtsc(100000000000ull); 39*867f820dSPaolo Bonzini 40*867f820dSPaolo Bonzini if (check_cpuid_80000001_edx(CPUID_80000001_EDX_RDTSCP)) { 41*867f820dSPaolo Bonzini test_rdtscp(0); 42*867f820dSPaolo Bonzini test_rdtscp(10); 43*867f820dSPaolo Bonzini test_rdtscp(0x100); 44*867f820dSPaolo Bonzini } else 45*867f820dSPaolo Bonzini printf("rdtscp not supported\n"); 467d36db35SAvi Kivity return 0; 477d36db35SAvi Kivity } 48