--- /dev/null
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef __KVM_X86_VMX_COMMON_H
+#define __KVM_X86_VMX_COMMON_H
+
+#include <linux/kvm_host.h>
+
+#include "mmu.h"
+
+static inline int __vmx_handle_ept_violation(struct kvm_vcpu *vcpu, gpa_t gpa,
+                                            unsigned long exit_qualification)
+{
+       u64 error_code;
+
+       /* Is it a read fault? */
+       error_code = (exit_qualification & EPT_VIOLATION_ACC_READ)
+                    ? PFERR_USER_MASK : 0;
+       /* Is it a write fault? */
+       error_code |= (exit_qualification & EPT_VIOLATION_ACC_WRITE)
+                     ? PFERR_WRITE_MASK : 0;
+       /* Is it a fetch fault? */
+       error_code |= (exit_qualification & EPT_VIOLATION_ACC_INSTR)
+                     ? PFERR_FETCH_MASK : 0;
+       /* ept page table entry is present? */
+       error_code |= (exit_qualification & EPT_VIOLATION_RWX_MASK)
+                     ? PFERR_PRESENT_MASK : 0;
+
+       if (error_code & EPT_VIOLATION_GVA_IS_VALID)
+               error_code |= (exit_qualification & EPT_VIOLATION_GVA_TRANSLATED) ?
+                             PFERR_GUEST_FINAL_MASK : PFERR_GUEST_PAGE_MASK;
+
+       return kvm_mmu_page_fault(vcpu, gpa, error_code, NULL, 0);
+}
+
+#endif /* __KVM_X86_VMX_COMMON_H */
 
 #include <trace/events/ipi.h>
 
 #include "capabilities.h"
+#include "common.h"
 #include "cpuid.h"
 #include "hyperv.h"
 #include "kvm_onhyperv.h"
 
 static int handle_ept_violation(struct kvm_vcpu *vcpu)
 {
-       unsigned long exit_qualification;
+       unsigned long exit_qualification = vmx_get_exit_qual(vcpu);
        gpa_t gpa;
-       u64 error_code;
-
-       exit_qualification = vmx_get_exit_qual(vcpu);
 
        /*
         * EPT violation happened while executing iret from NMI,
        gpa = vmcs_read64(GUEST_PHYSICAL_ADDRESS);
        trace_kvm_page_fault(vcpu, gpa, exit_qualification);
 
-       /* Is it a read fault? */
-       error_code = (exit_qualification & EPT_VIOLATION_ACC_READ)
-                    ? PFERR_USER_MASK : 0;
-       /* Is it a write fault? */
-       error_code |= (exit_qualification & EPT_VIOLATION_ACC_WRITE)
-                     ? PFERR_WRITE_MASK : 0;
-       /* Is it a fetch fault? */
-       error_code |= (exit_qualification & EPT_VIOLATION_ACC_INSTR)
-                     ? PFERR_FETCH_MASK : 0;
-       /* ept page table entry is present? */
-       error_code |= (exit_qualification & EPT_VIOLATION_RWX_MASK)
-                     ? PFERR_PRESENT_MASK : 0;
-
-       if (error_code & EPT_VIOLATION_GVA_IS_VALID)
-               error_code |= (exit_qualification & EPT_VIOLATION_GVA_TRANSLATED) ?
-                             PFERR_GUEST_FINAL_MASK : PFERR_GUEST_PAGE_MASK;
-
        /*
         * Check that the GPA doesn't exceed physical memory limits, as that is
         * a guest page fault.  We have to emulate the instruction here, because
        if (unlikely(allow_smaller_maxphyaddr && !kvm_vcpu_is_legal_gpa(vcpu, gpa)))
                return kvm_emulate_instruction(vcpu, 0);
 
-       return kvm_mmu_page_fault(vcpu, gpa, error_code, NULL, 0);
+       return __vmx_handle_ept_violation(vcpu, gpa, exit_qualification);
 }
 
 static int handle_ept_misconfig(struct kvm_vcpu *vcpu)