X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=lib_i386%2Fbootm.c;h=f96d7bd6daa329fb9fe8f9d663306f60ba3d97e9;hb=d91803826985bfdf151eed66543ce3b1a301682f;hp=ab6c2a967616c8d210be87a7ebdcd671508e163d;hpb=5ad03eb3854c162684222a718b44c0716ea0db03;p=u-boot diff --git a/lib_i386/bootm.c b/lib_i386/bootm.c index ab6c2a9676..f96d7bd6da 100644 --- a/lib_i386/bootm.c +++ b/lib_i386/bootm.c @@ -24,38 +24,57 @@ #include #include #include -#include +#include #include #include /*cmd_boot.c*/ -extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); - -void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - image_header_t *hdr, int verify) +int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images) { - void *base_ptr; + void *base_ptr; + ulong os_data, os_len; + image_header_t *hdr; - ulong os_data, os_len; - ulong initrd_start, initrd_end; +#if defined(CONFIG_FIT) + const void *data; + size_t len; +#endif - get_ramdisk (cmdtp, flag, argc, argv, hdr, verify, - IH_ARCH_I386, &initrd_start, &initrd_end); + if ((flag != 0) && (flag != BOOTM_STATE_OS_GO)) + return 1; - /* if multi-part image, we need to advance base ptr */ - if (image_check_type (hdr, IH_TYPE_MULTI)) { - image_multi_getimg (hdr, 0, &os_data, &os_len); + if (images->legacy_hdr_valid) { + hdr = images->legacy_hdr_os; + if (image_check_type (hdr, IH_TYPE_MULTI)) { + /* if multi-part image, we need to get first subimage */ + image_multi_getimg (hdr, 0, &os_data, &os_len); + } else { + /* otherwise get image data */ + os_data = image_get_data (hdr); + os_len = image_get_data_size (hdr); + } +#if defined(CONFIG_FIT) + } else if (images->fit_uname_os) { + ret = fit_image_get_data (images->fit_hdr_os, + images->fit_noffset_os, &data, &len); + if (ret) { + puts ("Can't get image data/size!\n"); + goto error; + } + os_data = (ulong)data; + os_len = (ulong)len; +#endif } else { - os_data = image_get_data (hdr); - os_len = image_get_data_size (hdr); + puts ("Could not find kernel image!\n"); + goto error; } base_ptr = load_zimage ((void*)os_data, os_len, - initrd_start, initrd_end - initrd_start, 0); + images->rd_start, images->rd_end - images->rd_start, 0); if (NULL == base_ptr) { printf ("## Kernel loading failed ...\n"); - do_reset(cmdtp, flag, argc, argv); + goto error; } @@ -68,5 +87,8 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], printf("\nStarting kernel ...\n\n"); boot_zimage(base_ptr); + /* does not return */ +error: + return 1; }