x86/hvm: Assert some expectations in hvm_inject_event()
authorAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 2 Dec 2016 13:18:38 +0000 (13:18 +0000)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Mon, 5 Dec 2016 15:04:58 +0000 (15:04 +0000)
Check that event->error_code is appropriate for the type/vector combination.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
xen/arch/x86/hvm/hvm.c

index e0f936b9853ac814154ea51f6dd170d8e8f90481..7763798f50eb5803e1312c0b8c5bdece6d676ee4 100644 (file)
@@ -1679,6 +1679,15 @@ void hvm_triple_fault(void)
 void hvm_inject_event(const struct x86_event *event)
 {
     struct vcpu *curr = current;
+    const uint8_t vector = event->vector;
+    const bool has_ec = ((event->type == X86_EVENTTYPE_HW_EXCEPTION) &&
+                         (vector < 32) && ((TRAP_HAVE_EC & (1u << vector))));
+
+    ASSERT(vector == event->vector); /* Confirm no truncation. */
+    if ( has_ec )
+        ASSERT(event->error_code != X86_EVENT_NO_EC);
+    else
+        ASSERT(event->error_code == X86_EVENT_NO_EC);
 
     if ( nestedhvm_enabled(curr->domain) &&
          !nestedhvm_vmswitch_in_progress(curr) &&