From 49e5a971bc30dfeb0a5cbcc5810e7715058bffa7 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 Signed-off-by: Quentin Perret --- 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 e4a7e6369499..d4b2114cef54 100644 --- a/arch/arm64/include/asm/kvm_mmu.h +++ b/arch/arm64/include/asm/kvm_mmu.h @@ -187,8 +187,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) {