xref: /kvm-unit-tests/x86/tsc.c (revision 7d36db351752e29ad27eaafe3f102de7064e429b)
1*7d36db35SAvi Kivity #include "libcflat.h"
2*7d36db35SAvi Kivity 
3*7d36db35SAvi Kivity u64 rdtsc(void)
4*7d36db35SAvi Kivity {
5*7d36db35SAvi Kivity 	unsigned a, d;
6*7d36db35SAvi Kivity 
7*7d36db35SAvi Kivity 	asm volatile("rdtsc" : "=a"(a), "=d"(d));
8*7d36db35SAvi Kivity 	return a | (u64)d << 32;
9*7d36db35SAvi Kivity }
10*7d36db35SAvi Kivity 
11*7d36db35SAvi Kivity void wrtsc(u64 tsc)
12*7d36db35SAvi Kivity {
13*7d36db35SAvi Kivity 	unsigned a = tsc, d = tsc >> 32;
14*7d36db35SAvi Kivity 
15*7d36db35SAvi Kivity 	asm volatile("wrmsr" : : "a"(a), "d"(d), "c"(0x10));
16*7d36db35SAvi Kivity }
17*7d36db35SAvi Kivity 
18*7d36db35SAvi Kivity void test_wrtsc(u64 t1)
19*7d36db35SAvi Kivity {
20*7d36db35SAvi Kivity 	u64 t2;
21*7d36db35SAvi Kivity 
22*7d36db35SAvi Kivity 	wrtsc(t1);
23*7d36db35SAvi Kivity 	t2 = rdtsc();
24*7d36db35SAvi Kivity 	printf("rdtsc after wrtsc(%lld): %lld\n", t1, t2);
25*7d36db35SAvi Kivity }
26*7d36db35SAvi Kivity 
27*7d36db35SAvi Kivity int main()
28*7d36db35SAvi Kivity {
29*7d36db35SAvi Kivity 	u64 t1, t2;
30*7d36db35SAvi Kivity 
31*7d36db35SAvi Kivity 	t1 = rdtsc();
32*7d36db35SAvi Kivity 	t2 = rdtsc();
33*7d36db35SAvi Kivity 	printf("rdtsc latency %lld\n", (unsigned)(t2 - t1));
34*7d36db35SAvi Kivity 
35*7d36db35SAvi Kivity 	test_wrtsc(0);
36*7d36db35SAvi Kivity 	test_wrtsc(100000000000ull);
37*7d36db35SAvi Kivity 	return 0;
38*7d36db35SAvi Kivity }
39