xref: /kvm-unit-tests/x86/tsc_adjust.c (revision 164c04b4742fab042a086050c269f00aefeba17e)
1 #include "libcflat.h"
2 #include "processor.h"
3 
main(void)4 int main(void)
5 {
6 	u64 t1, t2, t3, t4, t5;
7 
8 	if (!this_cpu_has(X86_FEATURE_TSC_ADJUST)) {
9 		report_skip("MSR_IA32_TSC_ADJUST feature not enabled");
10 		return report_summary();
11 	}
12 
13 	report(rdmsr(MSR_IA32_TSC_ADJUST) == 0x0,
14 	       "MSR_IA32_TSC_ADJUST msr initialization");
15 	t3 = 100000000000ull;
16 	t1 = rdtsc();
17 	wrmsr(MSR_IA32_TSC_ADJUST, t3);
18 	t2 = rdtsc();
19 	report(rdmsr(MSR_IA32_TSC_ADJUST) == t3,
20 	       "MSR_IA32_TSC_ADJUST msr read / write");
21 	report((t2 - t1) >= t3,
22 	       "TSC adjustment for MSR_IA32_TSC_ADJUST value");
23 	t3 = 0x0;
24 	wrmsr(MSR_IA32_TSC_ADJUST, t3);
25 	report(rdmsr(MSR_IA32_TSC_ADJUST) == t3,
26 	       "MSR_IA32_TSC_ADJUST msr read / write");
27 	t4 = 100000000000ull;
28 	t1 = rdtsc();
29 	wrtsc(t4);
30 	t2 = rdtsc();
31 	t5 = rdmsr(MSR_IA32_TSC_ADJUST);
32 	report(t1 <= t4 - t5, "Internal TSC advances across write to IA32_TSC");
33 	report(t2 >= t4, "IA32_TSC advances after write to IA32_TSC");
34 
35 	return report_summary();
36 }
37