提交 27959a44 编写于 作者: J Junaid Shahid 提交者: Radim Krčmář

kvm: x86: mmu: Use symbolic constants for EPT Violation Exit Qualifications

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: NJunaid Shahid <junaids@google.com>
Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
上级 114df303
...@@ -499,6 +499,22 @@ struct vmx_msr_entry { ...@@ -499,6 +499,22 @@ struct vmx_msr_entry {
#define ENTRY_FAIL_NMI 3 #define ENTRY_FAIL_NMI 3
#define ENTRY_FAIL_VMCS_LINK_PTR 4 #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 * VM-instruction error numbers
*/ */
......
...@@ -6374,14 +6374,20 @@ static int handle_ept_violation(struct kvm_vcpu *vcpu) ...@@ -6374,14 +6374,20 @@ static int handle_ept_violation(struct kvm_vcpu *vcpu)
gpa = vmcs_read64(GUEST_PHYSICAL_ADDRESS); gpa = vmcs_read64(GUEST_PHYSICAL_ADDRESS);
trace_kvm_page_fault(gpa, exit_qualification); trace_kvm_page_fault(gpa, exit_qualification);
/* it is a read fault? */ /* Is it a read fault? */
error_code = (exit_qualification << 2) & PFERR_USER_MASK; error_code = (exit_qualification & EPT_VIOLATION_READ)
/* it is a write fault? */ ? PFERR_USER_MASK : 0;
error_code |= exit_qualification & PFERR_WRITE_MASK; /* Is it a write fault? */
/* It is a fetch fault? */ error_code |= (exit_qualification & EPT_VIOLATION_WRITE)
error_code |= (exit_qualification << 2) & PFERR_FETCH_MASK; ? PFERR_WRITE_MASK : 0;
/* ept page table is present? */ /* Is it a fetch fault? */
error_code |= (exit_qualification & 0x38) != 0; 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; vcpu->arch.exit_qualification = exit_qualification;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册