On 24/12/25 8:42 pm, Sourabh Jain wrote:
Use explicit word-sized big-endian types for kexec and crash related
variables. This makes the endianness unambiguous and avoids type
mismatches that trigger sparse warnings.
The change addresses sparse warnings like below (seen on both 32-bit
and 64-bit builds):
CHECK ../arch/powerpc/kexec/core.c
sparse: expected unsigned int static [addressable] [toplevel] [usertype]
crashk_base
sparse: got restricted __be32 [usertype]
sparse: warning: incorrect type in assignment (different base types)
sparse: expected unsigned int static [addressable] [toplevel] [usertype]
crashk_size
sparse: got restricted __be32 [usertype]
sparse: warning: incorrect type in assignment (different base types)
sparse: expected unsigned long long static [addressable] [toplevel] mem_limit
sparse: got restricted __be32 [usertype]
sparse: warning: incorrect type in assignment (different base types)
sparse: expected unsigned int static [addressable] [toplevel] [usertype]
kernel_end
sparse: got restricted __be32 [usertype]
No functional change intended.
Fixes: ea961a828fe7 ("powerpc: Fix endian issues in kexec and crash dump code")
Reported-by: kernel test robot <[email protected]>
Closes:
https://lore.kernel.org/oe-kbuild-all/[email protected]/
Cc: Christophe Leroy (CS GROUP) <[email protected]>
Cc: Hari Bathini <[email protected]>
Cc: Madhavan Srinivasan <[email protected]>
Cc: Mahesh Salgaonkar <[email protected]>
Cc: Michael Ellerman <[email protected]>
Cc: Ritesh Harjani (IBM) <[email protected]>
Cc: Sachin Sant <[email protected]>
Cc: Shivang Upadhyay <[email protected]>
Cc: Venkat Rao Bagalkote <[email protected]>
Cc: [email protected]
Signed-off-by: Sourabh Jain <[email protected]>
---
Tested this patch, by applying on top of mainline repo and it fixes the
reported issue.
Please add below tag.
Tested-by: Venkat Rao Bagalkote <[email protected]>
Logs:
make -C /root/linux O=/root/build_dir ARCH=powerpc CC=clang W=1 C=1
CHECKFLAGS="-Wbitwise -Wcast-to-as -Waddress-space" V=1 arch/powerpc/kexec/
make: Entering directory '/root/linux'
make -C /root/build_dir \
-f /root/linux/Makefile arch/powerpc/kexec/
make[1]: Entering directory '/root/build_dir'
make --no-print-directory -C /root/build_dir \
-f /root/linux/Makefile arch/powerpc/kexec/
ln -fsn /root/linux source
# GEN Makefile
{ echo "# Automatically generated by /root/linux/Makefile: don't
edit"; echo "export KBUILD_OUTPUT = /root/build_dir"; echo "include
/root/linux/Makefile"; } > Makefile
test -e .gitignore || \
{ echo "# this is build directory, ignore it"; echo "*"; } > .gitignore
make -f /root/linux/scripts/Makefile.build
obj=arch/powerpc/kernel/syscalls all
make -f /root/linux/scripts/Makefile.build obj=scripts/basic
make -f /root/linux/scripts/Makefile.build obj=scripts/dtc
make -f /root/linux/scripts/Makefile.build obj=scripts
set -e; mkdir -p include/config/; trap "rm -f
include/config/.tmp_kernel.release" EXIT; {
/root/linux/scripts/setlocalversion /root/linux; } >
include/config/.tmp_kernel.release; if [ ! -r
include/config/kernel.release ] || ! cmp -s
include/config/kernel.release include/config/.tmp_kernel.release; then :
' UPD include/config/kernel.release'; mv -f
include/config/.tmp_kernel.release include/config/kernel.release; fi
make -f /root/linux/scripts/Makefile.asm-headers
obj=arch/powerpc/include/generated/uapi/asm \
generic=include/uapi/asm-generic
make -f /root/linux/scripts/Makefile.asm-headers
obj=arch/powerpc/include/generated/asm \
generic=include/asm-generic
set -e; mkdir -p include/generated/uapi/linux/; trap "rm -f
include/generated/uapi/linux/.tmp_version.h" EXIT; { if [ 0 -gt 255
]; then echo \#define LINUX_VERSION_CODE 398335; else echo \#define
LINUX_VERSION_CODE 398080; fi; echo '#define KERNEL_VERSION(a,b,c) (((a)
<< 16) + ((b) << 8) + ((c) > 255 ? 255 : (c)))'; echo \#define
LINUX_VERSION_MAJOR 6; echo \#define LINUX_VERSION_PATCHLEVEL 19; echo
\#define LINUX_VERSION_SUBLEVEL 0; } >
include/generated/uapi/linux/.tmp_version.h; if [ ! -r
include/generated/uapi/linux/version.h ] || ! cmp -s
include/generated/uapi/linux/version.h
include/generated/uapi/linux/.tmp_version.h; then : ' UPD
include/generated/uapi/linux/version.h'; mv -f
include/generated/uapi/linux/.tmp_version.h
include/generated/uapi/linux/version.h; fi
set -e; mkdir -p include/generated/; trap "rm -f
include/generated/.tmp_utsrelease.h" EXIT; { if [ `echo -n
"6.19.0-rc3-00153-g662be6163c58" | wc -c ` -gt 64 ]; then echo
'"6.19.0-rc3-00153-g662be6163c58" exceeds 64 characters' >&2; exit 1;
fi; echo \#define UTS_RELEASE \"6.19.0-rc3-00153-g662be6163c58\"; } >
include/generated/.tmp_utsrelease.h; if [ ! -r
include/generated/utsrelease.h ] || ! cmp -s
include/generated/utsrelease.h include/generated/.tmp_utsrelease.h; then
: ' UPD include/generated/utsrelease.h'; mv -f
include/generated/.tmp_utsrelease.h include/generated/utsrelease.h; fi
set -e; mkdir -p include/generated/; trap "rm -f
include/generated/.tmp_compile.h" EXIT; {
/root/linux/scripts/mkcompile_h "ppc" "clang version 18.1.8 (Red Hat,
Inc. 18.1.8-3.el9)" "ld"; } > include/generated/.tmp_compile.h; if [ !
-r include/generated/compile.h ] || ! cmp -s include/generated/compile.h
include/generated/.tmp_compile.h; then : ' UPD
include/generated/compile.h'; mv -f include/generated/.tmp_compile.h
include/generated/compile.h; fi
/root/linux/scripts/remove-stale-files
make -f /root/linux/scripts/Makefile.build obj=scripts/mod
set -e; mkdir -p scripts/mod/; trap "rm -f
scripts/mod/.tmp_devicetable-offsets.h" EXIT; { echo "#ifndef
__DEVICETABLE_OFFSETS_H__"; echo "#define __DEVICETABLE_OFFSETS_H__";
echo "/*"; echo " * DO NOT MODIFY."; echo " *"; echo " * This file was
generated by Kbuild"; echo " */"; echo ""; sed -ne
's:^[[:space:]]*\.ascii[[:space:]]*"\(.*\)".*:\1:;
/^->/{s:->#\(.*\):/* \1 */:; s:^->\([^ ]*\) [\$#]*\([^ ]*\)
\(.*\):#define \1 \2 /* \3 */:; s:->::; p;}' <
scripts/mod/devicetable-offsets.s; echo ""; echo "#endif"; } >
scripts/mod/.tmp_devicetable-offsets.h; if [ ! -r
scripts/mod/devicetable-offsets.h ] || ! cmp -s
scripts/mod/devicetable-offsets.h
scripts/mod/.tmp_devicetable-offsets.h; then : ' UPD
scripts/mod/devicetable-offsets.h'; mv -f
scripts/mod/.tmp_devicetable-offsets.h scripts/mod/devicetable-offsets.h; fi
make -f /root/linux/scripts/Makefile.build obj=. prepare
set -e; mkdir -p include/generated/; trap "rm -f
include/generated/.tmp_timeconst.h" EXIT; { echo 250 | bc -q
/root/linux/kernel/time/timeconst.bc; } >
include/generated/.tmp_timeconst.h; if [ ! -r
include/generated/timeconst.h ] || ! cmp -s
include/generated/timeconst.h include/generated/.tmp_timeconst.h; then :
' UPD include/generated/timeconst.h'; mv -f
include/generated/.tmp_timeconst.h include/generated/timeconst.h; fi
set -e; mkdir -p include/generated/; trap "rm -f
include/generated/.tmp_bounds.h" EXIT; { echo "#ifndef
__LINUX_BOUNDS_H__"; echo "#define __LINUX_BOUNDS_H__"; echo "/*"; echo
" * DO NOT MODIFY."; echo " *"; echo " * This file was generated by
Kbuild"; echo " */"; echo ""; sed -ne
's:^[[:space:]]*\.ascii[[:space:]]*"\(.*\)".*:\1:;
/^->/{s:->#\(.*\):/* \1 */:; s:^->\([^ ]*\) [\$#]*\([^ ]*\)
\(.*\):#define \1 \2 /* \3 */:; s:->::; p;}' < kernel/bounds.s; echo "";
echo "#endif"; } > include/generated/.tmp_bounds.h; if [ ! -r
include/generated/bounds.h ] || ! cmp -s include/generated/bounds.h
include/generated/.tmp_bounds.h; then : ' UPD
include/generated/bounds.h'; mv -f include/generated/.tmp_bounds.h
include/generated/bounds.h; fi
set -e; mkdir -p include/generated/; trap "rm -f
include/generated/.tmp_asm-offsets.h" EXIT; { echo "#ifndef
__ASM_OFFSETS_H__"; echo "#define __ASM_OFFSETS_H__"; echo "/*"; echo "
* DO NOT MODIFY."; echo " *"; echo " * This file was generated by
Kbuild"; echo " */"; echo ""; sed -ne
's:^[[:space:]]*\.ascii[[:space:]]*"\(.*\)".*:\1:;
/^->/{s:->#\(.*\):/* \1 */:; s:^->\([^ ]*\) [\$#]*\([^ ]*\)
\(.*\):#define \1 \2 /* \3 */:; s:->::; p;}' <
arch/powerpc/kernel/asm-offsets.s; echo ""; echo "#endif"; } >
include/generated/.tmp_asm-offsets.h; if [ ! -r
include/generated/asm-offsets.h ] || ! cmp -s
include/generated/asm-offsets.h include/generated/.tmp_asm-offsets.h;
then : ' UPD include/generated/asm-offsets.h'; mv -f
include/generated/.tmp_asm-offsets.h include/generated/asm-offsets.h; fi
set -e; mkdir -p include/generated/; trap "rm -f
include/generated/.tmp_rq-offsets.h" EXIT; { echo "#ifndef
__RQ_OFFSETS_H__"; echo "#define __RQ_OFFSETS_H__"; echo "/*"; echo " *
DO NOT MODIFY."; echo " *"; echo " * This file was generated by Kbuild";
echo " */"; echo ""; sed -ne
's:^[[:space:]]*\.ascii[[:space:]]*"\(.*\)".*:\1:;
/^->/{s:->#\(.*\):/* \1 */:; s:^->\([^ ]*\) [\$#]*\([^ ]*\)
\(.*\):#define \1 \2 /* \3 */:; s:->::; p;}' <
kernel/sched/rq-offsets.s; echo ""; echo "#endif"; } >
include/generated/.tmp_rq-offsets.h; if [ ! -r
include/generated/rq-offsets.h ] || ! cmp -s
include/generated/rq-offsets.h include/generated/.tmp_rq-offsets.h; then
: ' UPD include/generated/rq-offsets.h'; mv -f
include/generated/.tmp_rq-offsets.h include/generated/rq-offsets.h; fi
# CALL /root/linux/scripts/checksyscalls.sh
sh /root/linux/scripts/checksyscalls.sh clang
-Wp,-MMD,./.missing-syscalls.d -nostdinc
-I/root/linux/arch/powerpc/include -I./arch/powerpc/include/generated
-I/root/linux/include -I./include
-I/root/linux/arch/powerpc/include/uapi
-I./arch/powerpc/include/generated/uapi -I/root/linux/include/uapi
-I./include/generated/uapi -include
/root/linux/include/linux/compiler-version.h -include
/root/linux/include/linux/kconfig.h -include
/root/linux/include/linux/compiler_types.h -D__KERNEL__
--target=powerpc64le-linux-gnu -fintegrated-as
-Werror=unknown-warning-option -Werror=ignored-optimization-argument
-Werror=option-ignored -Werror=unused-command-line-argument -mbig-endian
-m32 -I /root/linux/arch/powerpc -DHAVE_AS_ATHIGH=1
-fmacro-prefix-map=/root/linux/= -Wundef -DKBUILD_EXTRA_WARN1 -std=gnu11
-fshort-wchar -funsigned-char -fno-common -fno-PIE -fno-strict-aliasing
-msoft-float -mcpu=powerpc -mno-prefixed -mno-pcrel -mno-altivec
-mno-vsx -mno-mma -mno-spe -fno-asynchronous-unwind-tables -mbig-endian
-fno-delete-null-pointer-checks -O2 -fno-stack-protector
-fomit-frame-pointer -falign-functions=4 -fstrict-flex-arrays=3
-fms-extensions -fno-strict-overflow -fno-stack-check
-fno-builtin-wcslen -Wall -Wextra -Wundef
-Werror=implicit-function-declaration -Werror=implicit-int
-Werror=return-type -Werror=strict-prototypes -Wno-format-security
-Wno-trigraphs -Wno-frame-address -Wno-address-of-packed-member
-Wmissing-declarations -Wmissing-prototypes -Wframe-larger-than=1024
-Wno-gnu -Wno-microsoft-anon-tag -Wno-format-overflow-non-kprintf
-Wno-format-truncation-non-kprintf -Wno-pointer-sign
-Wcast-function-type -Wimplicit-fallthrough -Werror=date-time
-Werror=incompatible-pointer-types -Wenum-conversion -Wunused
-Wmissing-format-attribute -Wmissing-include-dirs
-Wunused-const-variable -Wno-missing-field-initializers -Wno-type-limits
-Wno-shift-negative-value -Wno-enum-enum-conversion -Wno-sign-compare
-Wno-unused-parameter -I/root/linux/. -I.
-DKBUILD_MODFILE='"./missing-syscalls"'
-DKBUILD_BASENAME='"missing_syscalls"'
-DKBUILD_MODNAME='"missing_syscalls"' -D__KBUILD_MODNAME=missing_syscalls
mkdir -p ./tools
make O=/root/build_dir subdir=tools -C /root/linux/tools/ objtool
mkdir -p /root/build_dir/tools/objtool && make O=/root/build_dir
subdir=tools/objtool --no-print-directory -C objtool
make -C /root/linux/tools/build CFLAGS= LDFLAGS=
/root/build_dir/tools/objtool/fixdep
if [ ! -f /root/build_dir/tools/objtool/fixdep ]; then \
make -f /root/linux/tools/build/Makefile.build dir=. obj=fixdep
HOSTCFLAGS="-Wall -Wmissing-prototypes -Wstrict-prototypes -O2
-fomit-frame-pointer -std=gnu11 -I /root/linux/scripts/include"; \
rm -f /root/build_dir/tools/objtool/fixdep.o; \
fi
make -f /root/linux/tools/build/Makefile.build dir=. obj=fixdep
HOSTCFLAGS="-Wall -Wmissing-prototypes -Wstrict-prototypes -O2
-fomit-frame-pointer -std=gnu11 -I /root/linux/scripts/include"
make -C /root/linux/tools/lib/subcmd/
O=/root/build_dir/tools/objtool/libsubcmd \
DESTDIR=/root/build_dir/tools/objtool/libsubcmd prefix= subdir= \
CC="gcc" LD="ld" AR="ar" EXTRA_CFLAGS="-std=gnu11
-fomit-frame-pointer -O2 -g -Werror -Wall -Wextra -Wmissing-prototypes
-Wmissing-declarations -Wwrite-strings -Wno-implicit-fallthrough
-Wno-sign-compare -Wno-unused-parameter -I/root/linux/tools/include
-I/root/linux/tools/include/uapi
-I/root/linux/tools/arch/powerpc/include/uapi
-I/root/linux/tools/arch/powerpc/include
-I/root/linux/tools/objtool/include
-I/root/linux/tools/objtool/arch/powerpc/include
-I/root/build_dir/tools/objtool/libsubcmd/include " \
/root/build_dir/tools/objtool/libsubcmd/libsubcmd.a install_headers
make -C /root/linux/tools/build CFLAGS= LDFLAGS=
/root/build_dir/tools/objtool/libsubcmd/fixdep
if [ ! -f /root/build_dir/tools/objtool/libsubcmd/fixdep ]; then
\
make -f /root/linux/tools/build/Makefile.build dir=. obj=fixdep
HOSTCFLAGS="-Wall -Wmissing-prototypes -Wstrict-prototypes -O2
-fomit-frame-pointer -std=gnu11 -I /root/linux/scripts/include"; \
rm -f /root/build_dir/tools/objtool/libsubcmd/fixdep.o;
\
fi
make -f /root/linux/tools/build/Makefile.build dir=. obj=fixdep
HOSTCFLAGS="-Wall -Wmissing-prototypes -Wstrict-prototypes -O2
-fomit-frame-pointer -std=gnu11 -I /root/linux/scripts/include"
make[5]: 'install_headers' is up to date.
sh ./sync-check.sh
make -f /root/linux/tools/build/Makefile.build dir=. obj=objtool
CC="gcc" LD="ld" AR="ar" CFLAGS="-std=gnu11 -fomit-frame-pointer -O2 -g
-Werror -Wall -Wextra -Wmissing-prototypes -Wmissing-declarations
-Wwrite-strings -Wno-implicit-fallthrough -Wno-sign-compare
-Wno-unused-parameter -I/root/linux/tools/include
-I/root/linux/tools/include/uapi
-I/root/linux/tools/arch/powerpc/include/uapi
-I/root/linux/tools/arch/powerpc/include
-I/root/linux/tools/objtool/include
-I/root/linux/tools/objtool/arch/powerpc/include
-I/root/build_dir/tools/objtool/libsubcmd/include " \
LDFLAGS="/root/build_dir/tools/objtool/libsubcmd/libsubcmd.a -lelf "
make -f /root/linux/tools/build/Makefile.build dir=./arch/powerpc
obj=objtool
make -f /root/linux/scripts/Makefile.build obj=arch/powerpc/kernel/vdso
include/generated/vdso32-offsets.h
make -f /root/linux/scripts/Makefile.build obj=. need-builtin=1
need-modorder=1 ./arch/powerpc/kexec/
make -f /root/linux/scripts/Makefile.build obj=arch/powerpc \
need-builtin=1 \
need-modorder=1 \
arch/powerpc/kexec/
make -f /root/linux/scripts/Makefile.build obj=arch/powerpc/kexec \
need-builtin=1 \
need-modorder=1 \
arch/powerpc/kexec/
make[1]: Leaving directory '/root/build_dir'
make: Leaving directory '/root/linux'
Regards,
Venkat.
arch/powerpc/kexec/core.c | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/arch/powerpc/kexec/core.c b/arch/powerpc/kexec/core.c
index 104c05520bf0..dc44f11be353 100644
--- a/arch/powerpc/kexec/core.c
+++ b/arch/powerpc/kexec/core.c
@@ -23,6 +23,7 @@
#include <asm/firmware.h>
#define cpu_to_be_ulong __PASTE(cpu_to_be, BITS_PER_LONG)
+#define __be_word __PASTE(__be, BITS_PER_LONG)
#ifdef CONFIG_CRASH_DUMP
void machine_crash_shutdown(struct pt_regs *regs)
@@ -146,25 +147,25 @@ int __init overlaps_crashkernel(unsigned long start,
unsigned long size)
}
/* Values we need to export to the second kernel via the device tree. */
-static phys_addr_t crashk_base;
-static phys_addr_t crashk_size;
-static unsigned long long mem_limit;
+static __be_word crashk_base;
+static __be_word crashk_size;
+static __be_word mem_limit;
static struct property crashk_base_prop = {
.name = "linux,crashkernel-base",
- .length = sizeof(phys_addr_t),
+ .length = sizeof(__be_word),
.value = &crashk_base
};
static struct property crashk_size_prop = {
.name = "linux,crashkernel-size",
- .length = sizeof(phys_addr_t),
+ .length = sizeof(__be_word),
.value = &crashk_size,
};
static struct property memory_limit_prop = {
.name = "linux,memory-limit",
- .length = sizeof(unsigned long long),
+ .length = sizeof(__be_word),
.value = &mem_limit,
};
@@ -193,11 +194,11 @@ static void __init export_crashk_values(struct device_node *node)
}
#endif /* CONFIG_CRASH_RESERVE */
-static phys_addr_t kernel_end;
+static __be_word kernel_end;
static struct property kernel_end_prop = {
.name = "linux,kernel-end",
- .length = sizeof(phys_addr_t),
+ .length = sizeof(__be_word),
.value = &kernel_end,
};