summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorSean Christopherson <sean.j.christopherson@intel.com>2019-03-13 16:19:26 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2019-03-28 12:29:05 -0400
commit8df98ae0ab2ead9a02228756eec26f8d7b17f499 (patch)
tree40d26f4c896b1243c1f1f937b98fcb235ab15b5c /tools
parent45def77ebf79e2e8942b89ed79294d97ce914fa0 (diff)
KVM: selftests: assert on exit reason in CR4/cpuid sync test
...so that the test doesn't end up in an infinite loop if it fails for whatever reason, e.g. SHUTDOWN due to gcc inserting stack canary code into ucall() and attempting to derefence a null segment. Fixes: ca359066889f7 ("kvm: selftests: add cr4_cpuid_sync_test") Cc: Wei Huang <wei@redhat.com> Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/testing/selftests/kvm/x86_64/cr4_cpuid_sync_test.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/tools/testing/selftests/kvm/x86_64/cr4_cpuid_sync_test.c b/tools/testing/selftests/kvm/x86_64/cr4_cpuid_sync_test.c
index d503a51fad30..7c2c4d4055a8 100644
--- a/tools/testing/selftests/kvm/x86_64/cr4_cpuid_sync_test.c
+++ b/tools/testing/selftests/kvm/x86_64/cr4_cpuid_sync_test.c
@@ -87,22 +87,25 @@ int main(int argc, char *argv[])
87 while (1) { 87 while (1) {
88 rc = _vcpu_run(vm, VCPU_ID); 88 rc = _vcpu_run(vm, VCPU_ID);
89 89
90 if (run->exit_reason == KVM_EXIT_IO) { 90 TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
91 switch (get_ucall(vm, VCPU_ID, &uc)) { 91 "Unexpected exit reason: %u (%s),\n",
92 case UCALL_SYNC: 92 run->exit_reason,
93 /* emulate hypervisor clearing CR4.OSXSAVE */ 93 exit_reason_str(run->exit_reason));
94 vcpu_sregs_get(vm, VCPU_ID, &sregs); 94
95 sregs.cr4 &= ~X86_CR4_OSXSAVE; 95 switch (get_ucall(vm, VCPU_ID, &uc)) {
96 vcpu_sregs_set(vm, VCPU_ID, &sregs); 96 case UCALL_SYNC:
97 break; 97 /* emulate hypervisor clearing CR4.OSXSAVE */
98 case UCALL_ABORT: 98 vcpu_sregs_get(vm, VCPU_ID, &sregs);
99 TEST_ASSERT(false, "Guest CR4 bit (OSXSAVE) unsynchronized with CPUID bit."); 99 sregs.cr4 &= ~X86_CR4_OSXSAVE;
100 break; 100 vcpu_sregs_set(vm, VCPU_ID, &sregs);
101 case UCALL_DONE: 101 break;
102 goto done; 102 case UCALL_ABORT:
103 default: 103 TEST_ASSERT(false, "Guest CR4 bit (OSXSAVE) unsynchronized with CPUID bit.");
104 TEST_ASSERT(false, "Unknown ucall 0x%x.", uc.cmd); 104 break;
105 } 105 case UCALL_DONE:
106 goto done;
107 default:
108 TEST_ASSERT(false, "Unknown ucall 0x%x.", uc.cmd);
106 } 109 }
107 } 110 }
108 111