From 272cf01f5e85f5705987a0918024afdd2d7173d5 Mon Sep 17 00:00:00 2001 From: Quentin Perret Date: Fri, 6 Jan 2023 18:03:29 +0000 Subject: [PATCH] ANDROID: KVM: arm64: Expose get_leaf to pKVM modules Expose an API allowing to query the host stage-2 page-table to module. Bug: 264070847 Change-Id: Ifbb2c9c8f8899778b9bf1f7df1dae81acba2af6d Signed-off-by: Quentin Perret --- arch/arm64/include/asm/kvm_pkvm_module.h | 1 + arch/arm64/kvm/hyp/include/nvhe/mem_protect.h | 1 + arch/arm64/kvm/hyp/nvhe/mem_protect.c | 11 +++++++++++ arch/arm64/kvm/hyp/nvhe/modules.c | 1 + 4 files changed, 14 insertions(+) diff --git a/arch/arm64/include/asm/kvm_pkvm_module.h b/arch/arm64/include/asm/kvm_pkvm_module.h index de0015f77985..b0d26f7ecc4d 100644 --- a/arch/arm64/include/asm/kvm_pkvm_module.h +++ b/arch/arm64/include/asm/kvm_pkvm_module.h @@ -31,6 +31,7 @@ struct pkvm_module_ops { void (*flush_dcache_to_poc)(void *addr, size_t size); int (*register_host_perm_fault_handler)(int (*cb)(struct kvm_cpu_context *ctxt, u64 esr, u64 addr)); int (*protect_host_page)(u64 pfn, enum kvm_pgtable_prot prot); + int (*host_stage2_get_leaf)(phys_addr_t phys, kvm_pte_t *ptep, u32 *level); int (*register_host_smc_handler)(bool (*cb)(struct kvm_cpu_context *)); int (*register_default_trap_handler)(bool (*cb)(struct kvm_cpu_context *)); int (*register_illegal_abt_notifier)(void (*cb)(struct kvm_cpu_context *)); diff --git a/arch/arm64/kvm/hyp/include/nvhe/mem_protect.h b/arch/arm64/kvm/hyp/include/nvhe/mem_protect.h index 6c7419abd54d..55192b4d835f 100644 --- a/arch/arm64/kvm/hyp/include/nvhe/mem_protect.h +++ b/arch/arm64/kvm/hyp/include/nvhe/mem_protect.h @@ -99,6 +99,7 @@ int hyp_pin_shared_mem(void *from, void *to); void hyp_unpin_shared_mem(void *from, void *to); void reclaim_guest_pages(struct pkvm_hyp_vm *vm, struct kvm_hyp_memcache *mc); int hyp_protect_host_page(u64 pfn, enum kvm_pgtable_prot prot); +int host_stage2_get_leaf(phys_addr_t phys, kvm_pte_t *ptep, u32 *level); int refill_memcache(struct kvm_hyp_memcache *mc, unsigned long min_pages, struct kvm_hyp_memcache *host_mc); diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c index 098ff16f408d..5386bb0230f4 100644 --- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c +++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c @@ -2234,3 +2234,14 @@ int host_stage2_protect_pages_locked(phys_addr_t addr, u64 size) return ret; } + +int host_stage2_get_leaf(phys_addr_t phys, kvm_pte_t *ptep, u32 *level) +{ + int ret; + + host_lock_component(); + ret = kvm_pgtable_get_leaf(&host_mmu.pgt, phys, ptep, level); + host_unlock_component(); + + return ret; +} diff --git a/arch/arm64/kvm/hyp/nvhe/modules.c b/arch/arm64/kvm/hyp/nvhe/modules.c index 214fa3405ccf..4fc546a25fa2 100644 --- a/arch/arm64/kvm/hyp/nvhe/modules.c +++ b/arch/arm64/kvm/hyp/nvhe/modules.c @@ -69,6 +69,7 @@ const struct pkvm_module_ops module_ops = { .flush_dcache_to_poc = __kvm_flush_dcache_to_poc, .register_host_perm_fault_handler = hyp_register_host_perm_fault_handler, .protect_host_page = hyp_protect_host_page, + .host_stage2_get_leaf = host_stage2_get_leaf, .register_host_smc_handler = __pkvm_register_host_smc_handler, .register_default_trap_handler = __pkvm_register_default_trap_handler, .register_illegal_abt_notifier = __pkvm_register_illegal_abt_notifier,