* [PATCH v1 0/2] zboot: enable kexec_load for zboot kernel images
@ 2023-09-14 8:49 Dave Young
2023-09-14 8:49 ` [PATCH v1 1/2] zboot: enable arm64 kexec_load for zboot image Dave Young
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Dave Young @ 2023-09-14 8:49 UTC (permalink / raw)
To: kexec, Simon Horman, Pingfan Liu
The current kexec-tools only support kexec_file_load for zboot kernel
images on arm64.
This series tweak a bit of the code so kexec_load can also load zboot
images on both arm64 and loongarch.
V1 changes:
- dup the kernel_fd so that kexec_file_load can work since slurp_fd
will close it.
- code clean up.
Dave Young (2):
zboot: enable arm64 kexec_load for zboot image
zboot: add loongarch kexec_load support
include/kexec-pe-zboot.h | 3 +-
kexec/arch/arm64/kexec-vmlinuz-arm64.c | 26 ++++++-
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 ++++++++++++++++++++++
kexec/kexec-pe-zboot.c | 4 +-
kexec/kexec.c | 2 +-
kexec/kexec.h | 1 +
10 files changed, 127 insertions(+), 6 deletions(-)
create mode 100644 kexec/arch/loongarch/kexec-pez-loongarch.c
--
2.37.2
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v1 1/2] zboot: enable arm64 kexec_load for zboot image
2023-09-14 8:49 [PATCH v1 0/2] zboot: enable kexec_load for zboot kernel images Dave Young
@ 2023-09-14 8:49 ` Dave Young
2023-09-14 9:55 ` Baoquan He
2023-09-15 1:23 ` Pingfan Liu
2023-09-14 8:50 ` [PATCH v1 2/2] zboot: add loongarch kexec_load support Dave Young
2023-09-20 11:47 ` [PATCH v1 0/2] zboot: enable kexec_load for zboot kernel images Simon Horman
2 siblings, 2 replies; 6+ messages in thread
From: Dave Young @ 2023-09-14 8:49 UTC (permalink / raw)
To: kexec, Simon Horman, Pingfan Liu
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 <dyoung@redhat.com>
---
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 e2e0448a81f2..374916cbe883 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 c0ee47c8f50a..e291a34c97ad 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 2f2e052b76c5..3abd17d9fe59 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 c3b182e254e0..1edbd349c86d 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 ed3b499a80f2..093338969c57 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.37.2
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v1 2/2] zboot: add loongarch kexec_load support
2023-09-14 8:49 [PATCH v1 0/2] zboot: enable kexec_load for zboot kernel images Dave Young
2023-09-14 8:49 ` [PATCH v1 1/2] zboot: enable arm64 kexec_load for zboot image Dave Young
@ 2023-09-14 8:50 ` Dave Young
2023-09-20 11:47 ` [PATCH v1 0/2] zboot: enable kexec_load for zboot kernel images Simon Horman
2 siblings, 0 replies; 6+ messages in thread
From: Dave Young @ 2023-09-14 8:50 UTC (permalink / raw)
To: kexec, Simon Horman, Pingfan Liu
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 <dyoung@redhat.com>
---
kexec/arch/loongarch/Makefile | 1 +
| 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 3b33b9693287..cee7e569a2a2 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
--git a/kexec/arch/loongarch/image-header.h b/kexec/arch/loongarch/image-header.h
index 3b7576552685..223d81f77d9f 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 f47c99861674..62ff8fd1aeb7 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 5120a26fd513..2c7624f2fd3a 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 000000000000..942a47c0eade
--- /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 <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include "kexec.h"
+#include "kexec-loongarch.h"
+#include <kexec-pe-zboot.h>
+#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.37.2
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v1 1/2] zboot: enable arm64 kexec_load for zboot image
2023-09-14 8:49 ` [PATCH v1 1/2] zboot: enable arm64 kexec_load for zboot image Dave Young
@ 2023-09-14 9:55 ` Baoquan He
2023-09-15 1:23 ` Pingfan Liu
1 sibling, 0 replies; 6+ messages in thread
From: Baoquan He @ 2023-09-14 9:55 UTC (permalink / raw)
To: Dave Young; +Cc: kexec, Simon Horman, Pingfan Liu
On 09/14/23 at 04:49pm, Dave Young wrote:
> 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 <dyoung@redhat.com>
> ---
> 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(-)
I got this problem too on arm64 machine, applied this patch to test, can
confirm it works to fix the load failure when kexec_load is taken.
Tested-by: Baoquan He <bhe@redhat.com>
>
> diff --git a/include/kexec-pe-zboot.h b/include/kexec-pe-zboot.h
> index e2e0448a81f2..374916cbe883 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 c0ee47c8f50a..e291a34c97ad 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 2f2e052b76c5..3abd17d9fe59 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 c3b182e254e0..1edbd349c86d 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 ed3b499a80f2..093338969c57 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.37.2
>
>
> _______________________________________________
> kexec mailing list
> kexec@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec
>
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v1 1/2] zboot: enable arm64 kexec_load for zboot image
2023-09-14 8:49 ` [PATCH v1 1/2] zboot: enable arm64 kexec_load for zboot image Dave Young
2023-09-14 9:55 ` Baoquan He
@ 2023-09-15 1:23 ` Pingfan Liu
1 sibling, 0 replies; 6+ messages in thread
From: Pingfan Liu @ 2023-09-15 1:23 UTC (permalink / raw)
To: Dave Young; +Cc: kexec, Simon Horman
On Thu, Sep 14, 2023 at 4:50 PM Dave Young <dyoung@redhat.com> wrote:
>
> 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 <dyoung@redhat.com>
> ---
> 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 e2e0448a81f2..374916cbe883 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 c0ee47c8f50a..e291a34c97ad 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 2f2e052b76c5..3abd17d9fe59 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 c3b182e254e0..1edbd349c86d 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 ed3b499a80f2..093338969c57 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.37.2
>
Have tested both kexec_load and kexec_file_load, both of them work.
Reviewed-by: Pingfan Liu <piliu@redhat.com>
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v1 0/2] zboot: enable kexec_load for zboot kernel images
2023-09-14 8:49 [PATCH v1 0/2] zboot: enable kexec_load for zboot kernel images Dave Young
2023-09-14 8:49 ` [PATCH v1 1/2] zboot: enable arm64 kexec_load for zboot image Dave Young
2023-09-14 8:50 ` [PATCH v1 2/2] zboot: add loongarch kexec_load support Dave Young
@ 2023-09-20 11:47 ` Simon Horman
2 siblings, 0 replies; 6+ messages in thread
From: Simon Horman @ 2023-09-20 11:47 UTC (permalink / raw)
To: Dave Young; +Cc: kexec, Pingfan Liu
On Thu, Sep 14, 2023 at 04:49:58PM +0800, Dave Young wrote:
> The current kexec-tools only support kexec_file_load for zboot kernel
> images on arm64.
>
> This series tweak a bit of the code so kexec_load can also load zboot
> images on both arm64 and loongarch.
Thanks, applied.
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-09-20 11:47 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-09-14 8:49 [PATCH v1 0/2] zboot: enable kexec_load for zboot kernel images Dave Young
2023-09-14 8:49 ` [PATCH v1 1/2] zboot: enable arm64 kexec_load for zboot image Dave Young
2023-09-14 9:55 ` Baoquan He
2023-09-15 1:23 ` Pingfan Liu
2023-09-14 8:50 ` [PATCH v1 2/2] zboot: add loongarch kexec_load support Dave Young
2023-09-20 11:47 ` [PATCH v1 0/2] zboot: enable kexec_load for zboot kernel images Simon Horman
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.