From 8a3e189fbd0f4e11630800508c2b34198a8dfd7a Mon Sep 17 00:00:00 2001 From: Vincent Donnefort Date: Mon, 27 Jun 2022 14:03:28 +0100 Subject: [PATCH] ANDROID: KVM: arm64: Add mapping removal interface for nVHE hyp The new pkvm_remove_mappings() allows the caller to unmap a memory range from the hypervisor. This is to allow later introduction of in-hypervisor tracing. Bug: 244543039 Bug: 229972309 Change-Id: I9edc7c2ae55c4b7f5d464d26ce3351b5fd4bf9f3 Signed-off-by: Vincent Donnefort Signed-off-by: Quentin Perret --- arch/arm64/kvm/hyp/include/nvhe/mm.h | 1 + arch/arm64/kvm/hyp/nvhe/mm.c | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/arch/arm64/kvm/hyp/include/nvhe/mm.h b/arch/arm64/kvm/hyp/include/nvhe/mm.h index 164a0986dc52..3ceb29b36069 100644 --- a/arch/arm64/kvm/hyp/include/nvhe/mm.h +++ b/arch/arm64/kvm/hyp/include/nvhe/mm.h @@ -28,5 +28,6 @@ int __pkvm_create_private_mapping(phys_addr_t phys, size_t size, enum kvm_pgtable_prot prot, unsigned long *haddr); int pkvm_alloc_private_va_range(size_t size, unsigned long *haddr); +void pkvm_remove_mappings(void *from, void *to); #endif /* __KVM_HYP_MM_H */ diff --git a/arch/arm64/kvm/hyp/nvhe/mm.c b/arch/arm64/kvm/hyp/nvhe/mm.c index c80b2c007619..ca4ccc4e9894 100644 --- a/arch/arm64/kvm/hyp/nvhe/mm.c +++ b/arch/arm64/kvm/hyp/nvhe/mm.c @@ -136,6 +136,15 @@ int pkvm_create_mappings(void *from, void *to, enum kvm_pgtable_prot prot) return ret; } +void pkvm_remove_mappings(void *from, void *to) +{ + unsigned long size = (unsigned long)to - (unsigned long)from; + + hyp_spin_lock(&pkvm_pgd_lock); + WARN_ON(kvm_pgtable_hyp_unmap(&pkvm_pgtable, (u64)from, size) != size); + hyp_spin_unlock(&pkvm_pgd_lock); +} + int hyp_back_vmemmap(phys_addr_t back) { unsigned long i, start, size, end = 0;