|
@@ -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;
|
|
|
|