OSDN Git Service

KVM: selftests: assert on exit reason in CR4/cpuid sync test
authorSean Christopherson <sean.j.christopherson@intel.com>
Wed, 13 Mar 2019 20:19:26 +0000 (13:19 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 28 Mar 2019 16:29:05 +0000 (17:29 +0100)
...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>
tools/testing/selftests/kvm/x86_64/cr4_cpuid_sync_test.c

index d503a51..7c2c4d4 100644 (file)
@@ -87,22 +87,25 @@ int main(int argc, char *argv[])
        while (1) {
                rc = _vcpu_run(vm, VCPU_ID);
 
-               if (run->exit_reason == KVM_EXIT_IO) {
-                       switch (get_ucall(vm, VCPU_ID, &uc)) {
-                       case UCALL_SYNC:
-                               /* emulate hypervisor clearing CR4.OSXSAVE */
-                               vcpu_sregs_get(vm, VCPU_ID, &sregs);
-                               sregs.cr4 &= ~X86_CR4_OSXSAVE;
-                               vcpu_sregs_set(vm, VCPU_ID, &sregs);
-                               break;
-                       case UCALL_ABORT:
-                               TEST_ASSERT(false, "Guest CR4 bit (OSXSAVE) unsynchronized with CPUID bit.");
-                               break;
-                       case UCALL_DONE:
-                               goto done;
-                       default:
-                               TEST_ASSERT(false, "Unknown ucall 0x%x.", uc.cmd);
-                       }
+               TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
+                           "Unexpected exit reason: %u (%s),\n",
+                           run->exit_reason,
+                           exit_reason_str(run->exit_reason));
+
+               switch (get_ucall(vm, VCPU_ID, &uc)) {
+               case UCALL_SYNC:
+                       /* emulate hypervisor clearing CR4.OSXSAVE */
+                       vcpu_sregs_get(vm, VCPU_ID, &sregs);
+                       sregs.cr4 &= ~X86_CR4_OSXSAVE;
+                       vcpu_sregs_set(vm, VCPU_ID, &sregs);
+                       break;
+               case UCALL_ABORT:
+                       TEST_ASSERT(false, "Guest CR4 bit (OSXSAVE) unsynchronized with CPUID bit.");
+                       break;
+               case UCALL_DONE:
+                       goto done;
+               default:
+                       TEST_ASSERT(false, "Unknown ucall 0x%x.", uc.cmd);
                }
        }