Skip to contentSkip to conversation

pinctrl: airoha: Use unsigned long for bit search

PATCH In review Kees Cook 3 participants 3 messages Nov 17, 2024 – Nov 18, 2024

Subsystems (4)
lore
Share & tools
lore

Kees Cook

author
#0 lore raw

PATCH 1/1 pinctrl: airoha: Use unsigned long for bit search

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;
| ^~~~~~

---
Cc: Lorenzo Bianconi <[email protected]>
Cc: Sean Wang <[email protected]>
Cc: Linus Walleij <[email protected]>
Cc: [email protected]
Cc: [email protected]

---
 drivers/pinctrl/mediatek/pinctrl-airoha.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/pinctrl/mediatek/pinctrl-airoha.c +5 -4
index 7692e6d9b871..547a798b71c8 100644
@@ -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,
Signature · 1 line
2.34.1
maintainer Reviewed-by on v1 1/1
#1 lore raw

Il 17/11/24 12:45, Kees Cook ha scritto:

Quoted 20 lines

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);
       |                       ^~~~~
Quoted 6 lines

../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;
| ^~~~~~

#2 lore raw
In reply to Kees Cook
Quoted 25 lines · Kees Cook

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;
| ^~~~~~

Quoted 1 line

Patch applied, thanks Kees!

Yours,
Linus Walleij