| From a545357707f243d205a539a70f78333fbedda7ab Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 3 May 2024 17:56:18 +1000 |
| Subject: powerpc/io: Avoid clang null pointer arithmetic warnings |
| |
| From: Michael Ellerman <mpe@ellerman.id.au> |
| |
| [ Upstream commit 03c0f2c2b2220fc9cf8785cd7b61d3e71e24a366 ] |
| |
| With -Wextra clang warns about pointer arithmetic using a null pointer. |
| When building with CONFIG_PCI=n, that triggers a warning in the IO |
| accessors, eg: |
| |
| In file included from linux/arch/powerpc/include/asm/io.h:672: |
| linux/arch/powerpc/include/asm/io-defs.h:23:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] |
| 23 | DEF_PCI_AC_RET(inb, u8, (unsigned long port), (port), pio, port) |
| | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| ... |
| linux/arch/powerpc/include/asm/io.h:591:53: note: expanded from macro '__do_inb' |
| 591 | #define __do_inb(port) readb((PCI_IO_ADDR)_IO_BASE + port); |
| | ~~~~~~~~~~~~~~~~~~~~~ ^ |
| |
| That is because when CONFIG_PCI=n, _IO_BASE is defined as 0. |
| |
| Although _IO_BASE is defined as plain 0, the cast (PCI_IO_ADDR) converts |
| it to void * before the addition with port happens. |
| |
| Instead the addition can be done first, and then the cast. The resulting |
| value will be the same, but avoids the warning, and also avoids void |
| pointer arithmetic which is apparently non-standard. |
| |
| Reported-by: Naresh Kamboju <naresh.kamboju@linaro.org> |
| Closes: https://lore.kernel.org/all/CA+G9fYtEh8zmq8k8wE-8RZwW-Qr927RLTn+KqGnq1F=ptaaNsA@mail.gmail.com |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://msgid.link/20240503075619.394467-1-mpe@ellerman.id.au |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/powerpc/include/asm/io.h | 24 ++++++++++++------------ |
| 1 file changed, 12 insertions(+), 12 deletions(-) |
| |
| diff --git a/arch/powerpc/include/asm/io.h b/arch/powerpc/include/asm/io.h |
| index fc112a91d0c2f..0e1745e5125b0 100644 |
| --- a/arch/powerpc/include/asm/io.h |
| +++ b/arch/powerpc/include/asm/io.h |
| @@ -553,12 +553,12 @@ __do_out_asm(_rec_outl, "stwbrx") |
| #define __do_inw(port) _rec_inw(port) |
| #define __do_inl(port) _rec_inl(port) |
| #else /* CONFIG_PPC32 */ |
| -#define __do_outb(val, port) writeb(val,(PCI_IO_ADDR)_IO_BASE+port); |
| -#define __do_outw(val, port) writew(val,(PCI_IO_ADDR)_IO_BASE+port); |
| -#define __do_outl(val, port) writel(val,(PCI_IO_ADDR)_IO_BASE+port); |
| -#define __do_inb(port) readb((PCI_IO_ADDR)_IO_BASE + port); |
| -#define __do_inw(port) readw((PCI_IO_ADDR)_IO_BASE + port); |
| -#define __do_inl(port) readl((PCI_IO_ADDR)_IO_BASE + port); |
| +#define __do_outb(val, port) writeb(val,(PCI_IO_ADDR)(_IO_BASE+port)); |
| +#define __do_outw(val, port) writew(val,(PCI_IO_ADDR)(_IO_BASE+port)); |
| +#define __do_outl(val, port) writel(val,(PCI_IO_ADDR)(_IO_BASE+port)); |
| +#define __do_inb(port) readb((PCI_IO_ADDR)(_IO_BASE + port)); |
| +#define __do_inw(port) readw((PCI_IO_ADDR)(_IO_BASE + port)); |
| +#define __do_inl(port) readl((PCI_IO_ADDR)(_IO_BASE + port)); |
| #endif /* !CONFIG_PPC32 */ |
| |
| #ifdef CONFIG_EEH |
| @@ -574,12 +574,12 @@ __do_out_asm(_rec_outl, "stwbrx") |
| #define __do_writesw(a, b, n) _outsw(PCI_FIX_ADDR(a),(b),(n)) |
| #define __do_writesl(a, b, n) _outsl(PCI_FIX_ADDR(a),(b),(n)) |
| |
| -#define __do_insb(p, b, n) readsb((PCI_IO_ADDR)_IO_BASE+(p), (b), (n)) |
| -#define __do_insw(p, b, n) readsw((PCI_IO_ADDR)_IO_BASE+(p), (b), (n)) |
| -#define __do_insl(p, b, n) readsl((PCI_IO_ADDR)_IO_BASE+(p), (b), (n)) |
| -#define __do_outsb(p, b, n) writesb((PCI_IO_ADDR)_IO_BASE+(p),(b),(n)) |
| -#define __do_outsw(p, b, n) writesw((PCI_IO_ADDR)_IO_BASE+(p),(b),(n)) |
| -#define __do_outsl(p, b, n) writesl((PCI_IO_ADDR)_IO_BASE+(p),(b),(n)) |
| +#define __do_insb(p, b, n) readsb((PCI_IO_ADDR)(_IO_BASE+(p)), (b), (n)) |
| +#define __do_insw(p, b, n) readsw((PCI_IO_ADDR)(_IO_BASE+(p)), (b), (n)) |
| +#define __do_insl(p, b, n) readsl((PCI_IO_ADDR)(_IO_BASE+(p)), (b), (n)) |
| +#define __do_outsb(p, b, n) writesb((PCI_IO_ADDR)(_IO_BASE+(p)),(b),(n)) |
| +#define __do_outsw(p, b, n) writesw((PCI_IO_ADDR)(_IO_BASE+(p)),(b),(n)) |
| +#define __do_outsl(p, b, n) writesl((PCI_IO_ADDR)(_IO_BASE+(p)),(b),(n)) |
| |
| #define __do_memset_io(addr, c, n) \ |
| _memset_io(PCI_FIX_ADDR(addr), c, n) |
| -- |
| 2.43.0 |
| |