| #include "libcflat.h" | |
| #include "processor.h" | |
| int main(void) | |
| { | |
| u64 t1, t2, t3, t4, t5; | |
| if (!this_cpu_has(X86_FEATURE_TSC_ADJUST)) { | |
| report_skip("MSR_IA32_TSC_ADJUST feature not enabled"); | |
| return report_summary(); | |
| } | |
| report(rdmsr(MSR_IA32_TSC_ADJUST) == 0x0, | |
| "MSR_IA32_TSC_ADJUST msr initialization"); | |
| t3 = 100000000000ull; | |
| t1 = rdtsc(); | |
| wrmsr(MSR_IA32_TSC_ADJUST, t3); | |
| t2 = rdtsc(); | |
| report(rdmsr(MSR_IA32_TSC_ADJUST) == t3, | |
| "MSR_IA32_TSC_ADJUST msr read / write"); | |
| report((t2 - t1) >= t3, | |
| "TSC adjustment for MSR_IA32_TSC_ADJUST value"); | |
| t3 = 0x0; | |
| wrmsr(MSR_IA32_TSC_ADJUST, t3); | |
| report(rdmsr(MSR_IA32_TSC_ADJUST) == t3, | |
| "MSR_IA32_TSC_ADJUST msr read / write"); | |
| t4 = 100000000000ull; | |
| t1 = rdtsc(); | |
| wrtsc(t4); | |
| t2 = rdtsc(); | |
| t5 = rdmsr(MSR_IA32_TSC_ADJUST); | |
| report(t1 <= t4 - t5, "Internal TSC advances across write to IA32_TSC"); | |
| report(t2 >= t4, "IA32_TSC advances after write to IA32_TSC"); | |
| return report_summary(); | |
| } |