Commit c0ae43d3 authored by Denis Sergeev's avatar Denis Sergeev Committed by Bartosz Golaszewski
Browse files

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: 2c4d00cb ("gpiolib: acpi: Use BIT() macro to increase readability")
Signed-off-by: default avatarDenis Sergeev <denserg.edu@gmail.com>
Reviewed-by: default avatarMika Westerberg <westeri@kernel.org>
Link: https://lore.kernel.org/r/20260126035914.16586-1-denserg.edu@gmail.com


Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
parent 96313fcc
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;
	}