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