kvm: x86: mmu: Use symbolic constants for EPT Violation Exit Qualifications
authorJunaid Shahid <junaids@google.com>
Wed, 7 Dec 2016 00:46:10 +0000 (16:46 -0800)
committerRadim Krčmář <rkrcmar@redhat.com>
Mon, 9 Jan 2017 13:46:05 +0000 (14:46 +0100)
This change adds some symbolic constants for VM Exit Qualifications
related to EPT Violations and updates handle_ept_violation() to use
these constants instead of hard-coded numbers.

Signed-off-by: Junaid Shahid <junaids@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/include/asm/vmx.h
arch/x86/kvm/vmx.c

index 2b5b2d4b924e17e0b15ca3a4cdfd88829ff5adea..25a482fb52415119b88e21f6f8a4f8944e2527f9 100644 (file)
@@ -499,6 +499,22 @@ struct vmx_msr_entry {
 #define ENTRY_FAIL_NMI                 3
 #define ENTRY_FAIL_VMCS_LINK_PTR       4
 
+/*
+ * Exit Qualifications for EPT Violations
+ */
+#define EPT_VIOLATION_READ_BIT         0
+#define EPT_VIOLATION_WRITE_BIT                1
+#define EPT_VIOLATION_INSTR_BIT                2
+#define EPT_VIOLATION_READABLE_BIT     3
+#define EPT_VIOLATION_WRITABLE_BIT     4
+#define EPT_VIOLATION_EXECUTABLE_BIT   5
+#define EPT_VIOLATION_READ             (1 << EPT_VIOLATION_READ_BIT)
+#define EPT_VIOLATION_WRITE            (1 << EPT_VIOLATION_WRITE_BIT)
+#define EPT_VIOLATION_INSTR            (1 << EPT_VIOLATION_INSTR_BIT)
+#define EPT_VIOLATION_READABLE         (1 << EPT_VIOLATION_READABLE_BIT)
+#define EPT_VIOLATION_WRITABLE         (1 << EPT_VIOLATION_WRITABLE_BIT)
+#define EPT_VIOLATION_EXECUTABLE       (1 << EPT_VIOLATION_EXECUTABLE_BIT)
+
 /*
  * VM-instruction error numbers
  */
index a236decb81e4ffca42525d8a9cd3d5d8c98916a9..81159a3878f4e2589391d1df590b73750096cb5c 100644 (file)
@@ -6374,14 +6374,20 @@ static int handle_ept_violation(struct kvm_vcpu *vcpu)
        gpa = vmcs_read64(GUEST_PHYSICAL_ADDRESS);
        trace_kvm_page_fault(gpa, exit_qualification);
 
-       /* it is a read fault? */
-       error_code = (exit_qualification << 2) & PFERR_USER_MASK;
-       /* it is a write fault? */
-       error_code |= exit_qualification & PFERR_WRITE_MASK;
-       /* It is a fetch fault? */
-       error_code |= (exit_qualification << 2) & PFERR_FETCH_MASK;
-       /* ept page table is present? */
-       error_code |= (exit_qualification & 0x38) != 0;
+       /* Is it a read fault? */
+       error_code = (exit_qualification & EPT_VIOLATION_READ)
+                    ? PFERR_USER_MASK : 0;
+       /* Is it a write fault? */
+       error_code |= (exit_qualification & EPT_VIOLATION_WRITE)
+                     ? PFERR_WRITE_MASK : 0;
+       /* Is it a fetch fault? */
+       error_code |= (exit_qualification & EPT_VIOLATION_INSTR)
+                     ? PFERR_FETCH_MASK : 0;
+       /* ept page table entry is present? */
+       error_code |= (exit_qualification &
+                      (EPT_VIOLATION_READABLE | EPT_VIOLATION_WRITABLE |
+                       EPT_VIOLATION_EXECUTABLE))
+                     ? PFERR_PRESENT_MASK : 0;
 
        vcpu->arch.exit_qualification = exit_qualification;