pinctrl: airoha: Use unsigned long for bit search
Subsystems (4)
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
@@ -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)) + ®map))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
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;
| ^~~~~~Signed-off-by Kees Cook <[email protected]>
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
Signed-off-by Kees Cook <[email protected]>
Patch applied, thanks Kees!
Yours,
Linus Walleij