Commit 27959a44 authored by Junaid Shahid's avatar Junaid Shahid Committed by Radim Krčmář
Browse files

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: default avatarJunaid Shahid <junaids@google.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 114df303
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -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
 */
+14 −8
Original line number Diff line number Diff line
@@ -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;