[RFC PATCH 1/1] arm: add invalidate_dcache_all() after disable cache
Heinrich Schuchardt
xypron.glpk at gmx.de
Wed May 31 09:42:29 CEST 2023
On 5/31/23 00:08, Emanuele Ghidoli wrote:
> From: Emanuele Ghidoli <emanuele.ghidoli at toradex.com>
>
> On Cortex-R5 flushing and disabling cache is not enough to avoid
> cache and memory incoherence.
>
> In particular, when the cache is enabled after a disable, and if there
> are entry in the cache the value from the cache is used instead of the
> value from the memory. This, in particular, lead to stack corruption if
> the stack is in a cached area.
>
> The commit 44df5e8d30a2 ("arm: move flush_dcache_all() to just before disable cache")
> already states that following a cache disable an invalidate is expected
> to be done but without coping with cache enable. So just add it explicitly.
>
> Signed-off-by: Emanuele Ghidoli <emanuele.ghidoli at toradex.com>
> ---
> arch/arm/lib/cache-cp15.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> diff --git a/arch/arm/lib/cache-cp15.c b/arch/arm/lib/cache-cp15.c
> index 0893915b3004..2921277d69e0 100644
> --- a/arch/arm/lib/cache-cp15.c
> +++ b/arch/arm/lib/cache-cp15.c
> @@ -254,7 +254,15 @@ static void cache_disable(uint32_t cache_bit)
> if (cache_bit == CR_C)
> #endif
> flush_dcache_all();
> +
> set_cr(reg & ~cache_bit);
> +
> +#ifdef CONFIG_SYS_ARM_MMU
> + if (cache_bit == (CR_C | CR_M))
> +#elif defined(CONFIG_SYS_ARM_MPU)
> + if (cache_bit == CR_C)
> +#endif
We prefer 'if' over '#ifdef'. So you should use something like:
if (IS_ENABLED(CONFIG_SYS_ARM_MMU) && (cache_bit == (CR_C | CR_M) ||
IS_ENABLED(CONFIG_SYS_ARM_MPU) && (cache_bit == CR_C)) {
flush_dcache_all();
invalidate_dcache_all();
}
set_cr(reg & ~cache_bit);
(Assuming set_cr() can be called after invalidate_dcache_all.)
Best regards
Heinrich
> + invalidate_dcache_all();
> }
> #endif
>
More information about the U-Boot
mailing list