[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20260126035914.16586-1-denserg.edu@gmail.com>
Date: Mon, 26 Jan 2026 06:59:14 +0300
From: Denis Sergeev <denserg.edu@...il.com>
To: westeri@...nel.org,
andriy.shevchenko@...ux.intel.com,
linusw@...nel.org,
brgl@...nel.org
Cc: linux-gpio@...r.kernel.org,
linux-acpi@...r.kernel.org,
linux-kernel@...r.kernel.org,
lvc-project@...uxtesting.org,
Denis Sergeev <denserg.edu@...il.com>
Subject: [PATCH] gpiolib: acpi: use BIT_ULL() for u64 mask in address space handler
The BIT() macro uses unsigned long, which is 32 bits on 32-bit
architectures. When iterating over GPIO pins with index >= 32,
the expression (*value & BIT(i)) causes undefined behavior due
to shifting by a value >= type width.
Since 'value' is a pointer to u64, use BIT_ULL() to ensure correct
64-bit mask on all architectures.
Found by Linux Verification Center (linuxtesting.org) with Svace.
Fixes: 2c4d00cb8fc5 ("gpiolib: acpi: Use BIT() macro to increase readability")
Signed-off-by: Denis Sergeev <denserg.edu@...il.com>
---
The ACPI specification does not define a strict upper bound for the
number of GPIO pins in the Pin Table. The value is derived from
16-bit offsets inside the resource descriptor, which theoretically
allows far more than 64 pins.
However, the current Linux GPIO ACPI OpRegion handler represents the
pin state as a single u64 value, which inherently limits the number of
addressable pins to 64. Thus, even though the specification permits
larger tables, the existing implementation already assumes a <= 64 pin
mask.
This patch fixes undefined behavior in the valid range [32, 63] on
32-bit architectures. Extending support beyond 64 pins would require
a different representation (e.g. bitmap) and is outside the scope of
this fix.
drivers/gpio/gpiolib-acpi-core.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpio/gpiolib-acpi-core.c b/drivers/gpio/gpiolib-acpi-core.c
index 83dd227dbbec..d42f769eeb11 100644
--- a/drivers/gpio/gpiolib-acpi-core.c
+++ b/drivers/gpio/gpiolib-acpi-core.c
@@ -1159,7 +1159,7 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
mutex_unlock(&achip->conn_lock);
if (function == ACPI_WRITE)
- gpiod_set_raw_value_cansleep(desc, !!(*value & BIT(i)));
+ gpiod_set_raw_value_cansleep(desc, !!(*value & BIT_ULL(i)));
else
*value |= (u64)gpiod_get_raw_value_cansleep(desc) << i;
}
--
2.50.1
Powered by blists - more mailing lists