From e680506fe08dc07bea11ba4970e27705eaf9dc1c Mon Sep 17 00:00:00 2001 From: Mostafa Saleh Date: Thu, 10 Apr 2025 14:46:42 +0000 Subject: [PATCH] ANDROID: KVM: iommu: Allow IOMMU mapping in carveouts Some carveouts might be no-map for the CPU, but can be used from devices. Allow IOMMU to map those buffers. Bug: 409547022 Bug: 357781595 Change-Id: Ie0e34442e59dc753afcb4357c85211aefe7d7b39 Signed-off-by: Mostafa Saleh --- arch/arm64/kvm/hyp/nvhe/mem_protect.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c index f5e0511e5437..aae12b42312f 100644 --- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c +++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c @@ -1898,8 +1898,16 @@ static int __pkvm_use_dma_locked(phys_addr_t phys_addr, size_t size, } else { /* For VMs, we know if we reach this point the VM has access to the page. */ if (!hyp_vcpu) { - ret = ___host_check_page_state_range(phys_addr, size, - PKVM_PAGE_OWNED, reg, false); + for (i = 0; i < nr_pages; i++) { + enum pkvm_page_state state; + phys_addr_t this_addr = phys_addr + i * PAGE_SIZE; + + state = hyp_phys_to_page(this_addr)->host_state; + if (state != PKVM_PAGE_OWNED) { + ret = -EPERM; + break; + } + } if (ret) return ret; }