summaryrefslogtreecommitdiff
path: root/plat/imx
diff options
context:
space:
mode:
authorAndre Przywara <andre.przywara@arm.com>2023-04-04 16:52:25 +0100
committerAndre Przywara <andre.przywara@arm.com>2023-04-04 17:20:40 +0100
commite75a3b6e89c4bce11d1885426f22262def9bd664 (patch)
treefcedd3b245b39c8e22412cc432c82ff3dc83c046 /plat/imx
parentc38a17ed04132449ccb085c06ecb10d70aa0044c (diff)
downloadarm-trusted-firmware-e75a3b6e89c4bce11d1885426f22262def9bd664.tar.gz
fix(imx8mq): fix compilation with gcc >= 12.x
Starting with GCC >= 12.x the -Wall option includes -Werror=array-bounds checks. Per default GCC treats all memory accesses below 4096 as NULL, so access to ROMAPI causes the following warning: ------------ In file included from plat/imx/imx8m/imx8mq/imx8mq_bl31_setup.c:20: In function 'mmio_read_8', inlined from 'imx8mq_soc_info_init' at plat/imx/imx8m/imx8mq/imx8mq_bl31_setup.c:70:16, inlined from 'bl31_platform_setup' at plat/imx/imx8m/imx8mq/imx8mq_bl31_setup.c:206:2: include/lib/mmio.h:19:16: error: array subscript 0 is outside array bounds of 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Werror=array-bounds] 19 | return *(volatile uint8_t*)addr; | ^~~~~~~~~~~~~~~~~~~~~~~~ In function 'mmio_read_8', inlined from 'imx8mq_soc_info_init' at plat/imx/imx8m/imx8mq/imx8mq_bl31_setup.c:74:16, inlined from 'bl31_platform_setup' at plat/imx/imx8m/imx8mq/imx8mq_bl31_setup.c:206:2: include/lib/mmio.h:19:16: error: array subscript 0 is outside array bounds of 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Werror=array-bounds] 19 | return *(volatile uint8_t*)addr; | ^~~~~~~~~~~~~~~~~~~~~~~~ cc1: all warnings being treated as errors ------------ This comes arguably from us somewhat abusing pointers to access MMIO memory regions, which is not really covered by the C language. Replace the pointer-dereferencing mmio_read_8() with an implementation that uses inline assembly, to directly generate an 8-bit load instruction. This avoids the compiler thinking that this access is using a pointer it needs to jealously look after. Change-Id: Iab39f6f615d51d3e8a1c54a1262d1e6ec208811d Reported-by: Marco Felsch <m.felsch@pengutronix.de> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Diffstat (limited to 'plat/imx')
-rw-r--r--plat/imx/imx8m/imx8mq/imx8mq_bl31_setup.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/plat/imx/imx8m/imx8mq/imx8mq_bl31_setup.c b/plat/imx/imx8m/imx8mq/imx8mq_bl31_setup.c
index 661f8e291..7065a6586 100644
--- a/plat/imx/imx8m/imx8mq/imx8mq_bl31_setup.c
+++ b/plat/imx/imx8m/imx8mq/imx8mq_bl31_setup.c
@@ -30,6 +30,20 @@
#define TRUSTY_PARAMS_LEN_BYTES (4096*2)
+/*
+ * Avoid the pointer dereference of the canonical mmio_read_8() implementation.
+ * This prevents the compiler from mis-interpreting the MMIO access as an
+ * illegal memory access to a very low address (the IMX ROM is mapped at 0).
+ */
+static uint8_t mmio_read_8_ldrb(uintptr_t address)
+{
+ uint8_t reg;
+
+ __asm__ volatile ("ldrb %w0, [%1]" : "=r" (reg) : "r" (address));
+
+ return reg;
+}
+
static const mmap_region_t imx_mmap[] = {
MAP_REGION_FLAT(GPV_BASE, GPV_SIZE, MT_DEVICE | MT_RW), /* GPV map */
MAP_REGION_FLAT(IMX_ROM_BASE, IMX_ROM_SIZE, MT_MEMORY | MT_RO), /* ROM map */
@@ -70,11 +84,11 @@ static void imx8mq_soc_info_init(void)
uint32_t ocotp_val;
imx_soc_revision = mmio_read_32(IMX_ANAMIX_BASE + ANAMIX_DIGPROG);
- rom_version = mmio_read_8(IMX_ROM_BASE + ROM_SOC_INFO_A0);
+ rom_version = mmio_read_8_ldrb(IMX_ROM_BASE + ROM_SOC_INFO_A0);
if (rom_version == 0x10)
return;
- rom_version = mmio_read_8(IMX_ROM_BASE + ROM_SOC_INFO_B0);
+ rom_version = mmio_read_8_ldrb(IMX_ROM_BASE + ROM_SOC_INFO_B0);
if (rom_version == 0x20) {
imx_soc_revision &= ~0xff;
imx_soc_revision |= rom_version;