diff --git a/common/bootm.c b/common/bootm.c index a38d7e0..f8d9330 100644 --- a/common/bootm.c +++ b/common/bootm.c @@ -68,8 +68,12 @@ return -EINVAL; if (data->os) { + int num; + + num = simple_strtoul(data->os_part, NULL, 0); + data->os_res = uimage_load_to_sdram(data->os, - data->os_num, load_address); + num, load_address); if (!data->os_res) return -ENOMEM; @@ -106,8 +110,12 @@ return 0; if (data->initrd) { + int num; + + num = simple_strtoul(data->initrd_part, NULL, 0); + data->initrd_res = uimage_load_to_sdram(data->initrd, - data->initrd_num, load_address); + num, load_address); if (!data->initrd_res) return -ENOMEM; @@ -191,7 +199,8 @@ int ret; if (data->os) - return uimage_get_size(data->os, data->os_num); + return uimage_get_size(data->os, + simple_strtoul(data->os_part, NULL, 0)); if (data->os_file) { struct stat s; @@ -268,7 +277,7 @@ struct fdt_header *fdt; enum filetype ft; const char *oftree = data->oftree_file; - int num = data->oftree_num; + int num = simple_strtoul(data->oftree_part, NULL, 0); struct uimage_handle *of_handle; int release = 0; size_t size; @@ -358,7 +367,7 @@ data->initrd_file); if (initrd_type == filetype_uimage && data->initrd->header.ih_type == IH_TYPE_MULTI) - printf(", multifile image %d", data->initrd_num); + printf(", multifile image %s", data->initrd_part); printf("\n"); if (data->initrd_res) printf("initrd is at " PRINTF_CONVERSION_RESOURCE "-" PRINTF_CONVERSION_RESOURCE "\n", @@ -369,25 +378,27 @@ } } -static char *bootm_image_name_and_no(const char *name, int *no) +static int bootm_image_name_and_part(const char *name, char **filename, char **part) { char *at, *ret; if (!name || !*name) - return NULL; - - *no = 0; + return -EINVAL; ret = xstrdup(name); + + *filename = ret; + *part = NULL; + at = strchr(ret, '@'); if (!at) - return ret; + return 0; *at++ = 0; - *no = simple_strtoul(at, NULL, 10); + *part = at; - return ret; + return 0; } /* @@ -408,9 +419,9 @@ data = xzalloc(sizeof(*data)); - data->os_file = bootm_image_name_and_no(bootm_data->os_file, &data->os_num); - data->oftree_file = bootm_image_name_and_no(bootm_data->oftree_file, &data->oftree_num); - data->initrd_file = bootm_image_name_and_no(bootm_data->initrd_file, &data->initrd_num); + bootm_image_name_and_part(bootm_data->os_file, &data->os_file, &data->os_part); + bootm_image_name_and_part(bootm_data->oftree_file, &data->oftree_part, &data->os_part); + bootm_image_name_and_part(bootm_data->initrd_file, &data->initrd_part, &data->os_part); data->verbose = bootm_data->verbose; data->verify = bootm_data->verify; data->force = bootm_data->force; @@ -479,7 +490,7 @@ data->os_file); if (os_type == filetype_uimage && data->os->header.ih_type == IH_TYPE_MULTI) - printf(", multifile image %d", data->os_num); + printf(", multifile image %s", data->os_part); printf("\n"); if (IS_ENABLED(CONFIG_OFTREE)) { diff --git a/include/boot.h b/include/boot.h index b172c05..9ddb18b 100644 --- a/include/boot.h +++ b/include/boot.h @@ -28,7 +28,7 @@ /* if os is an uImage this will be provided */ struct uimage_handle *os; - int os_num; + char *os_part; /* otherwise only the filename will be provided */ char *os_file; @@ -49,7 +49,7 @@ /* if initrd is an uImage this will be provided */ struct uimage_handle *initrd; - int initrd_num; + char *initrd_part; /* otherwise only the filename will be provided */ char *initrd_file; @@ -57,7 +57,7 @@ unsigned long initrd_address; char *oftree_file; - int oftree_num; + char *oftree_part; struct device_node *of_root_node; struct fdt_header *oftree;