x86: zimage: Allow dumping the image from outside the module
authorSimon Glass <sjg@chromium.org>
Sun, 24 Jan 2021 17:06:08 +0000 (10:06 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Mon, 1 Feb 2021 07:33:25 +0000 (15:33 +0800)
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 <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/include/asm/zimage.h
arch/x86/lib/zimage.c

index 64c0e6e..6679767 100644 (file)
@@ -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);
 
index 708025b..3e9ee12 100644 (file)
@@ -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;
 }