xref: /kvm-unit-tests/x86/tsc.c (revision 867f820d405ea6ce5fe49ee8f75a2f97a08c7adf)
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