1 #include "libcflat.h" 2 #include "processor.h" 3 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