fix(clang): fix performance-no-int-to-ptr for macros
Change-Id: I1c68e189feccb1a28877c72b734479d24bb5b181
Signed-off-by: Olivier Deprez <olivier.deprez@arm.com>
diff --git a/inc/hf/io.h b/inc/hf/io.h
index 9a146a2..5bc69b5 100644
--- a/inc/hf/io.h
+++ b/inc/hf/io.h
@@ -12,6 +12,7 @@
#include <stdint.h>
#include "hf/arch/barriers.h"
+#include "hf/arch/types.h"
#include "hf/check.h"
@@ -55,19 +56,62 @@
/* Contructors for literals. */
-#define IO8_C(addr) ((io8_t){.ptr = (volatile uint8_t *)(addr)})
-#define IO16_C(addr) ((io16_t){.ptr = (volatile uint16_t *)(addr)})
-#define IO32_C(addr) ((io32_t){.ptr = (volatile uint32_t *)(addr)})
-#define IO64_C(addr) ((io64_t){.ptr = (volatile uint64_t *)(addr)})
+static inline io8_t io8_c(uintpaddr_t addr, uintpaddr_t offset)
+{
+ return (io8_t){.ptr = (volatile uint8_t *)(addr + offset)};
+}
-#define IO8_ARRAY_C(addr, cnt) \
- ((io8_array_t){.base = (volatile uint8_t *)(addr), .count = (cnt)})
-#define IO16_ARRAY_C(addr, cnt) \
- ((io16_array_t){.base = (volatile uint16_t *)(addr), .count = (cnt)})
-#define IO32_ARRAY_C(addr, cnt) \
- ((io32_array_t){.base = (volatile uint32_t *)(addr), .count = (cnt)})
-#define IO64_ARRAY_C(addr, cnt) \
- ((io64_array_t){.base = (volatile uint64_t *)(addr), .count = (cnt)})
+static inline io8_array_t io8_array_c(uintpaddr_t addr, uintpaddr_t offset,
+ uint32_t count)
+{
+ return (io8_array_t){.base = (volatile uint8_t *)addr, .count = count};
+}
+
+static inline io16_t io16_c(uintpaddr_t addr, uintpaddr_t offset)
+{
+ return (io16_t){.ptr = (volatile uint16_t *)(addr + offset)};
+}
+
+static inline io16_array_t io16_array_c(uintpaddr_t addr, uintpaddr_t offset,
+ uint32_t count)
+{
+ return (io16_array_t){.base = (volatile uint16_t *)addr,
+ .count = count};
+}
+
+static inline io32_t io32_c(uintpaddr_t addr, uintpaddr_t offset)
+{
+ return (io32_t){.ptr = (volatile uint32_t *)(addr + offset)};
+}
+
+static inline io32_array_t io32_array_c(uintpaddr_t addr, uintpaddr_t offset,
+ uint32_t count)
+{
+ return (io32_array_t){.base = (volatile uint32_t *)addr,
+ .count = count};
+}
+
+static inline io64_t io64_c(uintpaddr_t addr, uintpaddr_t offset)
+{
+ return (io64_t){.ptr = (volatile uint64_t *)(addr + offset)};
+}
+
+static inline io64_array_t io64_array_c(uintpaddr_t addr, uintpaddr_t offset,
+ uint32_t count)
+{
+ return (io64_array_t){.base = (volatile uint64_t *)addr,
+ .count = count};
+}
+
+#define IO8_C(addr) io8_c((addr), 0)
+#define IO16_C(addr) io16_c((addr), 0)
+#define IO32_C(addr) io32_c((addr), 0)
+#define IO64_C(addr) io64_c((addr), 0)
+
+#define IO8_ARRAY_C(addr, cnt) io8_array_c((addr), 0, cnt)
+#define IO16_ARRAY_C(addr, cnt) io16_array_c((addr), 0, cnt)
+#define IO32_ARRAY_C(addr, cnt) io32_array_c((addr), 0, cnt)
+#define IO64_ARRAY_C(addr, cnt) io64_array_c((addr), 0, cnt)
/** Read from memory-mapped IO. */
diff --git a/src/arch/aarch64/arm_smmuv3/arm_smmuv3.h b/src/arch/aarch64/arm_smmuv3/arm_smmuv3.h
index d2a2376..e3decd6 100644
--- a/src/arch/aarch64/arm_smmuv3/arm_smmuv3.h
+++ b/src/arch/aarch64/arm_smmuv3/arm_smmuv3.h
@@ -332,32 +332,32 @@
static inline uint32_t mmio_read32(void *addr)
{
- return io_read32(IO32_C(addr));
+ return io_read32(IO32_C((uintpaddr_t)addr));
}
-static inline uint32_t mmio_read32_offset(void *addr, uint32_t byte_off)
+static inline uint32_t mmio_read32_offset(void *addr, uint32_t offset)
{
- return io_read32(IO32_C((uint8_t *)addr + byte_off));
+ return io_read32(io32_c((uintpaddr_t)addr, offset));
}
static inline void mmio_write32(void *addr, uint32_t data)
{
- io_write32(IO32_C(addr), data);
+ io_write32(IO32_C((uintpaddr_t)addr), data);
}
-static inline void mmio_write32_offset(void *addr, uint32_t byte_off,
+static inline void mmio_write32_offset(void *addr, uint32_t offset,
uint32_t data)
{
- io_write32(IO32_C((uint8_t *)addr + byte_off), data);
+ io_write32(io32_c((uintpaddr_t)addr, offset), data);
}
static inline void mmio_write64(void *addr, uint64_t data)
{
- io_write64(IO64_C(addr), data);
+ io_write64(IO64_C((uintpaddr_t)addr), data);
}
-static inline void mmio_write64_offset(void *addr, uint32_t byte_off,
+static inline void mmio_write64_offset(void *addr, uint32_t offset,
uint64_t data)
{
- io_write64(IO64_C((uint8_t *)addr + byte_off), data);
+ io_write64(io64_c((uintpaddr_t)addr, offset), data);
}
diff --git a/test/vmapi/arch/aarch64/gicv3/gicv3.c b/test/vmapi/arch/aarch64/gicv3/gicv3.c
index 2b1c822..682bc4e 100644
--- a/test/vmapi/arch/aarch64/gicv3/gicv3.c
+++ b/test/vmapi/arch/aarch64/gicv3/gicv3.c
@@ -47,7 +47,7 @@
const uint32_t mode = MM_MODE_R | MM_MODE_W | MM_MODE_D;
hftest_mm_identity_map((void *)GICD_BASE, PAGE_SIZE, mode);
hftest_mm_identity_map((void *)GICR_BASE, PAGE_SIZE, mode);
- hftest_mm_identity_map((void *)SGI_BASE, PAGE_SIZE, mode);
+ hftest_mm_identity_map((void *)IO32_C(SGI_BASE).ptr, PAGE_SIZE, mode);
exception_setup(irq, NULL);
interrupt_gic_setup();