ping ________________________________________ From: Zhou, Jie2X Sent: Tuesday, November 23, 2021 6:42 PM To: pbonzini@xxxxxxxxxx Cc: shuah@xxxxxxxxxx; maz@xxxxxxxxxx; ricarkol@xxxxxxxxxx; drjones@xxxxxxxxxx; kvm@xxxxxxxxxxxxxxx; linux-kselftest@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; Li, Philip; Li, ZhijianX Subject: kernel-selftests/kvm: kvm.tsc_msrs_test.fail hi, When I do the kvm test in kernel v5.15 by "make run_tests -C tools/testing/selftests/kvm" get following error. # selftests: kvm: tsc_msrs_test # ==== Test Assertion Failure ==== # x86_64/tsc_msrs_test.c:88: false # pid=10432 tid=10432 errno=4 - Interrupted system call # 1 0x0000000000403168: run_vcpu at tsc_msrs_test.c:86 # 2 0x000000000040297a: main at tsc_msrs_test.c:150 # 3 0x00007f064f88509a: ?? ??:0 # 4 0x0000000000402a89: _start at ??:? # Failed guest assert: rounded_rdmsr(MSR_IA32_TSC) == val at x86_64/tsc_msrs_test.c:63 # values: 0x1200000000, 0x400000000 The MSR_IA32_TSC register can not be set correctly in guest mode in some machine. But MSR_IA32_TSC register can be set correctly in host mode in that machine. Although there are two CPU mode machines both support following function. IA32_TSC_ADJUST MSR supported = true TSC: time stamp counter = true Test passed in cpu mode: Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz Test failed in cpu mode: Intel(R) Core(TM) i7-6770HQ CPU @ 2.60GHz. Add print code to check MSR_IA32_TSC value. tools/testing/selftests/kvm/x86_64/tsc_msrs_test.c @@ -151,6 +151,7 @@ int main(void) val = 4ull * GUEST_STEP; - ASSERT_EQ(rounded_host_rdmsr(MSR_IA32_TSC), val); ASSERT_EQ(rounded_host_rdmsr(MSR_IA32_TSC_ADJUST), val - HOST_ADJUST); + printf("MSR_IA32_TSC: %llx, MSR_IA32_TSC_ADJUST: %llx, TSC_val: %llx, ADJUST_val: %llx\n\n", rounded_host_rdmsr(MSR_IA32_TSC), rounded_host_rdmsr(MSR_IA32_TSC_ADJUST), val, val - HOST_ADJUST); In test passed machine(i7-6700) set MSR_IA32_TSC to 0x400000000 and get 0x400000000. ./kvm/x86_64/tsc_msrs_test MSR_IA32_TSC: 400000000, MSR_IA32_TSC_ADJUST: fffffff400000000, TSC_val: 400000000, ADJUST_val: fffffff400000000 In test failed machine(i7-6770HQ) set MSR_IA32_TSC to 0x400000000 but get 0x1200000000. ./kvm/x86_64/tsc_msrs_test MSR_IA32_TSC: 1200000000, MSR_IA32_TSC_ADJUST: fffffff400000000, TSC_val: 400000000, ADJUST_val: fffffff400000000 Try to set MSR_IA32_TSC in host mode in test failed machine(i7-6770HQ). tools/testing/selftests/kvm/x86_64/tsc_msrs_test.c @@ -151,6 +151,7 @@ int main(void) val = 4ull * GUEST_STEP; + vcpu_set_msr(vm, 0, MSR_IA32_TSC, val); + vcpu_set_msr(vm, 0, MSR_IA32_TSC_ADJUST, val - HOST_ADJUST); ASSERT_EQ(rounded_host_rdmsr(MSR_IA32_TSC), val); ASSERT_EQ(rounded_host_rdmsr(MSR_IA32_TSC_ADJUST), val - HOST_ADJUST); + printf("MSR_IA32_TSC: %llx, MSR_IA32_TSC_ADJUST: %llx, TSC_val: %llx, ADJUST_val: %llx\n\n", rounded_host_rdmsr(MSR_IA32_TSC), rounded_host_rdmsr(MSR_IA32_TSC_ADJUST), val, val - HOST_ADJUST); The output show MSR_IA32_TSC value is set correctly. MSR_IA32_TSC: 400000000, MSR_IA32_TSC_ADJUST: fffffff400000000, TSC_val: 400000000, ADJUST_val: fffffff400000000 Why the MSR_IA32_TSC register can not be set correctly in guest mode in test failed machine(i7-6770HQ)? best regards,