18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci 38c2ecf20Sopenharmony_ci#ifndef __KVM_X86_MMU_TDP_MMU_H 48c2ecf20Sopenharmony_ci#define __KVM_X86_MMU_TDP_MMU_H 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include <linux/kvm_host.h> 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_civoid kvm_mmu_init_tdp_mmu(struct kvm *kvm); 98c2ecf20Sopenharmony_civoid kvm_mmu_uninit_tdp_mmu(struct kvm *kvm); 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_cibool is_tdp_mmu_root(struct kvm *kvm, hpa_t root); 128c2ecf20Sopenharmony_cihpa_t kvm_tdp_mmu_get_vcpu_root_hpa(struct kvm_vcpu *vcpu); 138c2ecf20Sopenharmony_civoid kvm_tdp_mmu_free_root(struct kvm *kvm, struct kvm_mmu_page *root); 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_cibool __kvm_tdp_mmu_zap_gfn_range(struct kvm *kvm, gfn_t start, gfn_t end, 168c2ecf20Sopenharmony_ci bool can_yield); 178c2ecf20Sopenharmony_cistatic inline bool kvm_tdp_mmu_zap_gfn_range(struct kvm *kvm, gfn_t start, 188c2ecf20Sopenharmony_ci gfn_t end) 198c2ecf20Sopenharmony_ci{ 208c2ecf20Sopenharmony_ci return __kvm_tdp_mmu_zap_gfn_range(kvm, start, end, true); 218c2ecf20Sopenharmony_ci} 228c2ecf20Sopenharmony_cistatic inline bool kvm_tdp_mmu_zap_sp(struct kvm *kvm, struct kvm_mmu_page *sp) 238c2ecf20Sopenharmony_ci{ 248c2ecf20Sopenharmony_ci gfn_t end = sp->gfn + KVM_PAGES_PER_HPAGE(sp->role.level); 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci /* 278c2ecf20Sopenharmony_ci * Don't allow yielding, as the caller may have pending pages to zap 288c2ecf20Sopenharmony_ci * on the shadow MMU. 298c2ecf20Sopenharmony_ci */ 308c2ecf20Sopenharmony_ci return __kvm_tdp_mmu_zap_gfn_range(kvm, sp->gfn, end, false); 318c2ecf20Sopenharmony_ci} 328c2ecf20Sopenharmony_civoid kvm_tdp_mmu_zap_all(struct kvm *kvm); 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ciint kvm_tdp_mmu_map(struct kvm_vcpu *vcpu, gpa_t gpa, u32 error_code, 358c2ecf20Sopenharmony_ci int map_writable, int max_level, kvm_pfn_t pfn, 368c2ecf20Sopenharmony_ci bool prefault); 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ciint kvm_tdp_mmu_zap_hva_range(struct kvm *kvm, unsigned long start, 398c2ecf20Sopenharmony_ci unsigned long end); 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ciint kvm_tdp_mmu_age_hva_range(struct kvm *kvm, unsigned long start, 428c2ecf20Sopenharmony_ci unsigned long end); 438c2ecf20Sopenharmony_ciint kvm_tdp_mmu_test_age_hva(struct kvm *kvm, unsigned long hva); 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ciint kvm_tdp_mmu_set_spte_hva(struct kvm *kvm, unsigned long address, 468c2ecf20Sopenharmony_ci pte_t *host_ptep); 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_cibool kvm_tdp_mmu_wrprot_slot(struct kvm *kvm, struct kvm_memory_slot *slot, 498c2ecf20Sopenharmony_ci int min_level); 508c2ecf20Sopenharmony_cibool kvm_tdp_mmu_clear_dirty_slot(struct kvm *kvm, 518c2ecf20Sopenharmony_ci struct kvm_memory_slot *slot); 528c2ecf20Sopenharmony_civoid kvm_tdp_mmu_clear_dirty_pt_masked(struct kvm *kvm, 538c2ecf20Sopenharmony_ci struct kvm_memory_slot *slot, 548c2ecf20Sopenharmony_ci gfn_t gfn, unsigned long mask, 558c2ecf20Sopenharmony_ci bool wrprot); 568c2ecf20Sopenharmony_cibool kvm_tdp_mmu_slot_set_dirty(struct kvm *kvm, struct kvm_memory_slot *slot); 578c2ecf20Sopenharmony_civoid kvm_tdp_mmu_zap_collapsible_sptes(struct kvm *kvm, 588c2ecf20Sopenharmony_ci const struct kvm_memory_slot *slot); 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_cibool kvm_tdp_mmu_write_protect_gfn(struct kvm *kvm, 618c2ecf20Sopenharmony_ci struct kvm_memory_slot *slot, gfn_t gfn); 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ciint kvm_tdp_mmu_get_walk(struct kvm_vcpu *vcpu, u64 addr, u64 *sptes, 648c2ecf20Sopenharmony_ci int *root_level); 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci#endif /* __KVM_X86_MMU_TDP_MMU_H */ 67