At present it is possible to dump an image within the zimage command, but
it is also useful to be able to dump it from elsewhere, for example in a
loader that has special handling for the different zimage stages.

Export this feature as a new function.

Signed-off-by: Simon Glass <s...@chromium.org>
---

 arch/x86/include/asm/zimage.h | 10 ++++++++++
 arch/x86/lib/zimage.c         | 23 +++++++++++++++--------
 2 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/arch/x86/include/asm/zimage.h b/arch/x86/include/asm/zimage.h
index 64c0e6e857b..6679767d16b 100644
--- a/arch/x86/include/asm/zimage.h
+++ b/arch/x86/include/asm/zimage.h
@@ -62,6 +62,16 @@ struct boot_params *load_zimage(char *image, unsigned long 
kernel_size,
 int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot,
                 ulong initrd_addr, ulong initrd_size, ulong cmdline_force);
 
+/**
+ * zimage_dump() - Dump the metadata of a zimage
+ *
+ * This shows all available information in a zimage that has been loaded.
+ *
+ * @base_ptr: Pointer to the boot parameters, typically at address
+ *     DEFAULT_SETUP_BASE
+ */
+void zimage_dump(struct boot_params *base_ptr);
+
 void setup_video(struct screen_info *screen_info);
 void setup_efi_info(struct efi_info *efi_info);
 
diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
index 708025b2071..3e9ee12400f 100644
--- a/arch/x86/lib/zimage.c
+++ b/arch/x86/lib/zimage.c
@@ -600,19 +600,12 @@ static void show_loader(struct setup_header *hdr)
        printf("\n");
 }
 
-int do_zboot_dump(struct cmd_tbl *cmdtp, int flag, int argc, char *const 
argv[])
+void zimage_dump(struct boot_params *base_ptr)
 {
-       struct boot_params *base_ptr = state.base_ptr;
        struct setup_header *hdr;
        const char *version;
        int i;
 
-       if (argc > 1)
-               base_ptr = (void *)simple_strtoul(argv[1], NULL, 16);
-       if (!base_ptr) {
-               printf("No zboot setup_base\n");
-               return CMD_RET_FAILURE;
-       }
        printf("Setup located at %p:\n\n", base_ptr);
        print_num64("ACPI RSDP addr", base_ptr->acpi_rsdp_addr);
 
@@ -688,6 +681,20 @@ int do_zboot_dump(struct cmd_tbl *cmdtp, int flag, int 
argc, char *const argv[])
        print_num("Handover offset", hdr->handover_offset);
        if (get_boot_protocol(hdr, false) >= 0x215)
                print_num("Kernel info offset", hdr->kernel_info_offset);
+}
+
+static int do_zboot_dump(struct cmd_tbl *cmdtp, int flag, int argc,
+                        char *const argv[])
+{
+       struct boot_params *base_ptr = state.base_ptr;
+
+       if (argc > 1)
+               base_ptr = (void *)simple_strtoul(argv[1], NULL, 16);
+       if (!base_ptr) {
+               printf("No zboot setup_base\n");
+               return CMD_RET_FAILURE;
+       }
+       zimage_dump(base_ptr);
 
        return 0;
 }
-- 
2.30.0.284.gd98b1dd5eaa7-goog

Reply via email to