Accepting request 1119956 from home:olh:branches:Kernel:kdump

- Fix build with old glibc with 6419b008fde783fd0cc2cc266bd1c9cf35e99a0e.patch

OBS-URL: https://build.opensuse.org/request/show/1119956
OBS-URL: https://build.opensuse.org/package/show/Kernel:kdump/kexec-tools?expand=0&rev=162
This commit is contained in:
Petr Tesařík 2023-11-08 20:30:11 +00:00 committed by Git OBS Bridge
parent 4ce6c78e5b
commit 2d08e304a3
3 changed files with 118 additions and 0 deletions

View File

@ -0,0 +1,112 @@
From 6419b008fde783fd0cc2cc266bd1c9cf35e99a0e Mon Sep 17 00:00:00 2001
From: Julien Olivain <ju.o@free.fr>
Date: Sat, 23 Sep 2023 18:46:06 +0200
Subject: 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/
Signed-off-by: Julien Olivain <ju.o@free.fr>
Signed-off-by: Simon Horman <horms@kernel.org>
---
configure.ac | 3 +++
kexec/kexec.c | 11 +++++++++++
2 files changed, 14 insertions(+)
diff --git a/configure.ac b/configure.ac
index 352eefee..602de79b 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 fdb4c984..08edfca2 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>
@@ -640,6 +644,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;
--
cgit

View File

@ -1,3 +1,8 @@
-------------------------------------------------------------------
Tue Oct 24 11:11:11 UTC 2023 - olaf@aepfle.de
- Fix build with old glibc with 6419b008fde783fd0cc2cc266bd1c9cf35e99a0e.patch
-------------------------------------------------------------------
Wed Sep 6 09:10:09 UTC 2023 - Petr Tesařík <petr@tesarici.cz>

View File

@ -29,6 +29,7 @@ Source1: https://kernel.org/pub/linux/utils/kernel/kexec/%{name}-%{versio
Source2: kexec-tools.keyring
Source3: kexec-load.service
Source4: %{name}-rpmlintrc
Patch0: 6419b008fde783fd0cc2cc266bd1c9cf35e99a0e.patch
Patch3: %{name}-disable-test.patch
Patch4: %{name}-vmcoreinfo-in-xen.patch
# https://patchwork.kernel.org/project/linux-riscv/patch/20190416123233.4779-1-mick@ics.forth.gr/