Messages in this thread Patch in this message |  | | From | Yunhui Cui <> | | Subject | [PATCH v4 1/3] riscv: io: avoid null-pointer arithmetic in PIO helpers | | Date | Tue, 5 May 2026 14:20:24 +0800 |
| |
The RISC-V PIO helpers derive I/O addresses from PCI_IOBASE in ins*(), outs*(), and ioport_map().
Under configurations where I/O port support is not available, these expressions can still be formed during compilation and trigger -Wnull-pointer-arithmetic warnings from clang.
Introduce a helper for the address calculation and guard the PIO-only helpers with CONFIG_HAS_IOPORT so unsupported configurations do not construct these PIO address expressions.
Signed-off-by: Yunhui Cui <cuiyunhui@bytedance.com> --- arch/riscv/include/asm/io.h | 26 ++++++++++++++++++-------- include/asm-generic/io.h | 4 ++++ 2 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/arch/riscv/include/asm/io.h b/arch/riscv/include/asm/io.h index 09bb5f57a9d34..6f5d70313c83e 100644 --- a/arch/riscv/include/asm/io.h +++ b/arch/riscv/include/asm/io.h @@ -56,6 +56,8 @@ #define __io_pbw() RISCV_FENCE(iow, o) #define __io_paw() RISCV_FENCE(o, io) +#define PCI_IO_ADDR(addr) ((void __iomem *)((unsigned long)PCI_IOBASE + (addr))) + /* * Accesses from a single hart to a single I/O address must be ordered. This * allows us to use the raw read macros, but we still need to fence before and @@ -102,12 +104,14 @@ __io_reads_ins(reads, u32, l, __io_br(), __io_ar(addr)) #define readsw(addr, buffer, count) __readsw(addr, buffer, count) #define readsl(addr, buffer, count) __readsl(addr, buffer, count) +#ifdef CONFIG_HAS_IOPORT __io_reads_ins(ins, u8, b, __io_pbr(), __io_par(addr)) __io_reads_ins(ins, u16, w, __io_pbr(), __io_par(addr)) __io_reads_ins(ins, u32, l, __io_pbr(), __io_par(addr)) -#define insb(addr, buffer, count) __insb(PCI_IOBASE + (addr), buffer, count) -#define insw(addr, buffer, count) __insw(PCI_IOBASE + (addr), buffer, count) -#define insl(addr, buffer, count) __insl(PCI_IOBASE + (addr), buffer, count) +#define insb(addr, buffer, count) __insb(PCI_IO_ADDR(addr), buffer, count) +#define insw(addr, buffer, count) __insw(PCI_IO_ADDR(addr), buffer, count) +#define insl(addr, buffer, count) __insl(PCI_IO_ADDR(addr), buffer, count) +#endif __io_writes_outs(writes, u8, b, __io_bw(), __io_aw()) __io_writes_outs(writes, u16, w, __io_bw(), __io_aw()) @@ -116,25 +120,31 @@ __io_writes_outs(writes, u32, l, __io_bw(), __io_aw()) #define writesw(addr, buffer, count) __writesw(addr, buffer, count) #define writesl(addr, buffer, count) __writesl(addr, buffer, count) +#ifdef CONFIG_HAS_IOPORT __io_writes_outs(outs, u8, b, __io_pbw(), __io_paw()) __io_writes_outs(outs, u16, w, __io_pbw(), __io_paw()) __io_writes_outs(outs, u32, l, __io_pbw(), __io_paw()) -#define outsb(addr, buffer, count) __outsb(PCI_IOBASE + (addr), buffer, count) -#define outsw(addr, buffer, count) __outsw(PCI_IOBASE + (addr), buffer, count) -#define outsl(addr, buffer, count) __outsl(PCI_IOBASE + (addr), buffer, count) +#define outsb(addr, buffer, count) __outsb(PCI_IO_ADDR(addr), buffer, count) +#define outsw(addr, buffer, count) __outsw(PCI_IO_ADDR(addr), buffer, count) +#define outsl(addr, buffer, count) __outsl(PCI_IO_ADDR(addr), buffer, count) +#endif #ifdef CONFIG_64BIT __io_reads_ins(reads, u64, q, __io_br(), __io_ar(addr)) #define readsq(addr, buffer, count) __readsq(addr, buffer, count) +#ifdef CONFIG_HAS_IOPORT __io_reads_ins(ins, u64, q, __io_pbr(), __io_par(addr)) -#define insq(addr, buffer, count) __insq(PCI_IOBASE + (addr), buffer, count) +#define insq(addr, buffer, count) __insq(PCI_IO_ADDR(addr), buffer, count) +#endif __io_writes_outs(writes, u64, q, __io_bw(), __io_aw()) #define writesq(addr, buffer, count) __writesq(addr, buffer, count) +#ifdef CONFIG_HAS_IOPORT __io_writes_outs(outs, u64, q, __io_pbr(), __io_paw()) -#define outsq(addr, buffer, count) __outsq(PCI_IOBASE + (addr), buffer, count) +#define outsq(addr, buffer, count) __outsq(PCI_IO_ADDR(addr), buffer, count) +#endif #endif #include <asm-generic/io.h> diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h index ca5a1ce6f0f89..d799e5ccc9437 100644 --- a/include/asm-generic/io.h +++ b/include/asm-generic/io.h @@ -1205,8 +1205,12 @@ static inline void __iomem *ioremap_np(phys_addr_t offset, size_t size) #define ioport_map ioport_map static inline void __iomem *ioport_map(unsigned long port, unsigned int nr) { +#ifdef CONFIG_HAS_IOPORT port &= IO_SPACE_LIMIT; return (port > MMIO_UPPER_LIMIT) ? NULL : PCI_IOBASE + port; +#else + return NULL; +#endif } #define ARCH_HAS_GENERIC_IOPORT_MAP #endif -- 2.39.5
|  |