From f92a7cd932c1b4b3041d6c2d5568c7cd298e2230 Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Mon, 24 Oct 2022 11:26:07 +0100 Subject: [PATCH] ANDROID: KVM: arm64: Ignore length of 0 in kvm_flush_dcache_to_poc() kvm_flush_dcache_to_poc() converts its (start,len) parameters into (start,end) parameters for dcache_clean_inval_poc(). This mostly works out except for the case when 'len == 0', where dcache_clean_inval_poc() will still issue cache maintenance for the cache line containing 'start'. If 'start' is not mapped, then this can generate an unexpected fault. In preparation for cleaning the pvmfw memory pages to the PoC on system reset, tweak kvm_flush_dcache_to_poc() to act as a no-op when the supplied length is 0 and avoid having to check for this corner case in the caller. Signed-off-by: Will Deacon Signed-off-by: Will Deacon Bug: 254819795 Change-Id: Idae2b22289398e941938821d1d3b3a5a1da3fd8f --- arch/arm64/include/asm/kvm_mmu.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h index b5320da8544c..9c99162b88c0 100644 --- a/arch/arm64/include/asm/kvm_mmu.h +++ b/arch/arm64/include/asm/kvm_mmu.h @@ -186,8 +186,13 @@ static inline void *__kvm_vector_slot2addr(void *base, struct kvm; -#define kvm_flush_dcache_to_poc(a,l) \ - dcache_clean_inval_poc((unsigned long)(a), (unsigned long)(a)+(l)) +#define kvm_flush_dcache_to_poc(a, l) do { \ + unsigned long __a = (unsigned long)(a); \ + unsigned long __l = (unsigned long)(l); \ + \ + if (__l) \ + dcache_clean_inval_poc(__a, __a + __l); \ +} while (0) static inline bool vcpu_has_cache_enabled(struct kvm_vcpu *vcpu) {