From b25786578cd6e9c76b706f5016374d56f2b0e91d Mon Sep 17 00:00:00 2001 From: Vince Hsu Date: Fri, 10 Feb 2023 09:09:11 +0000 Subject: [PATCH] platform: dce: fix compilation error with GCC 11 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GCC 11 reports the array-bounds issue when passing an 32-bit variable to find_first_bit but referencing it as 64-bit. drivers/platform/tegra/dce/dce-debug.c: In function ‘dbg_dce_boot_status_fops_read’: ./include/linux/find.h:119:37: error: array subscript ‘long unsigned int[0]’ is partly outside array bounds of ‘hsp_sema_t[1]’ {aka ‘unsigned int[1]’} [-Werror=array-bounds] 119 | unsigned long val = *addr & GENMASK(size - 1, 0); | ^~~~~ drivers/platform/tegra/dce/dce-debug.c:493:20: note: while referencing ‘ss’ 493 | hsp_sema_t ss = dce_ss_get_state(d, DCE_BOOT_SEMA); | ^~ ... from drivers/platform/tegra/dce/dce-debug.c:15: ./include/linux/find.h:119:37: error: array subscript ‘long unsigned int[0]’ is partly outside array bounds of ‘u32[1]’ {aka ‘unsigned int[1]’} [-Werror=array-bounds] 119 | unsigned long val = *addr & GENMASK(size - 1, 0); | ^~~~~ drivers/platform/tegra/dce/dce-debug.c:492:13: note: while referencing ‘boot_status’ 492 | u32 boot_status = d->boot_status; | ^~~~~~~~~~~ cc1: all warnings being treated as errors Fix it by passing a 64-bit variable to find_first_bit directly. Bug 200730650 Change-Id: Ibfb68a2ee175aeb60eb9248496c220b35ff98906 Signed-off-by: Vince Hsu Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2856358 Reviewed-by: svc-mobile-coverity Reviewed-by: svc-mobile-cert Reviewed-by: svc_kernel_abi Reviewed-by: Vinod Gopalakrishnakurup Reviewed-by: Arun Swain GVS: Gerrit_Virtual_Submit --- drivers/platform/tegra/dce/dce-debug.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/platform/tegra/dce/dce-debug.c b/drivers/platform/tegra/dce/dce-debug.c index 50c21270..58eee812 100644 --- a/drivers/platform/tegra/dce/dce-debug.c +++ b/drivers/platform/tegra/dce/dce-debug.c @@ -487,7 +487,7 @@ static ssize_t dbg_dce_boot_status_fops_read(struct file *file, char buf[32]; u32 last_status; ssize_t len = 0; - unsigned long *addr; + unsigned long bitmap; struct tegra_dce *d = file->private_data; u32 boot_status = d->boot_status; hsp_sema_t ss = dce_ss_get_state(d, DCE_BOOT_SEMA); @@ -497,9 +497,9 @@ static ssize_t dbg_dce_boot_status_fops_read(struct file *file, /* Clear BOOT_COMPLETE bit and bits set by OS */ ss &= ~(DCE_OS_BITMASK | DCE_BOOT_COMPLETE); - addr = (unsigned long *)&ss; + bitmap = ss; - fsb = find_first_bit(addr, 32U); + fsb = find_first_bit(&bitmap, 32U); if (fsb > 31U) { dce_info(d, "dce-fw boot not started yet"); goto core_boot_done; @@ -547,8 +547,8 @@ static ssize_t dbg_dce_boot_status_fops_read(struct file *file, core_boot_done: /* Clear DCE_STATUS_FAILED bit get actual failure reason*/ boot_status &= ~DCE_STATUS_FAILED; - addr = (unsigned long *)&boot_status; - last_status = DCE_BIT(find_first_bit(addr, 32)); + bitmap = boot_status; + last_status = DCE_BIT(find_first_bit(&bitmap, 32)); switch (last_status) { case DCE_FW_SUSPENDED: