162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci#ifndef __KVM_X86_MMU_TDP_MMU_H 462306a36Sopenharmony_ci#define __KVM_X86_MMU_TDP_MMU_H 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/kvm_host.h> 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include "spte.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_civoid kvm_mmu_init_tdp_mmu(struct kvm *kvm); 1162306a36Sopenharmony_civoid kvm_mmu_uninit_tdp_mmu(struct kvm *kvm); 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cihpa_t kvm_tdp_mmu_get_vcpu_root_hpa(struct kvm_vcpu *vcpu); 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci__must_check static inline bool kvm_tdp_mmu_get_root(struct kvm_mmu_page *root) 1662306a36Sopenharmony_ci{ 1762306a36Sopenharmony_ci return refcount_inc_not_zero(&root->tdp_mmu_root_count); 1862306a36Sopenharmony_ci} 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_civoid kvm_tdp_mmu_put_root(struct kvm *kvm, struct kvm_mmu_page *root, 2162306a36Sopenharmony_ci bool shared); 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cibool kvm_tdp_mmu_zap_leafs(struct kvm *kvm, gfn_t start, gfn_t end, bool flush); 2462306a36Sopenharmony_cibool kvm_tdp_mmu_zap_sp(struct kvm *kvm, struct kvm_mmu_page *sp); 2562306a36Sopenharmony_civoid kvm_tdp_mmu_zap_all(struct kvm *kvm); 2662306a36Sopenharmony_civoid kvm_tdp_mmu_invalidate_all_roots(struct kvm *kvm); 2762306a36Sopenharmony_civoid kvm_tdp_mmu_zap_invalidated_roots(struct kvm *kvm); 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ciint kvm_tdp_mmu_map(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault); 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cibool kvm_tdp_mmu_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range, 3262306a36Sopenharmony_ci bool flush); 3362306a36Sopenharmony_cibool kvm_tdp_mmu_age_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range); 3462306a36Sopenharmony_cibool kvm_tdp_mmu_test_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range); 3562306a36Sopenharmony_cibool kvm_tdp_mmu_set_spte_gfn(struct kvm *kvm, struct kvm_gfn_range *range); 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cibool kvm_tdp_mmu_wrprot_slot(struct kvm *kvm, 3862306a36Sopenharmony_ci const struct kvm_memory_slot *slot, int min_level); 3962306a36Sopenharmony_cibool kvm_tdp_mmu_clear_dirty_slot(struct kvm *kvm, 4062306a36Sopenharmony_ci const struct kvm_memory_slot *slot); 4162306a36Sopenharmony_civoid kvm_tdp_mmu_clear_dirty_pt_masked(struct kvm *kvm, 4262306a36Sopenharmony_ci struct kvm_memory_slot *slot, 4362306a36Sopenharmony_ci gfn_t gfn, unsigned long mask, 4462306a36Sopenharmony_ci bool wrprot); 4562306a36Sopenharmony_civoid kvm_tdp_mmu_zap_collapsible_sptes(struct kvm *kvm, 4662306a36Sopenharmony_ci const struct kvm_memory_slot *slot); 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cibool kvm_tdp_mmu_write_protect_gfn(struct kvm *kvm, 4962306a36Sopenharmony_ci struct kvm_memory_slot *slot, gfn_t gfn, 5062306a36Sopenharmony_ci int min_level); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_civoid kvm_tdp_mmu_try_split_huge_pages(struct kvm *kvm, 5362306a36Sopenharmony_ci const struct kvm_memory_slot *slot, 5462306a36Sopenharmony_ci gfn_t start, gfn_t end, 5562306a36Sopenharmony_ci int target_level, bool shared); 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistatic inline void kvm_tdp_mmu_walk_lockless_begin(void) 5862306a36Sopenharmony_ci{ 5962306a36Sopenharmony_ci rcu_read_lock(); 6062306a36Sopenharmony_ci} 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cistatic inline void kvm_tdp_mmu_walk_lockless_end(void) 6362306a36Sopenharmony_ci{ 6462306a36Sopenharmony_ci rcu_read_unlock(); 6562306a36Sopenharmony_ci} 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ciint kvm_tdp_mmu_get_walk(struct kvm_vcpu *vcpu, u64 addr, u64 *sptes, 6862306a36Sopenharmony_ci int *root_level); 6962306a36Sopenharmony_ciu64 *kvm_tdp_mmu_fast_pf_get_last_sptep(struct kvm_vcpu *vcpu, u64 addr, 7062306a36Sopenharmony_ci u64 *spte); 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci#ifdef CONFIG_X86_64 7362306a36Sopenharmony_cistatic inline bool is_tdp_mmu_page(struct kvm_mmu_page *sp) { return sp->tdp_mmu_page; } 7462306a36Sopenharmony_ci#else 7562306a36Sopenharmony_cistatic inline bool is_tdp_mmu_page(struct kvm_mmu_page *sp) { return false; } 7662306a36Sopenharmony_ci#endif 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci#endif /* __KVM_X86_MMU_TDP_MMU_H */ 79