17d36db35SAvi Kivity #include "libcflat.h"
20d7251beSJason Wang #include "processor.h"
37d36db35SAvi Kivity
test_wrtsc(u64 t1)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
test_rdtscp(u64 aux)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);
19a299895bSThomas Huth report(ecx == aux, "Test RDTSCP %" PRIu64, aux);
20867f820dSPaolo Bonzini }
21867f820dSPaolo Bonzini
test_rdpid(u64 aux)22b29804b8SThomas Huth static void test_rdpid(u64 aux)
2310631a5bSPaolo Bonzini {
2410631a5bSPaolo Bonzini u32 eax;
2510631a5bSPaolo Bonzini
2610631a5bSPaolo Bonzini wrmsr(MSR_TSC_AUX, aux);
27*a467f767SDavid Matlack asm volatile (".byte 0xf3, 0x0f, 0xc7, 0xf8" : "=a" (eax));
28a299895bSThomas Huth report(eax == aux, "Test rdpid %%eax %" PRId64, aux);
2910631a5bSPaolo Bonzini }
3010631a5bSPaolo Bonzini
main(void)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