[PATCH] arm: mach-imx: Fix speculative instruction prefetch issue
Stefano Babic
stefano.babic at denx.de
Sun May 2 12:55:47 CEST 2021
Hi Ye,
this patch is quite old and it looks like it was forgotten - I apply it
and runs CI, but it breaks most arm board. So I have to drop it.
Best regards,
Stefano Babic
On 21.02.21 03:27, Ye Li wrote:
> Default ARM32 MMU setting in u-boot sets XN bit to entire 4GB space no
> matter which DCACHE option is used, and set domain permission to manager.
> This causes MMU ignores the access check and XN bit, so speculative
> instruction can fetch from entire space.
>
> This patch sets the DDR, ROM, OCRAM without XN bit, and set domain to client
> to enable the XN and access check. So speculative instruction fetch can only
> happens on these 3 regions to avoid prefetch from peripherals and invalid
> regions.
>
> Signed-off-by: Ye Li <ye.li at nxp.com>
> Reviewed-by: Peng Fan <peng.fan at nxp.com>
> ---
> arch/arm/mach-imx/cache.c | 49 ++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 42 insertions(+), 7 deletions(-)
>
> diff --git a/arch/arm/mach-imx/cache.c b/arch/arm/mach-imx/cache.c
> index 4e3b49a..8486c2d 100644
> --- a/arch/arm/mach-imx/cache.c
> +++ b/arch/arm/mach-imx/cache.c
> @@ -10,6 +10,10 @@
> #include <asm/pl310.h>
> #include <asm/io.h>
> #include <asm/mach-imx/sys_proto.h>
> +#include <asm/global_data.h>
> +#include <log.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
>
> static void enable_ca7_smp(void)
> {
> @@ -40,13 +44,13 @@ static void enable_ca7_smp(void)
> }
>
> #if !CONFIG_IS_ENABLED(SYS_DCACHE_OFF)
> +
> +#define ARMV7_DOMAIN_CLIENT 1
> +#define ARMV7_DOMAIN_MASK (0x3 << 0)
> +#define IMX_ARMV7_DCACHE_OPTION (DCACHE_DEFAULT_OPTION & ~TTB_SECT_XN_MASK)
> +
> void enable_caches(void)
> {
> -#if defined(CONFIG_SYS_ARM_CACHE_WRITETHROUGH)
> - enum dcache_option option = DCACHE_WRITETHROUGH;
> -#else
> - enum dcache_option option = DCACHE_WRITEBACK;
> -#endif
> /* Avoid random hang when download by usb */
> invalidate_dcache_all();
>
> @@ -59,11 +63,42 @@ void enable_caches(void)
> /* Enable caching on OCRAM and ROM */
> mmu_set_region_dcache_behaviour(ROMCP_ARB_BASE_ADDR,
> ROMCP_ARB_END_ADDR,
> - option);
> + IMX_ARMV7_DCACHE_OPTION);
> mmu_set_region_dcache_behaviour(IRAM_BASE_ADDR,
> IRAM_SIZE,
> - option);
> + IMX_ARMV7_DCACHE_OPTION);
> +}
> +
> +void dram_bank_mmu_setup(int bank)
> +{
> + struct bd_info *bd = gd->bd;
> + int i;
> +
> + /* bd->bi_dram is available only after relocation */
> + if ((gd->flags & GD_FLG_RELOC) == 0)
> + return;
> +
> + debug("%s: bank: %d\n", __func__, bank);
> + for (i = bd->bi_dram[bank].start >> MMU_SECTION_SHIFT;
> + i < (bd->bi_dram[bank].start >> MMU_SECTION_SHIFT) +
> + (bd->bi_dram[bank].size >> MMU_SECTION_SHIFT);
> + i++)
> + set_section_dcache(i, IMX_ARMV7_DCACHE_OPTION);
> }
> +
> +void arm_init_domains(void)
> +{
> + u32 reg;
> +
> + reg = get_dacr();
> + /*
> + * Set domain to client to do access and XN check
> + */
> + reg &= ~ARMV7_DOMAIN_MASK;
> + reg |= ARMV7_DOMAIN_CLIENT;
> + set_dacr(reg);
> +}
> +
> #else
> void enable_caches(void)
> {
>
--
=====================================================================
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
More information about the U-Boot
mailing list