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.

Don't call into dcache_clean_inval_poc() from kvm_flush_dcache_to_poc()
if the supplied length is 0.

Reported-by: John Stultz <john.stultz@linaro.org>
Bug: 196204410
Signed-off-by: Will Deacon <willdeacon@google.com>
Change-Id: Idae2b22289398e941938821d1d3b3a5a1da3fd8f
This commit is contained in:
Will Deacon
2022-03-01 10:22:55 +00:00
parent 8ac834f5ea
commit 255b30f804

View File

@@ -182,8 +182,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)
{