From d5e19a7ea2a9cdb156677ce957183a8c8b5a2fe5 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Wed, 14 Mar 2018 16:16:02 +0100 Subject: [PATCH] bootm: provide handlers the start of the OS image The bootm code needs to read the beginning of the OS image in order to determine the filetype. If it does so already, then we can provide the handlers the buffer. This can help the handlers to find some image metadata before loading the full image. Signed-off-by: Sascha Hauer --- common/bootm.c | 10 +++++++++- include/bootm.h | 7 +++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/common/bootm.c b/common/bootm.c index 3e48ca1d8..5ff6683fe 100644 --- a/common/bootm.c +++ b/common/bootm.c @@ -529,6 +529,7 @@ int bootm_boot(struct bootm_data *bootm_data) struct image_handler *handler; int ret; enum filetype os_type; + size_t size; if (!bootm_data->os_file) { printf("no image given\n"); @@ -548,7 +549,13 @@ int bootm_boot(struct bootm_data *bootm_data) data->os_address = bootm_data->os_address; data->os_entry = bootm_data->os_entry; - os_type = file_name_detect_type(data->os_file); + ret = read_file_2(data->os_file, &size, &data->os_header, PAGE_SIZE); + if (ret < 0 && ret != -EFBIG) + goto err_out; + if (size < PAGE_SIZE) + goto err_out; + + os_type = file_detect_type(data->os_header, PAGE_SIZE); if ((int)os_type < 0) { printf("could not open %s: %s\n", data->os_file, strerror(-os_type)); @@ -674,6 +681,7 @@ int bootm_boot(struct bootm_data *bootm_data) of_delete_node(data->of_root_node); globalvar_remove("linux.bootargs.bootm.appendroot"); + free(data->os_header); free(data->os_file); free(data->oftree_file); free(data->initrd_file); diff --git a/include/bootm.h b/include/bootm.h index 35c18dc27..62951d605 100644 --- a/include/bootm.h +++ b/include/bootm.h @@ -81,6 +81,13 @@ struct image_data { struct fdt_header *oftree; struct resource *oftree_res; + /* + * The first PAGE_SIZE bytes of the OS image. Can be used by the image + * handlers to analyze the OS image before actually loading the bulk of + * it. + */ + void *os_header; + enum bootm_verify verify; int verbose; int force;