pinctrl: airoha: Use unsigned long for bit search
authorKees Cook <kees@kernel.org>
Sun, 17 Nov 2024 11:45:38 +0000 (03:45 -0800)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 18 Nov 2024 22:57:38 +0000 (23:57 +0100)
Instead of risking alignment problems and causing (false positive) array
bound warnings when casting a u32 to (64-bit) unsigned long, just use a
native unsigned long for doing bit searches. Avoids warning with GCC 15's
-Warray-bounds -fdiagnostics-details:

In file included from ../include/linux/bitmap.h:11,
                 from ../include/linux/cpumask.h:12,
                 from ../arch/x86/include/asm/paravirt.h:21,
                 from ../arch/x86/include/asm/irqflags.h:80,
                 from ../include/linux/irqflags.h:18,
                 from ../include/linux/spinlock.h:59,
                 from ../include/linux/irq.h:14,
                 from ../include/linux/irqchip/chained_irq.h:10,
                 from ../include/linux/gpio/driver.h:8,
                 from ../drivers/pinctrl/mediatek/pinctrl-airoha.c:11:
In function 'find_next_bit',
    inlined from 'airoha_irq_handler' at ../drivers/pinctrl/mediatek/pinctrl-airoha.c:2394:3:
../include/linux/find.h:65:23: error: array subscript 'long unsigned int[0]' is partly outside array bounds of 'u32[1]' {aka 'unsigned int[1]'} [-Werror=array-bounds=]
   65 |                 val = *addr & GENMASK(size - 1, offset);
      |                       ^~~~~
../drivers/pinctrl/mediatek/pinctrl-airoha.c: In function 'airoha_irq_handler':
../drivers/pinctrl/mediatek/pinctrl-airoha.c:2387:21: note: object 'status' of size 4
 2387 |                 u32 status;
      |                     ^~~~~~

Signed-off-by: Kees Cook <kees@kernel.org>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Link: https://lore.kernel.org/20241117114534.work.292-kees@kernel.org
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/mediatek/pinctrl-airoha.c

index 7692e6d..547a798 100644 (file)
@@ -2384,15 +2384,16 @@ static irqreturn_t airoha_irq_handler(int irq, void *data)
 
        for (i = 0; i < ARRAY_SIZE(irq_status_regs); i++) {
                struct gpio_irq_chip *girq = &pinctrl->gpiochip.chip.irq;
-               u32 status;
+               u32 regmap;
+               unsigned long status;
                int irq;
 
                if (regmap_read(pinctrl->regmap, pinctrl->gpiochip.status[i],
-                               &status))
+                               &regmap))
                        continue;
 
-               for_each_set_bit(irq, (unsigned long *)&status,
-                                AIROHA_PIN_BANK_SIZE) {
+               status = regmap;
+               for_each_set_bit(irq, &status, AIROHA_PIN_BANK_SIZE) {
                        u32 offset = irq + i * AIROHA_PIN_BANK_SIZE;
 
                        generic_handle_irq(irq_find_mapping(girq->domain,