Extend the APIs for "resetting" TDX pages to workaround the TDX_PW_MCE erratum to support huge pages, e.g. so that KVM can pass in the pfn+level without having to manually calculate the size in multiple locations. No functional change intended (because KVM doesn't currently support anything but level=PG_LEVEL_4K). Suggested-by: Vishal Annapurve Signed-off-by: Sean Christopherson --- arch/x86/include/asm/tdx.h | 7 ++++++- arch/x86/kvm/vmx/tdx.c | 2 +- arch/x86/virt/vmx/tdx/tdx.c | 6 +++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h index 8ceaebc6c1a9..e61b0b3cc403 100644 --- a/arch/x86/include/asm/tdx.h +++ b/arch/x86/include/asm/tdx.h @@ -157,7 +157,12 @@ int tdx_topup_pamt_cache(struct tdx_pamt_cache *cache, unsigned long npages); int tdx_pamt_get(u64 pfn, struct tdx_pamt_cache *cache); void tdx_pamt_put(u64 pfn); -void tdx_quirk_reset_page(u64 pfn); +void __tdx_quirk_reset_page(u64 pfn, enum pg_level level); + +static inline void tdx_quirk_reset_page(u64 pfn) +{ + __tdx_quirk_reset_page(pfn, PG_LEVEL_4K); +} int tdx_guest_keyid_alloc(void); u32 tdx_get_nr_guest_keyids(void); diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c index 90133e8f5c53..aca556923822 100644 --- a/arch/x86/kvm/vmx/tdx.c +++ b/arch/x86/kvm/vmx/tdx.c @@ -1871,7 +1871,7 @@ static void tdx_sept_remove_private_spte(struct kvm *kvm, gfn_t gfn, if (TDX_BUG_ON(err, TDH_PHYMEM_PAGE_WBINVD, kvm)) return; - tdx_quirk_reset_page(pfn); + __tdx_quirk_reset_page(pfn, level); tdx_pamt_put(pfn); } diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 367df9366d57..411e5feef39f 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -799,11 +799,11 @@ static void tdx_quirk_reset_paddr(unsigned long base, unsigned long size) mb(); } -void tdx_quirk_reset_page(u64 pfn) +void __tdx_quirk_reset_page(u64 pfn, enum pg_level level) { - tdx_quirk_reset_paddr(PFN_PHYS(pfn), PAGE_SIZE); + tdx_quirk_reset_paddr(PFN_PHYS(pfn), page_level_size(level)); } -EXPORT_SYMBOL_FOR_KVM(tdx_quirk_reset_page); +EXPORT_SYMBOL_FOR_KVM(__tdx_quirk_reset_page); static void tdmr_quirk_reset_pamt(struct tdmr_info *tdmr) { -- 2.53.0.rc1.217.geba53bf80e-goog