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