Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@xxxxxxxxxxxx> --- arch/arm/lib/bootm.c | 2 + arch/blackfin/lib/blackfin_linux.c | 1 + arch/nios2/lib/bootm.c | 1 + arch/ppc/lib/ppclinux.c | 1 + common/bootm.c | 79 ++++++++++++-------------------------- common/image-fit.c | 14 +++++++ common/misc.c | 1 + common/uimage.c | 32 +++++++++++++++ include/bootm.h | 1 + include/image-fit.h | 1 + include/image.h | 2 + 11 files changed, 80 insertions(+), 55 deletions(-) diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c index 8068a53be..204344f87 100644 --- a/arch/arm/lib/bootm.c +++ b/arch/arm/lib/bootm.c @@ -217,6 +217,7 @@ static int do_bootm_linux(struct image_data *data) static struct image_handler uimage_handler = { .name = "ARM Linux uImage", + .open = uimage_bootm_open, .bootm = do_bootm_linux, .filetype = filetype_uimage, .ih_os = IH_OS_LINUX, @@ -579,6 +580,7 @@ BAREBOX_MAGICVAR(aimage_noverwrite_tags, "Disable overwrite of the tags addr wit static struct image_handler arm_fit_handler = { .name = "FIT image", + .open = fit_bootm_open, .bootm = do_bootm_linux, .filetype = filetype_oftree, }; diff --git a/arch/blackfin/lib/blackfin_linux.c b/arch/blackfin/lib/blackfin_linux.c index 5ebd284d1..27002eadb 100644 --- a/arch/blackfin/lib/blackfin_linux.c +++ b/arch/blackfin/lib/blackfin_linux.c @@ -68,6 +68,7 @@ static int do_bootm_linux(struct image_data *idata) static struct image_handler handler = { .name = "Blackfin Linux", + .open = uimage_bootm_open, .bootm = do_bootm_linux, .filetype = filetype_uimage, .ih_os = IH_OS_LINUX, diff --git a/arch/nios2/lib/bootm.c b/arch/nios2/lib/bootm.c index 34908bde3..f1b3c2624 100644 --- a/arch/nios2/lib/bootm.c +++ b/arch/nios2/lib/bootm.c @@ -69,6 +69,7 @@ static int do_bootm_linux(struct image_data *idata) static struct image_handler handler = { .name = "NIOS2 Linux", + .open = uimage_bootm_open, .bootm = do_bootm_linux, .filetype = filetype_uimage, .ih_os = IH_OS_LINUX, diff --git a/arch/ppc/lib/ppclinux.c b/arch/ppc/lib/ppclinux.c index 3fca6b272..c882938fa 100644 --- a/arch/ppc/lib/ppclinux.c +++ b/arch/ppc/lib/ppclinux.c @@ -100,6 +100,7 @@ error: static struct image_handler handler = { .name = "PowerPC Linux", + .open = uimage_bootm_open, .bootm = do_bootm_linux, .filetype = filetype_uimage, .ih_os = IH_OS_LINUX, diff --git a/common/bootm.c b/common/bootm.c index 81625d915..64c933b3c 100644 --- a/common/bootm.c +++ b/common/bootm.c @@ -34,7 +34,7 @@ int register_image_handler(struct image_handler *handler) } static struct image_handler *bootm_find_handler(enum filetype filetype, - struct image_data *data) + struct image_data *data, int enforce_os) { struct image_handler *handler; @@ -42,9 +42,16 @@ static struct image_handler *bootm_find_handler(enum filetype filetype, if (filetype != filetype_uimage && handler->filetype == filetype) return handler; - if (filetype == filetype_uimage && - handler->ih_os == data->os->header.ih_os) - return handler; + if (filetype == filetype_uimage) { + /* + * we can take the first one as open is the same + * not matter the OS + */ + if (enforce_os && handler->ih_os == data->os->header.ih_os) + return handler; + else + return handler; + } } return NULL; @@ -441,38 +448,6 @@ int bootm_get_os_size(struct image_data *data) return -EINVAL; } -static int bootm_open_os_uimage(struct image_data *data) -{ - int ret; - - data->os = uimage_open(data->os_file); - if (!data->os) - return -EINVAL; - - if (bootm_get_verify_mode() > BOOTM_VERIFY_NONE) { - ret = uimage_verify(data->os); - if (ret) { - printf("Checking data crc failed with %s\n", - strerror(-ret)); - uimage_close(data->os); - return ret; - } - } - - uimage_print_contents(data->os); - - if (data->os->header.ih_arch != IH_ARCH) { - printf("Unsupported Architecture 0x%x\n", - data->os->header.ih_arch); - return -EINVAL; - } - - if (data->os_address == UIMAGE_SOME_ADDRESS) - data->os_address = data->os->header.ih_load; - - return 0; -} - static void bootm_print_info(struct image_data *data) { if (data->os_res) @@ -548,6 +523,14 @@ int bootm_boot(struct bootm_data *bootm_data) goto err_out; } + handler = bootm_find_handler(os_type, data, 0); + if (!handler) { + printf("no image handler found for image type %s\n", + file_type_to_string(os_type)); + ret = -ENODEV; + goto err_out; + } + if (IS_ENABLED(CONFIG_BOOTM_FORCE_SIGNED_IMAGES)) { data->verify = BOOTM_VERIFY_SIGNATURE; @@ -565,25 +548,11 @@ int bootm_boot(struct bootm_data *bootm_data) } } - if (IS_ENABLED(CONFIG_FITIMAGE) && os_type == filetype_oftree) { - struct fit_handle *fit; - - fit = fit_open(data->os_file, data->os_part, data->verbose, data->verify); - if (IS_ERR(fit)) { - printf("Loading FIT image %s failed with: %s\n", data->os_file, - strerrorp(fit)); - ret = PTR_ERR(fit); - goto err_out; - } - - data->os_fit = fit; - } - - if (os_type == filetype_uimage) { - ret = bootm_open_os_uimage(data); + if (handler->open) { + ret = handler->open(data); if (ret) { - printf("Loading OS image failed with: %s\n", - strerror(-ret)); + printf("Loading OS image %s failed with: %s\n", + handler->name, strerror(-ret)); goto err_out; } } @@ -610,7 +579,7 @@ int bootm_boot(struct bootm_data *bootm_data) if (data->os_address == UIMAGE_SOME_ADDRESS) data->os_address = UIMAGE_INVALID_ADDRESS; - handler = bootm_find_handler(os_type, data); + handler = bootm_find_handler(os_type, data, 1); if (!handler) { printf("no image handler found for image type %s\n", file_type_to_string(os_type)); diff --git a/common/image-fit.c b/common/image-fit.c index 6a01c614c..5c014d66b 100644 --- a/common/image-fit.c +++ b/common/image-fit.c @@ -583,6 +583,19 @@ struct fit_handle *fit_open(const char *filename, const char *config, bool verbo return ERR_PTR(ret); } +int fit_bootm_open(struct image_data *data) +{ + struct fit_handle *fit; + + fit = fit_open(data->os_file, data->os_part, data->verbose, data->verify); + if (IS_ERR(fit)) + return PTR_ERR(fit); + + data->os_fit = fit; + + return 0; +} + void fit_close(struct fit_handle *handle) { if (handle->root) @@ -604,6 +617,7 @@ static int do_bootm_sandbox_fit(struct image_data *data) static struct image_handler sandbox_fit_handler = { .name = "FIT image", + .open = fit_bootm_open, .bootm = do_bootm_sandbox_fit, .filetype = filetype_oftree, }; diff --git a/common/misc.c b/common/misc.c index f0f0b808b..60acbd009 100644 --- a/common/misc.c +++ b/common/misc.c @@ -101,6 +101,7 @@ const char *strerror(int errnum) case EISNAM : str = "Is a named type file"; break; case EREMOTEIO : str = "Remote I/O error"; break; #endif + case ESECVIOLATION : str = "Security Violation"; break; default: sprintf(errno_string, "error %d", errnum); return errno_string; diff --git a/common/uimage.c b/common/uimage.c index 28a25bba2..72c868882 100644 --- a/common/uimage.c +++ b/common/uimage.c @@ -527,3 +527,35 @@ out: return buf; } + +int uimage_bootm_open(struct image_data *data) +{ + int ret; + + data->os = uimage_open(data->os_file); + if (!data->os) + return -EINVAL; + + if (bootm_get_verify_mode() > BOOTM_VERIFY_NONE) { + ret = uimage_verify(data->os); + if (ret) { + printf("Checking data crc failed with %s\n", + strerror(-ret)); + uimage_close(data->os); + return ret; + } + } + + uimage_print_contents(data->os); + + if (data->os->header.ih_arch != IH_ARCH) { + printf("Unsupported Architecture 0x%x\n", + data->os->header.ih_arch); + return -EINVAL; + } + + if (data->os_address == UIMAGE_SOME_ADDRESS) + data->os_address = data->os->header.ih_load; + + return 0; +} diff --git a/include/bootm.h b/include/bootm.h index 6e9777a9a..1c7a145c6 100644 --- a/include/bootm.h +++ b/include/bootm.h @@ -92,6 +92,7 @@ struct image_handler { enum filetype filetype; int (*bootm)(struct image_data *data); + int (*open)(struct image_data *data); }; int register_image_handler(struct image_handler *handle); diff --git a/include/image-fit.h b/include/image-fit.h index c49f95826..e817ebfae 100644 --- a/include/image-fit.h +++ b/include/image-fit.h @@ -38,6 +38,7 @@ struct fit_handle { unsigned long initrd_size; }; +int fit_bootm_open(struct image_data *data); struct fit_handle *fit_open(const char *filename, const char *config, bool verbose, enum bootm_verify verify); void fit_close(struct fit_handle *handle); diff --git a/include/image.h b/include/image.h index 3e75d49b8..9ed265658 100644 --- a/include/image.h +++ b/include/image.h @@ -229,6 +229,8 @@ struct uimage_handle_data { ulong len; }; +struct image_data; +int uimage_bootm_open(struct image_data *data); struct uimage_handle *uimage_open(const char *filename); void uimage_close(struct uimage_handle *handle); int uimage_verify(struct uimage_handle *handle); -- 2.11.0 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox