int root_level);
/* Update the external page table from spte getting set. */
- int (*set_external_spte)(struct kvm *kvm, gfn_t gfn, enum pg_level level,
- u64 mirror_spte);
+ int (*set_external_spte)(struct kvm *kvm, gfn_t gfn, u64 old_spte,
+ u64 new_spte, enum pg_level level);
/* Update external page tables for page table about to be freed. */
int (*free_external_spt)(struct kvm *kvm, gfn_t gfn, enum pg_level level,
if (!try_cmpxchg64(raw_sptep, &iter->old_spte, FROZEN_SPTE))
return -EBUSY;
- ret = kvm_x86_call(set_external_spte)(kvm, iter->gfn, iter->level,
- new_spte);
+ ret = kvm_x86_call(set_external_spte)(kvm, iter->gfn, iter->old_spte,
+ new_spte, iter->level);
if (ret)
__kvm_tdp_mmu_write_spte(iter->sptep, iter->old_spte);
}
static int tdx_sept_map_nonleaf_spte(struct kvm *kvm, gfn_t gfn,
- enum pg_level level, u64 mirror_spte)
+ enum pg_level level, u64 new_spte)
{
gpa_t gpa = gfn_to_gpa(gfn);
u64 err, entry, level_state;
struct page *sept_pt;
- sept_pt = tdx_spte_to_sept_pt(kvm, gfn, mirror_spte, level);
+ sept_pt = tdx_spte_to_sept_pt(kvm, gfn, new_spte, level);
if (!sept_pt)
return -EIO;
}
static int tdx_sept_map_leaf_spte(struct kvm *kvm, gfn_t gfn, enum pg_level level,
- u64 mirror_spte)
+ u64 new_spte)
{
struct kvm_tdx *kvm_tdx = to_kvm_tdx(kvm);
- kvm_pfn_t pfn = spte_to_pfn(mirror_spte);
+ kvm_pfn_t pfn = spte_to_pfn(new_spte);
/* TODO: handle large pages. */
if (KVM_BUG_ON(level != PG_LEVEL_4K, kvm))
return -EIO;
- WARN_ON_ONCE((mirror_spte & VMX_EPT_RWX_MASK) != VMX_EPT_RWX_MASK);
+ WARN_ON_ONCE((new_spte & VMX_EPT_RWX_MASK) != VMX_EPT_RWX_MASK);
/*
* Ensure pre_fault_allowed is read by kvm_arch_vcpu_pre_fault_memory()
return tdx_mem_page_aug(kvm, gfn, level, pfn);
}
-static int tdx_sept_set_private_spte(struct kvm *kvm, gfn_t gfn,
- enum pg_level level, u64 mirror_spte)
+static int tdx_sept_set_private_spte(struct kvm *kvm, gfn_t gfn, u64 old_spte,
+ u64 new_spte, enum pg_level level)
{
- if (KVM_BUG_ON(!is_shadow_present_pte(mirror_spte), kvm))
+ if (KVM_BUG_ON(!is_shadow_present_pte(new_spte), kvm))
return -EIO;
- if (!is_last_spte(mirror_spte, level))
- return tdx_sept_map_nonleaf_spte(kvm, gfn, level, mirror_spte);
+ if (!is_last_spte(new_spte, level))
+ return tdx_sept_map_nonleaf_spte(kvm, gfn, level, new_spte);
- return tdx_sept_map_leaf_spte(kvm, gfn, level, mirror_spte);
+ return tdx_sept_map_leaf_spte(kvm, gfn, level, new_spte);
}
/*