return false;
 }
 
-static bool page_fault_can_be_fast(u32 error_code)
+static bool page_fault_can_be_fast(struct kvm_page_fault *fault)
 {
        /*
         * Do not fix the mmio spte with invalid generation number which
         * need to be updated by slow page fault path.
         */
-       if (unlikely(error_code & PFERR_RSVD_MASK))
+       if (fault->rsvd)
                return false;
 
        /* See if the page fault is due to an NX violation */
-       if (unlikely(((error_code & (PFERR_FETCH_MASK | PFERR_PRESENT_MASK))
-                     == (PFERR_FETCH_MASK | PFERR_PRESENT_MASK))))
+       if (unlikely(fault->exec && fault->present))
                return false;
 
        /*
         * accesses to a present page.
         */
 
-       return shadow_acc_track_mask != 0 ||
-              ((error_code & (PFERR_WRITE_MASK | PFERR_PRESENT_MASK))
-               == (PFERR_WRITE_MASK | PFERR_PRESENT_MASK));
+       return shadow_acc_track_mask != 0 || (fault->write && fault->present);
 }
 
 /*
        return true;
 }
 
-static bool is_access_allowed(u32 fault_err_code, u64 spte)
+static bool is_access_allowed(struct kvm_page_fault *fault, u64 spte)
 {
-       if (fault_err_code & PFERR_FETCH_MASK)
+       if (fault->exec)
                return is_executable_pte(spte);
 
-       if (fault_err_code & PFERR_WRITE_MASK)
+       if (fault->write)
                return is_writable_pte(spte);
 
        /* Fault was on Read access */
 /*
  * Returns one of RET_PF_INVALID, RET_PF_FIXED or RET_PF_SPURIOUS.
  */
-static int fast_page_fault(struct kvm_vcpu *vcpu, gpa_t gpa, u32 error_code)
+static int fast_page_fault(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault)
 {
        struct kvm_mmu_page *sp;
        int ret = RET_PF_INVALID;
        u64 *sptep = NULL;
        uint retry_count = 0;
 
-       if (!page_fault_can_be_fast(error_code))
+       if (!page_fault_can_be_fast(fault))
                return ret;
 
        walk_shadow_page_lockless_begin(vcpu);
                u64 new_spte;
 
                if (is_tdp_mmu(vcpu->arch.mmu))
-                       sptep = kvm_tdp_mmu_fast_pf_get_last_sptep(vcpu, gpa, &spte);
+                       sptep = kvm_tdp_mmu_fast_pf_get_last_sptep(vcpu, fault->addr, &spte);
                else
-                       sptep = fast_pf_get_last_sptep(vcpu, gpa, &spte);
+                       sptep = fast_pf_get_last_sptep(vcpu, fault->addr, &spte);
 
                if (!is_shadow_present_pte(spte))
                        break;
                 * Need not check the access of upper level table entries since
                 * they are always ACC_ALL.
                 */
-               if (is_access_allowed(error_code, spte)) {
+               if (is_access_allowed(fault, spte)) {
                        ret = RET_PF_SPURIOUS;
                        break;
                }
                 * be removed in the fast path only if the SPTE was
                 * write-protected for dirty-logging or access tracking.
                 */
-               if ((error_code & PFERR_WRITE_MASK) &&
+               if (fault->write &&
                    spte_can_locklessly_be_made_writable(spte)) {
                        new_spte |= PT_WRITABLE_MASK;
 
 
                /* Verify that the fault can be handled in the fast path */
                if (new_spte == spte ||
-                   !is_access_allowed(error_code, new_spte))
+                   !is_access_allowed(fault, new_spte))
                        break;
 
                /*
 
        } while (true);
 
-       trace_fast_page_fault(vcpu, gpa, error_code, sptep, spte, ret);
+       trace_fast_page_fault(vcpu, fault->addr, fault->error_code, sptep, spte, ret);
        walk_shadow_page_lockless_end(vcpu);
 
        return ret;
 
 static int direct_page_fault(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault)
 {
-       gpa_t gpa = fault->addr;
-       u32 error_code = fault->error_code;
        bool is_tdp_mmu_fault = is_tdp_mmu(vcpu->arch.mmu);
 
        unsigned long mmu_seq;
        int r;
 
-       fault->gfn = gpa >> PAGE_SHIFT;
+       fault->gfn = fault->addr >> PAGE_SHIFT;
        if (page_fault_handle_page_track(vcpu, fault))
                return RET_PF_EMULATE;
 
-       r = fast_page_fault(vcpu, gpa, error_code);
+       r = fast_page_fault(vcpu, fault);
        if (r != RET_PF_INVALID)
                return r;