]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
gpiolib: acpi: use BIT_ULL() for u64 mask in address space handler
authorDenis Sergeev <denserg.edu@gmail.com>
Mon, 26 Jan 2026 03:59:14 +0000 (06:59 +0300)
committerBartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Tue, 27 Jan 2026 19:27:59 +0000 (20:27 +0100)
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@gmail.com>
Reviewed-by: Mika Westerberg <westeri@kernel.org>
Link: https://lore.kernel.org/r/20260126035914.16586-1-denserg.edu@gmail.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
drivers/gpio/gpiolib-acpi-core.c

index 83dd227dbbecc78b9177c638f3e8c80a6d6d258b..d42f769eeb118cbd6ee58ae5125dce3274b5d796 100644 (file)
@@ -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;
        }