From 7af94019cf53b94919316cd786f9cbecf338a1da Mon Sep 17 00:00:00 2001 From: Coiby Xu Date: Tue, 10 Oct 2023 15:58:01 +0800 Subject: [PATCH] [packit] 2.0.27 upstream release Upstream tag: v2.0.27 Upstream commit: 2495ccfc --- 0001-kexec-tools-2.0.27.git.patch | 30 +++ 0002-build-fix-tarball-creation.patch | 43 +++++ ...ble-arm64-kexec_load-for-zboot-image.patch | 134 ++++++++++++++ ...oot-add-loongarch-kexec_load-support.patch | 171 ++++++++++++++++++ README.packit | 2 +- kexec-tools.spec | 15 ++ 6 files changed, 394 insertions(+), 1 deletion(-) create mode 100644 0001-kexec-tools-2.0.27.git.patch create mode 100644 0002-build-fix-tarball-creation.patch create mode 100644 0003-zboot-enable-arm64-kexec_load-for-zboot-image.patch create mode 100644 0004-zboot-add-loongarch-kexec_load-support.patch diff --git a/0001-kexec-tools-2.0.27.git.patch b/0001-kexec-tools-2.0.27.git.patch new file mode 100644 index 0000000..3939f62 --- /dev/null +++ b/0001-kexec-tools-2.0.27.git.patch @@ -0,0 +1,30 @@ +From 056c179cd3c2af0c3bd2762a8a3bfd1340278e9e Mon Sep 17 00:00:00 2001 +From: Simon Horman +Date: Fri, 1 Sep 2023 09:37:24 +0200 +Subject: [PATCH 1/4] kexec-tools 2.0.27.git + +Add .git to version so it doesn't look like a release. +This is just so when people build code from git it can +be identified as such from the version string. + +Signed-off-by: Simon Horman +--- + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/configure.ac b/configure.ac +index 192976c..352eefe 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -4,7 +4,7 @@ dnl + dnl + + dnl ---Required +-AC_INIT(kexec-tools, 2.0.27) ++AC_INIT(kexec-tools, 2.0.27.git) + AC_CONFIG_AUX_DIR(./config) + AC_CONFIG_HEADERS([include/config.h]) + AC_LANG(C) +-- +2.41.0 + diff --git a/0002-build-fix-tarball-creation.patch b/0002-build-fix-tarball-creation.patch new file mode 100644 index 0000000..13837d3 --- /dev/null +++ b/0002-build-fix-tarball-creation.patch @@ -0,0 +1,43 @@ +From c3f35ff06e54daf452ac49a4381cf2643c934866 Mon Sep 17 00:00:00 2001 +From: Leah Neukirchen +Date: Mon, 28 Aug 2023 11:58:15 +0200 +Subject: [PATCH 2/4] build: fix tarball creation + +The fix in 41b77edac did not work, bsdtar still complains about +"hardlink pointing to itself". + +Simplify the code instead: since the staging directory contains +exactly the files we want, just package it as a whole. + +Signed-off-by: Leah Neukirchen +Signed-off-by: Simon Horman +--- + Makefile.in | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +diff --git a/Makefile.in b/Makefile.in +index 09bbd5c..3cad22a 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -179,8 +179,6 @@ GENERATED_SRCS:= $(SPEC) + TARBALL=$(PACKAGE_NAME)-$(PACKAGE_VERSION).tar + TARBALL.gz=$(TARBALL).gz + SRCS:= $(dist) +-PSRCS:=$(foreach s, $(SRCS), $(PACKAGE_NAME)-$(PACKAGE_VERSION)/$(s)) +-PGSRCS:=$(foreach s, $(GENERATED_SRCS), $(PACKAGE_NAME)-$(PACKAGE_VERSION)/$(s)) + + MAN_PAGES:=$(KEXEC_MANPAGE) $(VMCORE_DMESG_MANPAGE) + BINARIES_i386:=$(KEXEC_TEST) +@@ -223,8 +221,7 @@ $(TARBALL): $(SRCS) $(GENERATED_SRCS) + $(MKDIR) $(PACKAGE_NAME)-$(PACKAGE_VERSION) + $(TAR) -c $(SRCS) $(GENERATED_SRCS) | \ + $(TAR) -C $(PACKAGE_NAME)-$(PACKAGE_VERSION) -x +- $(TAR) -cf $@ $(PSRCS) +- $(TAR) -rf $@ $(PGSRCS) ++ $(TAR) -cf $@ $(PACKAGE_NAME)-$(PACKAGE_VERSION) + $(RM) -rf $(PACKAGE_NAME)-$(PACKAGE_VERSION) + + $(TARBALL.gz): $(TARBALL) +-- +2.41.0 + diff --git a/0003-zboot-enable-arm64-kexec_load-for-zboot-image.patch b/0003-zboot-enable-arm64-kexec_load-for-zboot-image.patch new file mode 100644 index 0000000..86c8369 --- /dev/null +++ b/0003-zboot-enable-arm64-kexec_load-for-zboot-image.patch @@ -0,0 +1,134 @@ +From 8f08e3b51f25f585dc62f8e7aadc6095e06417cc Mon Sep 17 00:00:00 2001 +From: Dave Young +Date: Thu, 14 Sep 2023 16:49:59 +0800 +Subject: [PATCH 3/4] zboot: enable arm64 kexec_load for zboot image + +kexec_file_load support of zboot kernel image decompressed the vmlinuz, +so in kexec_load code just load the kernel with reading the decompressed +kernel fd into a new buffer and use it directly. + +Signed-off-by: Dave Young +Tested-by: Baoquan He +Reviewed-by: Pingfan Liu +Signed-off-by: Simon Horman +--- + include/kexec-pe-zboot.h | 3 ++- + kexec/arch/arm64/kexec-vmlinuz-arm64.c | 26 +++++++++++++++++++++++--- + kexec/kexec-pe-zboot.c | 4 +++- + kexec/kexec.c | 2 +- + kexec/kexec.h | 1 + + 5 files changed, 30 insertions(+), 6 deletions(-) + +diff --git a/include/kexec-pe-zboot.h b/include/kexec-pe-zboot.h +index e2e0448..374916c 100644 +--- a/include/kexec-pe-zboot.h ++++ b/include/kexec-pe-zboot.h +@@ -11,5 +11,6 @@ struct linux_pe_zboot_header { + uint32_t compress_type; + }; + +-int pez_prepare(const char *crude_buf, off_t buf_sz, int *kernel_fd); ++int pez_prepare(const char *crude_buf, off_t buf_sz, int *kernel_fd, ++ off_t *kernel_size); + #endif +diff --git a/kexec/arch/arm64/kexec-vmlinuz-arm64.c b/kexec/arch/arm64/kexec-vmlinuz-arm64.c +index c0ee47c..e291a34 100644 +--- a/kexec/arch/arm64/kexec-vmlinuz-arm64.c ++++ b/kexec/arch/arm64/kexec-vmlinuz-arm64.c +@@ -34,6 +34,7 @@ + #include "arch/options.h" + + static int kernel_fd = -1; ++static off_t decompressed_size; + + /* Returns: + * -1 : in case of error/invalid format (not a valid PE+compressed ZBOOT format. +@@ -72,7 +73,7 @@ int pez_arm64_probe(const char *kernel_buf, off_t kernel_size) + return -1; + } + +- ret = pez_prepare(buf, buf_sz, &kernel_fd); ++ ret = pez_prepare(buf, buf_sz, &kernel_fd, &decompressed_size); + + if (!ret) { + /* validate the arm64 specific header */ +@@ -98,8 +99,27 @@ bad_header: + int pez_arm64_load(int argc, char **argv, const char *buf, off_t len, + struct kexec_info *info) + { +- info->kernel_fd = kernel_fd; +- return image_arm64_load(argc, argv, buf, len, info); ++ if (kernel_fd > 0 && decompressed_size > 0) { ++ char *kbuf; ++ off_t nread; ++ int fd; ++ ++ info->kernel_fd = kernel_fd; ++ fd = dup(kernel_fd); ++ if (fd < 0) { ++ dbgprintf("%s: dup fd failed.\n", __func__); ++ return -1; ++ } ++ kbuf = slurp_fd(fd, NULL, decompressed_size, &nread); ++ if (!kbuf || nread != decompressed_size) { ++ dbgprintf("%s: slurp_fd failed.\n", __func__); ++ return -1; ++ } ++ return image_arm64_load(argc, argv, kbuf, decompressed_size, info); ++ } ++ ++ dbgprintf("%s: wrong kernel file descriptor.\n", __func__); ++ return -1; + } + + void pez_arm64_usage(void) +diff --git a/kexec/kexec-pe-zboot.c b/kexec/kexec-pe-zboot.c +index 2f2e052..3abd17d 100644 +--- a/kexec/kexec-pe-zboot.c ++++ b/kexec/kexec-pe-zboot.c +@@ -37,7 +37,8 @@ + * + * crude_buf: the content, which is read from the kernel file without any processing + */ +-int pez_prepare(const char *crude_buf, off_t buf_sz, int *kernel_fd) ++int pez_prepare(const char *crude_buf, off_t buf_sz, int *kernel_fd, ++ off_t *kernel_size) + { + int ret = -1; + int fd = 0; +@@ -110,6 +111,7 @@ int pez_prepare(const char *crude_buf, off_t buf_sz, int *kernel_fd) + goto fail_bad_header; + } + ++ *kernel_size = decompressed_size; + dbgprintf("%s: done\n", __func__); + + ret = 0; +diff --git a/kexec/kexec.c b/kexec/kexec.c +index c3b182e..1edbd34 100644 +--- a/kexec/kexec.c ++++ b/kexec/kexec.c +@@ -489,7 +489,7 @@ static int add_backup_segments(struct kexec_info *info, + return 0; + } + +-static char *slurp_fd(int fd, const char *filename, off_t size, off_t *nread) ++char *slurp_fd(int fd, const char *filename, off_t size, off_t *nread) + { + char *buf; + off_t progress; +diff --git a/kexec/kexec.h b/kexec/kexec.h +index ed3b499..0933389 100644 +--- a/kexec/kexec.h ++++ b/kexec/kexec.h +@@ -267,6 +267,7 @@ extern void die(const char *fmt, ...) + __attribute__ ((format (printf, 1, 2))); + extern void *xmalloc(size_t size); + extern void *xrealloc(void *ptr, size_t size); ++extern char *slurp_fd(int fd, const char *filename, off_t size, off_t *nread); + extern char *slurp_file(const char *filename, off_t *r_size); + extern char *slurp_file_mmap(const char *filename, off_t *r_size); + extern char *slurp_file_len(const char *filename, off_t size, off_t *nread); +-- +2.41.0 + diff --git a/0004-zboot-add-loongarch-kexec_load-support.patch b/0004-zboot-add-loongarch-kexec_load-support.patch new file mode 100644 index 0000000..7a04237 --- /dev/null +++ b/0004-zboot-add-loongarch-kexec_load-support.patch @@ -0,0 +1,171 @@ +From 2495ccfc52069ecec46031587c94b03ae66ed5d2 Mon Sep 17 00:00:00 2001 +From: Dave Young +Date: Thu, 14 Sep 2023 16:50:00 +0800 +Subject: [PATCH 4/4] zboot: add loongarch kexec_load support + +Copy arm64 code and change for loongarch so that the kexec -c can load +a zboot image. +Note: probe zboot image first otherwise the pei-loongarch file type will +be used. + +Signed-off-by: Dave Young +Signed-off-by: Simon Horman +--- + kexec/arch/loongarch/Makefile | 1 + + kexec/arch/loongarch/image-header.h | 1 + + kexec/arch/loongarch/kexec-loongarch.c | 1 + + kexec/arch/loongarch/kexec-loongarch.h | 4 + + kexec/arch/loongarch/kexec-pez-loongarch.c | 90 ++++++++++++++++++++++ + 5 files changed, 97 insertions(+) + create mode 100644 kexec/arch/loongarch/kexec-pez-loongarch.c + +diff --git a/kexec/arch/loongarch/Makefile b/kexec/arch/loongarch/Makefile +index 3b33b96..cee7e56 100644 +--- a/kexec/arch/loongarch/Makefile ++++ b/kexec/arch/loongarch/Makefile +@@ -6,6 +6,7 @@ loongarch_KEXEC_SRCS += kexec/arch/loongarch/kexec-elf-loongarch.c + loongarch_KEXEC_SRCS += kexec/arch/loongarch/kexec-pei-loongarch.c + loongarch_KEXEC_SRCS += kexec/arch/loongarch/kexec-elf-rel-loongarch.c + loongarch_KEXEC_SRCS += kexec/arch/loongarch/crashdump-loongarch.c ++loongarch_KEXEC_SRCS += kexec/arch/loongarch/kexec-pez-loongarch.c + + loongarch_MEM_REGIONS = kexec/mem_regions.c + +diff --git a/kexec/arch/loongarch/image-header.h b/kexec/arch/loongarch/image-header.h +index 3b75765..223d81f 100644 +--- a/kexec/arch/loongarch/image-header.h ++++ b/kexec/arch/loongarch/image-header.h +@@ -33,6 +33,7 @@ struct loongarch_image_header { + }; + + static const uint8_t loongarch_image_pe_sig[2] = {'M', 'Z'}; ++static const uint8_t loongarch_pe_machtype[6] = {'P','E', 0x0, 0x0, 0x64, 0x62}; + + /** + * loongarch_header_check_pe_sig - Helper to check the loongarch image header. +diff --git a/kexec/arch/loongarch/kexec-loongarch.c b/kexec/arch/loongarch/kexec-loongarch.c +index f47c998..62ff8fd 100644 +--- a/kexec/arch/loongarch/kexec-loongarch.c ++++ b/kexec/arch/loongarch/kexec-loongarch.c +@@ -165,6 +165,7 @@ int get_memory_ranges(struct memory_range **range, int *ranges, + + struct file_type file_type[] = { + {"elf-loongarch", elf_loongarch_probe, elf_loongarch_load, elf_loongarch_usage}, ++ {"pez-loongarch", pez_loongarch_probe, pez_loongarch_load, pez_loongarch_usage}, + {"pei-loongarch", pei_loongarch_probe, pei_loongarch_load, pei_loongarch_usage}, + }; + int file_types = sizeof(file_type) / sizeof(file_type[0]); +diff --git a/kexec/arch/loongarch/kexec-loongarch.h b/kexec/arch/loongarch/kexec-loongarch.h +index 5120a26..2c7624f 100644 +--- a/kexec/arch/loongarch/kexec-loongarch.h ++++ b/kexec/arch/loongarch/kexec-loongarch.h +@@ -27,6 +27,10 @@ int pei_loongarch_probe(const char *buf, off_t len); + int pei_loongarch_load(int argc, char **argv, const char *buf, off_t len, + struct kexec_info *info); + void pei_loongarch_usage(void); ++int pez_loongarch_probe(const char *kernel_buf, off_t kernel_size); ++int pez_loongarch_load(int argc, char **argv, const char *buf, off_t len, ++ struct kexec_info *info); ++void pez_loongarch_usage(void); + + int loongarch_process_image_header(const struct loongarch_image_header *h); + +diff --git a/kexec/arch/loongarch/kexec-pez-loongarch.c b/kexec/arch/loongarch/kexec-pez-loongarch.c +new file mode 100644 +index 0000000..942a47c +--- /dev/null ++++ b/kexec/arch/loongarch/kexec-pez-loongarch.c +@@ -0,0 +1,90 @@ ++/* ++ * LoongArch PE compressed Image (vmlinuz, ZBOOT) support. ++ * Based on arm64 code ++ */ ++ ++#define _GNU_SOURCE ++#include ++#include ++#include ++#include "kexec.h" ++#include "kexec-loongarch.h" ++#include ++#include "arch/options.h" ++ ++static int kernel_fd = -1; ++static off_t decompressed_size; ++ ++/* Returns: ++ * -1 : in case of error/invalid format (not a valid PE+compressed ZBOOT format. ++ */ ++int pez_loongarch_probe(const char *kernel_buf, off_t kernel_size) ++{ ++ int ret = -1; ++ const struct loongarch_image_header *h; ++ char *buf; ++ off_t buf_sz; ++ ++ buf = (char *)kernel_buf; ++ buf_sz = kernel_size; ++ if (!buf) ++ return -1; ++ h = (const struct loongarch_image_header *)buf; ++ ++ dbgprintf("%s: PROBE.\n", __func__); ++ if (buf_sz < sizeof(struct loongarch_image_header)) { ++ dbgprintf("%s: Not large enough to be a PE image.\n", __func__); ++ return -1; ++ } ++ if (!loongarch_header_check_pe_sig(h)) { ++ dbgprintf("%s: Not an PE image.\n", __func__); ++ return -1; ++ } ++ ++ if (buf_sz < sizeof(struct loongarch_image_header) + h->pe_header) { ++ dbgprintf("%s: PE image offset larger than image.\n", __func__); ++ return -1; ++ } ++ ++ if (memcmp(&buf[h->pe_header], ++ loongarch_pe_machtype, sizeof(loongarch_pe_machtype))) { ++ dbgprintf("%s: PE header doesn't match machine type.\n", __func__); ++ return -1; ++ } ++ ++ ret = pez_prepare(buf, buf_sz, &kernel_fd, &decompressed_size); ++ ++ /* Fixme: add sanity check of the decompressed kernel before return */ ++ return ret; ++} ++ ++int pez_loongarch_load(int argc, char **argv, const char *buf, off_t len, ++ struct kexec_info *info) ++{ ++ if (kernel_fd > 0 && decompressed_size > 0) { ++ char *kbuf; ++ off_t nread; ++ ++ info->kernel_fd = kernel_fd; ++ /* ++ * slurp_fd will close kernel_fd, but it is safe here ++ * due to no kexec_file_load support. ++ */ ++ kbuf = slurp_fd(kernel_fd, NULL, decompressed_size, &nread); ++ if (!kbuf || nread != decompressed_size) { ++ dbgprintf("%s: slurp_fd failed.\n", __func__); ++ return -1; ++ } ++ return pei_loongarch_load(argc, argv, kbuf, decompressed_size, info); ++ } ++ ++ dbgprintf("%s: wrong kernel file descriptor.\n", __func__); ++ return -1; ++} ++ ++void pez_loongarch_usage(void) ++{ ++ printf( ++" An LoongArch vmlinuz, PE image of a compressed, little endian.\n" ++" kernel, built with ZBOOT enabled.\n\n"); ++} +-- +2.41.0 + diff --git a/README.packit b/README.packit index 159f693..daffcaa 100644 --- a/README.packit +++ b/README.packit @@ -1,3 +1,3 @@ This repository is maintained by packit. https://packit.dev/ -The file was generated using packit 0.79.0. +The file was generated using packit 0.80.0. diff --git a/kexec-tools.spec b/kexec-tools.spec index e51d496..67a6da6 100644 --- a/kexec-tools.spec +++ b/kexec-tools.spec @@ -106,6 +106,18 @@ Requires: systemd-udev%{?_isa} # Patches 601 onward are generic patches # Patch601: kexec-tools-2.0.26-makedumpfile-Fix-wrong-exclusion-of-slab-pages-on-Linux-6.2.patch +# kexec-tools 2.0.27.git +# Author: Simon Horman +Patch602: 0001-kexec-tools-2.0.27.git.patch +# build: fix tarball creation +# Author: Leah Neukirchen +Patch603: 0002-build-fix-tarball-creation.patch +# zboot: enable arm64 kexec_load for zboot image +# Author: Dave Young +Patch604: 0003-zboot-enable-arm64-kexec_load-for-zboot-image.patch +# zboot: add loongarch kexec_load support +# Author: Dave Young +Patch605: 0004-zboot-add-loongarch-kexec_load-support.patch %description kexec-tools provides /sbin/kexec binary that facilitates a new @@ -360,6 +372,9 @@ fi %endif %changelog +* Tue Oct 10 2023 Coiby Xu - 2.0.27-1 +- kexec-tools 2.0.27 (Simon Horman) + * Thu Aug 31 2023 Coiby Xu - 2.0.27-1 - kexec-tools 2.0.27 (Simon Horman)