diff --git a/package/kexec/0002-kexec-provide-a-memfd_create-wrapper-if-not-present-.patch b/package/kexec/0002-kexec-provide-a-memfd_create-wrapper-if-not-present-.patch new file mode 100644 index 0000000000..649ec56042 --- /dev/null +++ b/package/kexec/0002-kexec-provide-a-memfd_create-wrapper-if-not-present-.patch @@ -0,0 +1,113 @@ +From 417382aecd6964f97a0a0774a5cccd29c1b9edb3 Mon Sep 17 00:00:00 2001 +From: Julien Olivain <ju.o@free.fr> +Date: Sat, 23 Sep 2023 13:09:23 +0200 +Subject: [PATCH] kexec: provide a memfd_create() wrapper if not present in + libc + +Commit 714fa115 "kexec/arm64: Simplify the code for zImage" introduced +a use of the memfd_create() system call, included in version +kexec-tools v2.0.27. + +This system call was introduced in kernel commit [1], first included +in kernel v3.17 (released on 2014-10-05). + +The memfd_create() glibc wrapper function was added much later in +commit [2], first included in glibc version 2.27 (released on +2018-02-01). + +This direct use memfd_create() introduced a requirement on +Kernel >= 3.17 and glibc >= 2.27. + +There is old toolchains like [3] for example (which ships gcc 7.3.1, +glibc 2.25 and includes kernel v4.10 headers), that can still be used +to build newer kernels. Even if such toolchains can be seen as +outdated, they are is still claimed as supported by recent kernel. +For example, Kernel v6.5.5 has a requirement on gcc version 5.1 and +greater. See [4]. + +Moreover, kexec-tools <= 2.0.26 could be compiled using recent +toolchains with alternative libc (e.g. uclibc-ng, musl) which are not +providing the memfd_create() wrapper. + +When compiling kexec-tools v2.0.27 with a toolchain not providing the +memfd_create() syscall wrapper, the compilation fail with message: + + kexec/kexec.c: In function 'copybuf_memfd': + kexec/kexec.c:645:7: warning: implicit declaration of function 'memfd_create'; did you mean 'SYS_memfd_create'? [-Wimplicit-function-declaration] + fd = memfd_create("kernel", MFD_ALLOW_SEALING); + ^~~~~~~~~~~~ + SYS_memfd_create + kexec/kexec.c:645:30: error: 'MFD_ALLOW_SEALING' undeclared (first use in this function); did you mean '_PC_ALLOC_SIZE_MIN'? + fd = memfd_create("kernel", MFD_ALLOW_SEALING); + ^~~~~~~~~~~~~~~~~ + _PC_ALLOC_SIZE_MIN + +In order to let kexec-tools compile in a wider range of configurations, +this commit adds a memfd_create() function check in autoconf configure +script, and adds a system call wrapper which will be used if the +function is not available. With this commit, the environment +requirement is relaxed to only kernel >= v3.17. + +Note: this issue was found in kexec-tools integration in Buildroot [5] +using the command "utils/test-pkg -a -p kexec", which tests many +toolchain/arch combinations. + +[1] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=9183df25fe7b194563db3fec6dc3202a5855839c +[2] https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=59d2cbb1fe4b8601d5cbd359c3806973eab6c62d +[3] https://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz +[4] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/Documentation/process/changes.rst?h=v6.5.5#n32 +[5] https://buildroot.org/ + +Upstream: https://lists.infradead.org/pipermail/kexec/2023-September/028168.html +Signed-off-by: Julien Olivain <ju.o@free.fr> +--- + configure.ac | 3 +++ + kexec/kexec.c | 11 +++++++++++ + 2 files changed, 14 insertions(+) + +diff --git a/configure.ac b/configure.ac +index 192976c..212ef2c 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -208,6 +208,9 @@ if test "$ac_cv_lib_xenctrl_xc_kexec_load" = yes ; then + AC_MSG_NOTICE([The kexec_status call is not available])) + fi + ++dnl Check if libc has the memfd_create() syscall wrapper ++AC_CHECK_FUNCS([memfd_create]) ++ + dnl ---Sanity checks + if test "$CC" = "no"; then AC_MSG_ERROR([cc not found]); fi + if test "$CPP" = "no"; then AC_MSG_ERROR([cpp not found]); fi +diff --git a/kexec/kexec.c b/kexec/kexec.c +index c3b182e..c44c4b7 100644 +--- a/kexec/kexec.c ++++ b/kexec/kexec.c +@@ -31,6 +31,10 @@ + #include <sys/mount.h> + #include <sys/types.h> + #include <sys/stat.h> ++#ifndef HAVE_MEMFD_CREATE ++#include <linux/memfd.h> ++#include <sys/syscall.h> ++#endif + #include <sys/reboot.h> + #include <sys/mman.h> + #include <unistd.h> +@@ -638,6 +642,13 @@ char *slurp_decompress_file(const char *filename, off_t *r_size) + return kernel_buf; + } + ++#ifndef HAVE_MEMFD_CREATE ++static int memfd_create(const char *name, unsigned int flags) ++{ ++ return syscall(SYS_memfd_create, name, flags); ++} ++#endif ++ + static int copybuf_memfd(const char *kernel_buf, size_t size) + { + int fd, count; +-- +2.41.0 + diff --git a/package/kexec/Config.in b/package/kexec/Config.in index 836d740788..707f8663a4 100644 --- a/package/kexec/Config.in +++ b/package/kexec/Config.in @@ -9,6 +9,7 @@ config BR2_PACKAGE_KEXEC_ARCH_SUPPORTS config BR2_PACKAGE_KEXEC bool "kexec" depends on BR2_PACKAGE_KEXEC_ARCH_SUPPORTS + depends on BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_17 # memfd_create() help Kexec is a user space utility for loading another kernel and asking the currently running kernel to do something with @@ -25,3 +26,7 @@ config BR2_PACKAGE_KEXEC_ZLIB Support for compressed kernel images endif + +comment "kexec needs a toolchain w/ headers >= 3.17" + depends on BR2_PACKAGE_KEXEC_ARCH_SUPPORTS + depends on !BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_17 diff --git a/package/kexec/kexec.hash b/package/kexec/kexec.hash index 4e16a53a35..650f0992de 100644 --- a/package/kexec/kexec.hash +++ b/package/kexec/kexec.hash @@ -1,4 +1,4 @@ # From https://www.kernel.org/pub/linux/utils/kernel/kexec/sha256sums.asc -sha256 7fe36a064101cd5c515e41b2be393dce3ca88adce59d6ee668e0af7c0c4570cd kexec-tools-2.0.26.tar.xz +sha256 38d78bcfa33a88928324b57dc81f50c1dfc279eede45e80957ca18f4e84b8187 kexec-tools-2.0.27.tar.xz # locally calculated sha256 fa5fc1d1eec39532ea517518eeefd7b6e3c14341a55e5880a0e2a49eee47a5b7 COPYING diff --git a/package/kexec/kexec.mk b/package/kexec/kexec.mk index 562b09012b..5d30f4884b 100644 --- a/package/kexec/kexec.mk +++ b/package/kexec/kexec.mk @@ -4,11 +4,13 @@ # ################################################################################ -KEXEC_VERSION = 2.0.26 +KEXEC_VERSION = 2.0.27 KEXEC_SOURCE = kexec-tools-$(KEXEC_VERSION).tar.xz KEXEC_SITE = $(BR2_KERNEL_MIRROR)/linux/utils/kernel/kexec KEXEC_LICENSE = GPL-2.0 KEXEC_LICENSE_FILES = COPYING +# 0002-kexec-provide-a-memfd_create-wrapper-if-not-present-.patch +KEXEC_AUTORECONF = YES KEXEC_CPE_ID_PRODUCT = kexec-tools KEXEC_CPE_ID_VENDOR = kexec-tools_project KEXEC_SELINUX_MODULES = kdump