From 9d8af4215d34b3cc9ab37b2c98dc940de69f10b7 Mon Sep 17 00:00:00 2001 From: Vincent Donnefort Date: Tue, 25 Apr 2023 09:38:28 +0100 Subject: [PATCH] ANDROID: KVM: arm64: Add __hyp_allocator_map for the pKVM hyp In preparation for the hyp heap allocator, add a way of creating non-linear mappings for the hyp stage-1. A function to unmap (pkvm_remove_mappings()) is already available. Bug: 357781595 Bug: 273748186 Change-Id: I8a00cb1874de2f26d38bec9ad9b309b71aade1b4 Signed-off-by: Vincent Donnefort --- arch/arm64/kvm/hyp/include/nvhe/mm.h | 1 + arch/arm64/kvm/hyp/nvhe/mm.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/arch/arm64/kvm/hyp/include/nvhe/mm.h b/arch/arm64/kvm/hyp/include/nvhe/mm.h index af6dadc60a2c..5d33aca7d686 100644 --- a/arch/arm64/kvm/hyp/include/nvhe/mm.h +++ b/arch/arm64/kvm/hyp/include/nvhe/mm.h @@ -32,6 +32,7 @@ int pkvm_create_stack(phys_addr_t phys, unsigned long *haddr); int pkvm_alloc_private_va_range(size_t size, unsigned long *haddr); void pkvm_remove_mappings(void *from, void *to); phys_addr_t __pkvm_private_range_pa(void *va); +int __hyp_allocator_map(unsigned long start, phys_addr_t phys); int __pkvm_map_module_page(u64 pfn, void *va, enum kvm_pgtable_prot prot, bool is_protected); void __pkvm_unmap_module_page(u64 pfn, void *va); diff --git a/arch/arm64/kvm/hyp/nvhe/mm.c b/arch/arm64/kvm/hyp/nvhe/mm.c index 199cdfa0b39e..1a8da55a5196 100644 --- a/arch/arm64/kvm/hyp/nvhe/mm.c +++ b/arch/arm64/kvm/hyp/nvhe/mm.c @@ -176,6 +176,11 @@ void __pkvm_unmap_module_page(u64 pfn, void *va) pkvm_remove_mappings(va, va + PAGE_SIZE); } +int __hyp_allocator_map(unsigned long va, phys_addr_t phys) +{ + return __pkvm_create_mappings(va, PAGE_SIZE, phys, PAGE_HYP); +} + int pkvm_create_mappings_locked(void *from, void *to, enum kvm_pgtable_prot prot) { unsigned long start = (unsigned long)from;