[U-Boot-Users] [PATCH 0/8] [new uImage] patchset5: Dual format uImage handling framework

This patch series adds initial framework for dual format uImage support to U-boot. Booting control flow is reworked and is now able to recognize both formats: legacy format based on a binary image_header stucture and new FIT uImage format based on a libfdt. Legacy specific code is adapted a bit and enterd only for legacy format images. Proper new uImage format handling is not implement in this patch series, appropriate cases are stubed and will be updated with the new uImage format low level code in the comming patchsets.
To sum up: Legacy format image handling shall continue to work, FIT format image handling will produce debug messages and return with error.
Three other patches refactor legacy format specific code to a helper routines image_get_kernel(), image_get_fdt() and move PPC FDT blob relocattion code to a dedicated routine fdt_relocate().
Included are also fixes: reworked gen_get_image() and correced raw FDT blob handling when CONFIG_FIT is disabled.
Please review and comment.
Marian Balakowicz (8): [new uImage] Correct raw FDT blob handlig when CONFIG_FIT is disabled [new uImage] POWERPC: Add image_get_fdt() routine [new uImage] Add image_get_kernel() routine [new uImage] Move image verify flag to bootm_headers structure [Makefile] Sort COBJS in lib_<arch> Makefiles [new uImage] Optimize gen_get_image() flow control [new uImage] POWERPC: Split get_fdt() into get and relocate routines [new uImage] Add dual format uImage support framework
Cheers, m.

This patch adds framework for dual format images. Format detection is added and the bootm controll flow is updated to include cases for new FIT format uImages.
When the legacy (image_header based) format is detected appropriate legacy specific handling is invoked. For the new (FIT based) format uImages dual boot framework has a minial support, that will only print out a corresponding debug messages. Implementation of the FIT specific handling will be added in following patches.
Signed-off-by: Marian Balakowicz m8@semihalf.com ---
board/cray/L1/L1.c | 7 + board/esd/common/auto_update.c | 19 ++ board/mcc200/auto_update.c | 19 ++ board/mpl/common/common_util.c | 7 + board/siemens/common/fpga.c | 14 ++ board/trab/auto_update.c | 26 +++ common/cmd_autoscript.c | 56 ++++-- common/cmd_bootm.c | 361 ++++++++++++++++++++++++++++------------ common/cmd_doc.c | 28 ++- common/cmd_fdc.c | 44 +++-- common/cmd_fpga.c | 36 +++- common/cmd_ide.c | 41 +++-- common/cmd_nand.c | 59 +++++-- common/cmd_scsi.c | 31 ++- common/cmd_usb.c | 33 +++- common/cmd_ximg.c | 103 ++++++----- common/image.c | 117 +++++++++---- include/image.h | 53 +++++- lib_arm/bootm.c | 32 +++- lib_avr32/bootm.c | 32 +++- lib_blackfin/bootm.c | 22 ++ lib_i386/bootm.c | 35 +++- lib_m68k/bootm.c | 26 ++- lib_microblaze/bootm.c | 23 ++- lib_mips/bootm.c | 32 ++-- lib_nios/bootm.c | 2 lib_nios2/bootm.c | 20 ++ lib_ppc/bootm.c | 178 +++++++++++++++----- lib_sh/bootm.c | 22 ++ 29 files changed, 1074 insertions(+), 404 deletions(-)
diff --git a/board/cray/L1/L1.c b/board/cray/L1/L1.c index 8e6d74e..c00acc8 100644 --- a/board/cray/L1/L1.c +++ b/board/cray/L1/L1.c @@ -140,6 +140,13 @@ int misc_init_r (void) char bootcmd[32];
hdr = (image_header_t *) (CFG_MONITOR_BASE - image_get_header_size ()); +#if defined(CONFIG_FIT) + if (gen_image_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { + puts ("Non legacy image format not supported\n"); + return -1; + } +#endif + timestamp = (time_t)image_get_time (hdr); to_tm (timestamp, &tm); printf ("Welcome to U-Boot on Cray L1. Compiled %4d-%02d-%02d %2d:%02d:%02d (UTC)\n", tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); diff --git a/board/esd/common/auto_update.c b/board/esd/common/auto_update.c index cb8087b..976707d 100644 --- a/board/esd/common/auto_update.c +++ b/board/esd/common/auto_update.c @@ -91,6 +91,12 @@ int au_check_cksum_valid(int i, long nbytes) image_header_t *hdr;
hdr = (image_header_t *)LOAD_ADDR; +#if defined(CONFIG_FIT) + if (gen_image_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { + puts ("Non legacy image format not supported\n"); + return -1; + } +#endif
if ((au_image[i].type == AU_FIRMWARE) && (au_image[i].size != image_get_data_size (hdr))) { @@ -118,6 +124,13 @@ int au_check_header_valid(int i, long nbytes) unsigned long checksum;
hdr = (image_header_t *)LOAD_ADDR; +#if defined(CONFIG_FIT) + if (gen_image_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { + puts ("Non legacy image format not supported\n"); + return -1; + } +#endif + /* check the easy ones first */ #undef CHECK_VALID_DEBUG #ifdef CHECK_VALID_DEBUG @@ -183,6 +196,12 @@ int au_do_update(int i, long sz) #endif
hdr = (image_header_t *)LOAD_ADDR; +#if defined(CONFIG_FIT) + if (gen_image_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { + puts ("Non legacy image format not supported\n"); + return -1; + } +#endif
switch (au_image[i].type) { case AU_SCRIPT: diff --git a/board/mcc200/auto_update.c b/board/mcc200/auto_update.c index 8b520c8..fcae35a 100644 --- a/board/mcc200/auto_update.c +++ b/board/mcc200/auto_update.c @@ -143,6 +143,12 @@ int au_check_cksum_valid(int idx, long nbytes) image_header_t *hdr;
hdr = (image_header_t *)LOAD_ADDR; +#if defined(CONFIG_FIT) + if (gen_image_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { + puts ("Non legacy image format not supported\n"); + return -1; + } +#endif
if (nbytes != image_get_image_size (hdr)) { printf ("Image %s bad total SIZE\n", aufile[idx]); @@ -162,6 +168,13 @@ int au_check_header_valid(int idx, long nbytes) unsigned long checksum, fsize;
hdr = (image_header_t *)LOAD_ADDR; +#if defined(CONFIG_FIT) + if (gen_image_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { + puts ("Non legacy image format not supported\n"); + return -1; + } +#endif + /* check the easy ones first */ #undef CHECK_VALID_DEBUG #ifdef CHECK_VALID_DEBUG @@ -233,6 +246,12 @@ int au_do_update(int idx, long sz) uint nbytes;
hdr = (image_header_t *)LOAD_ADDR; +#if defined(CONFIG_FIT) + if (gen_image_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { + puts ("Non legacy image format not supported\n"); + return -1; + } +#endif
/* execute a script */ if (image_check_type (hdr, IH_TYPE_SCRIPT)) { diff --git a/board/mpl/common/common_util.c b/board/mpl/common/common_util.c index b171ca5..fffd25c 100644 --- a/board/mpl/common/common_util.c +++ b/board/mpl/common/common_util.c @@ -181,6 +181,13 @@ mpl_prg_image(uchar *ld_addr) image_header_t *hdr = (image_header_t *)ld_addr; int rc;
+#if defined(CONFIG_FIT) + if (gen_image_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { + puts ("Non legacy image format not supported\n"); + return -1; + } +#endif + if (!image_check_magic (hdr)) { puts("Bad Magic Number\n"); return 1; diff --git a/board/siemens/common/fpga.c b/board/siemens/common/fpga.c index 9d71946..a9a6dfe 100644 --- a/board/siemens/common/fpga.c +++ b/board/siemens/common/fpga.c @@ -137,6 +137,13 @@ static int fpga_load (fpga_t* fpga, ulong addr, int checkall) char msg[32]; int verify, i;
+#if defined(CONFIG_FIT) + if (gen_image_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { + puts ("Non legacy image format not supported\n"); + return -1; + } +#endif + /* * Check the image header and data of the net-list */ @@ -333,6 +340,13 @@ int fpga_init (void) }
hdr = (image_header_t *)addr; +#if defined(CONFIG_FIT) + if (gen_image_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { + puts ("Non legacy image format not supported\n"); + return -1; + } +#endif + if ((new_id = fpga_get_version(fpga, image_get_name (hdr))) == -1) return 1;
diff --git a/board/trab/auto_update.c b/board/trab/auto_update.c index bd9ee0c..8f67535 100644 --- a/board/trab/auto_update.c +++ b/board/trab/auto_update.c @@ -211,6 +211,12 @@ au_check_cksum_valid(int idx, long nbytes) image_header_t *hdr;
hdr = (image_header_t *)LOAD_ADDR; +#if defined(CONFIG_FIT) + if (gen_image_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { + puts ("Non legacy image format not supported\n"); + return -1; + } +#endif
if (nbytes != image_get_image_size (hdr)) { @@ -234,6 +240,13 @@ au_check_header_valid(int idx, long nbytes) unsigned char buf[4];
hdr = (image_header_t *)LOAD_ADDR; +#if defined(CONFIG_FIT) + if (gen_image_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { + puts ("Non legacy image format not supported\n"); + return -1; + } +#endif + /* check the easy ones first */ #undef CHECK_VALID_DEBUG #ifdef CHECK_VALID_DEBUG @@ -327,6 +340,12 @@ au_do_update(int idx, long sz) uint nbytes;
hdr = (image_header_t *)LOAD_ADDR; +#if defined(CONFIG_FIT) + if (gen_image_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { + puts ("Non legacy image format not supported\n"); + return -1; + } +#endif
/* disable the power switch */ *CPLD_VFD_BK |= POWER_OFF; @@ -417,6 +436,13 @@ au_update_eeprom(int idx) }
hdr = (image_header_t *)LOAD_ADDR; +#if defined(CONFIG_FIT) + if (gen_image_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { + puts ("Non legacy image format not supported\n"); + return -1; + } +#endif + /* write the time field into EEPROM */ off = auee_off[idx].time; val = image_get_time (hdr); diff --git a/common/cmd_autoscript.c b/common/cmd_autoscript.c index 53f8e83..f9ab1d9 100644 --- a/common/cmd_autoscript.c +++ b/common/cmd_autoscript.c @@ -53,7 +53,7 @@ int autoscript (ulong addr) { ulong len; - image_header_t *hdr = (image_header_t *)addr; + image_header_t *hdr; ulong *data; char *cmd; int rcode = 0; @@ -61,33 +61,47 @@ autoscript (ulong addr)
verify = getenv_verify ();
- if (!image_check_magic (hdr)) { - puts ("Bad magic number\n"); - return 1; - } + switch (gen_image_get_format ((void *)addr)) { + case IMAGE_FORMAT_LEGACY: + hdr = (image_header_t *)addr;
- if (!image_check_hcrc (hdr)) { - puts ("Bad header crc\n"); - return 1; - } + if (!image_check_magic (hdr)) { + puts ("Bad magic number\n"); + return 1; + }
- if (verify) { - if (!image_check_dcrc (hdr)) { - puts ("Bad data crc\n"); + if (!image_check_hcrc (hdr)) { + puts ("Bad header crc\n"); return 1; } - }
- if (!image_check_type (hdr, IH_TYPE_SCRIPT)) { - puts ("Bad image type\n"); - return 1; - } + if (verify) { + if (!image_check_dcrc (hdr)) { + puts ("Bad data crc\n"); + return 1; + } + } + + if (!image_check_type (hdr, IH_TYPE_SCRIPT)) { + puts ("Bad image type\n"); + return 1; + }
- /* get length of script */ - data = (ulong *)image_get_data (hdr); + /* get length of script */ + data = (ulong *)image_get_data (hdr);
- if ((len = image_to_cpu (*data)) == 0) { - puts ("Empty Script\n"); + if ((len = image_to_cpu (*data)) == 0) { + puts ("Empty Script\n"); + return 1; + } + break; +#if defined(CONFIG_FIT) + case IMAGE_FORMAT_FIT: + fit_unsupported ("autoscript"); + return 1; +#endif + default: + puts ("Wrong image format for autoscript\n"); return 1; }
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index bb60a84..3f09988 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -65,8 +65,9 @@ static int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); static void fixup_silent_linux (void); #endif
-static image_header_t *get_kernel (cmd_tbl_t *cmdtp, int flag, +static void *get_kernel (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], int verify, + bootm_headers_t *images, ulong *os_data, ulong *os_len); extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
@@ -80,7 +81,7 @@ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); */ typedef void boot_os_fn (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - image_header_t *hdr, /* of image to boot */ + bootm_headers_t *images,/* pointers to os/initrd/fdt */ int verify); /* getenv("verify")[0] != 'n' */
extern boot_os_fn do_bootm_linux; @@ -102,6 +103,7 @@ static boot_os_fn do_bootm_artos; #endif
ulong load_addr = CFG_LOAD_ADDR; /* Default Load Address */ +static bootm_headers_t images; /* pointers to os/initrd/fdt images */
/*******************************************************************/ @@ -113,21 +115,47 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) const char *type_name; uint unc_len = CFG_BOOTM_LEN; int verify = getenv_verify(); + uint8_t comp, type, os;
- image_header_t *hdr; + void *os_hdr; ulong os_data, os_len; - ulong image_start, image_end; ulong load_start, load_end;
+ memset ((void *)&images, 0, sizeof (images)); + /* get kernel image header, start address and length */ - hdr = get_kernel (cmdtp, flag, argc, argv, verify, - &os_data, &os_len); - if (hdr == NULL) + os_hdr = get_kernel (cmdtp, flag, argc, argv, verify, + &images, &os_data, &os_len); + if (os_len == 0) return 1;
show_boot_progress (6);
+ /* get image parameters */ + switch (gen_image_get_format (os_hdr)) { + case IMAGE_FORMAT_LEGACY: + type = image_get_type (os_hdr); + comp = image_get_comp (os_hdr); + os = image_get_os (os_hdr); + + image_end = image_get_image_end (os_hdr); + load_start = image_get_load (os_hdr); + break; +#if defined(CONFIG_FIT) + case IMAGE_FORMAT_FIT: + fit_unsupported ("bootm"); + return 1; +#endif + default: + puts ("ERROR: unknown image format type!\n"); + return 1; + } + + image_start = (ulong)os_hdr; + load_end = 0; + type_name = image_get_type_name (type); + /* * We have reached the point of no return: we are going to * overwrite all exception vector code, so we cannot easily @@ -146,21 +174,14 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) dcache_disable(); #endif
- type_name = image_get_type_name (image_get_type (hdr)); - - image_start = (ulong)hdr; - image_end = image_get_image_end (hdr); - load_start = image_get_load (hdr); - load_end = 0; - - switch (image_get_comp (hdr)) { + switch (comp) { case IH_COMP_NONE: - if (image_get_load (hdr) == (ulong)hdr) { + if (load_start == (ulong)os_hdr) { printf (" XIP %s ... ", type_name); } else { printf (" Loading %s ... ", type_name);
- memmove_wd ((void *)image_get_load (hdr), + memmove_wd ((void *)load_start, (void *)os_data, os_len, CHUNKSZ);
load_end = load_start + os_len; @@ -169,7 +190,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) break; case IH_COMP_GZIP: printf (" Uncompressing %s ... ", type_name); - if (gunzip ((void *)image_get_load (hdr), unc_len, + if (gunzip ((void *)load_start, unc_len, (uchar *)os_data, &os_len) != 0) { puts ("GUNZIP ERROR - must RESET board to recover\n"); show_boot_progress (-6); @@ -186,7 +207,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) * use slower decompression algorithm which requires * at most 2300 KB of memory. */ - int i = BZ2_bzBuffToBuffDecompress ((char*)image_get_load (hdr), + int i = BZ2_bzBuffToBuffDecompress ((char*)load_start, &unc_len, (char *)os_data, os_len, CFG_MALLOC_LEN < (4096 * 1024), 0); if (i != BZ_OK) { @@ -201,7 +222,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) default: if (iflag) enable_interrupts(); - printf ("Unimplemented compression type %d\n", image_get_comp (hdr)); + printf ("Unimplemented compression type %d\n", comp); show_boot_progress (-7); return 1; } @@ -219,42 +240,42 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
show_boot_progress (8);
- switch (image_get_os (hdr)) { + switch (os) { default: /* handled by (original) Linux case */ case IH_OS_LINUX: #ifdef CONFIG_SILENT_CONSOLE fixup_silent_linux(); #endif - do_bootm_linux (cmdtp, flag, argc, argv, hdr, verify); + do_bootm_linux (cmdtp, flag, argc, argv, &images, verify); break;
case IH_OS_NETBSD: - do_bootm_netbsd (cmdtp, flag, argc, argv, hdr, verify); + do_bootm_netbsd (cmdtp, flag, argc, argv, &images, verify); break;
#ifdef CONFIG_LYNXKDI case IH_OS_LYNXOS: - do_bootm_lynxkdi (cmdtp, flag, argc, argv, hdr, verify); + do_bootm_lynxkdi (cmdtp, flag, argc, argv, &images, verify); break; #endif
case IH_OS_RTEMS: - do_bootm_rtems (cmdtp, flag, argc, argv, hdr, verify); + do_bootm_rtems (cmdtp, flag, argc, argv, &images, verify); break;
#if defined(CONFIG_CMD_ELF) case IH_OS_VXWORKS: - do_bootm_vxworks (cmdtp, flag, argc, argv, hdr, verify); + do_bootm_vxworks (cmdtp, flag, argc, argv, &images, verify); break;
case IH_OS_QNX: - do_bootm_qnxelf (cmdtp, flag, argc, argv, hdr, verify); + do_bootm_qnxelf (cmdtp, flag, argc, argv, &images, verify); break; #endif
#ifdef CONFIG_ARTOS case IH_OS_ARTOS: - do_bootm_artos (cmdtp, flag, argc, argv, hdr, verify); + do_bootm_artos (cmdtp, flag, argc, argv, &images, verify); break; #endif } @@ -279,77 +300,119 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) * pointer to image header if valid image was found, plus kernel start * address and length, otherwise NULL */ -static image_header_t *get_kernel (cmd_tbl_t *cmdtp, int flag, +static void *get_kernel (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], int verify, + bootm_headers_t *images, ulong *os_data, ulong *os_len) { image_header_t *hdr; ulong img_addr; +#if defined(CONFIG_FIT) + void *fit_hdr; + const char *fit_uname_config = NULL; + const char *fit_uname_kernel = NULL; +#endif
+ /* find out kernel image address */ if (argc < 2) { img_addr = load_addr; + debug ("* kernel: default image load address = 0x%08lx\n", + load_addr); +#if defined(CONFIG_FIT) + } else if (fit_parse_conf (argv[1], load_addr, &img_addr, + &fit_uname_config)) { + debug ("* kernel: config '%s' from image at 0x%08lx\n", + fit_uname_config, img_addr); + } else if (fit_parse_subimage (argv[1], load_addr, &img_addr, + &fit_uname_kernel)) { + debug ("* kernel: subimage '%s' from image at 0x%08lx\n", + fit_uname_kernel, img_addr); +#endif } else { img_addr = simple_strtoul(argv[1], NULL, 16); + debug ("* kernel: cmdline image address = 0x%08lx\n", img_addr); }
show_boot_progress (1); - printf ("## Booting image at %08lx ...\n", img_addr); + printf ("## Booting kernel image at %08lx ...\n", img_addr);
/* copy from dataflash if needed */ img_addr = gen_get_image (img_addr); - hdr = (image_header_t *)img_addr;
- if (!image_check_magic(hdr)) { - puts ("Bad Magic Number\n"); - show_boot_progress (-1); - return NULL; - } - show_boot_progress (2); + /* check image type, for FIT images get FIT kernel node */ + switch (gen_image_get_format ((void *)img_addr)) { + case IMAGE_FORMAT_LEGACY:
- if (!image_check_hcrc (hdr)) { - puts ("Bad Header Checksum\n"); - show_boot_progress (-2); - return NULL; - } + debug ("* kernel: legacy format image\n"); + hdr = (image_header_t *)img_addr;
- show_boot_progress (3); - image_print_contents (hdr); + if (!image_check_magic(hdr)) { + puts ("Bad Magic Number\n"); + show_boot_progress (-1); + return NULL; + } + show_boot_progress (2);
- if (verify) { - puts (" Verifying Checksum ... "); - if (!image_check_dcrc (hdr)) { - printf ("Bad Data CRC\n"); - show_boot_progress (-3); + if (!image_check_hcrc (hdr)) { + puts ("Bad Header Checksum\n"); + show_boot_progress (-2); return NULL; } - puts ("OK\n"); - } - show_boot_progress (4);
- if (!image_check_target_arch (hdr)) { - printf ("Unsupported Architecture 0x%x\n", image_get_arch (hdr)); - show_boot_progress (-4); - return NULL; - } - show_boot_progress (5); + show_boot_progress (3); + image_print_contents (hdr); + + if (verify) { + puts (" Verifying Checksum ... "); + if (!image_check_dcrc (hdr)) { + printf ("Bad Data CRC\n"); + show_boot_progress (-3); + return NULL; + } + puts ("OK\n"); + } + show_boot_progress (4); + + if (!image_check_target_arch (hdr)) { + printf ("Unsupported Architecture 0x%x\n", image_get_arch (hdr)); + show_boot_progress (-4); + return NULL; + } + show_boot_progress (5); + + switch (image_get_type (hdr)) { + case IH_TYPE_KERNEL: + *os_data = image_get_data (hdr); + *os_len = image_get_data_size (hdr); + break; + case IH_TYPE_MULTI: + image_multi_getimg (hdr, 0, os_data, os_len); + break; + default: + printf ("Wrong Image Type for %s command\n", cmdtp->name); + show_boot_progress (-5); + return NULL; + } + images->legacy_hdr_os = hdr; + images->legacy_hdr_valid = 1;
- switch (image_get_type (hdr)) { - case IH_TYPE_KERNEL: - *os_data = image_get_data (hdr); - *os_len = image_get_data_size (hdr); - break; - case IH_TYPE_MULTI: - image_multi_getimg (hdr, 0, os_data, os_len); break; +#if defined(CONFIG_FIT) + case IMAGE_FORMAT_FIT: + fit_hdr = (void *)img_addr; + debug ("* kernel: FIT format image\n"); + fit_unsupported ("kernel"); + return NULL; +#endif default: - printf ("Wrong Image Type for %s command\n", cmdtp->name); - show_boot_progress (-5); + printf ("Wrong Image Format for %s command\n", cmdtp->name); return NULL; } + debug (" kernel data at 0x%08lx, end = 0x%08lx\n", *os_data, *os_data + *os_len);
- return hdr; + return (void *)img_addr; }
U_BOOT_CMD( @@ -426,29 +489,44 @@ int do_iminfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
static int image_info (ulong addr) { - image_header_t *hdr = (image_header_t *)addr; + void *hdr = (void *)addr;
printf ("\n## Checking Image at %08lx ...\n", addr);
- if (!image_check_magic (hdr)) { - puts (" Bad Magic Number\n"); - return 1; - } + switch (gen_image_get_format (hdr)) { + case IMAGE_FORMAT_LEGACY: + puts (" Legacy image found\n"); + if (!image_check_magic (hdr)) { + puts (" Bad Magic Number\n"); + return 1; + }
- if (!image_check_hcrc (hdr)) { - puts (" Bad Header Checksum\n"); - return 1; - } + if (!image_check_hcrc (hdr)) { + puts (" Bad Header Checksum\n"); + return 1; + }
- image_print_contents (hdr); + image_print_contents (hdr);
- puts (" Verifying Checksum ... "); - if (!image_check_dcrc (hdr)) { - puts (" Bad Data CRC\n"); - return 1; + puts (" Verifying Checksum ... "); + if (!image_check_dcrc (hdr)) { + puts (" Bad Data CRC\n"); + return 1; + } + puts ("OK\n"); + return 0; +#if defined(CONFIG_FIT) + case IMAGE_FORMAT_FIT: + puts (" FIT image found\n"); + fit_unsupported ("iminfo"); + return 0; +#endif + default: + puts ("Unknown image format!\n"); + break; } - puts ("OK\n"); - return 0; + + return 1; }
U_BOOT_CMD( @@ -470,7 +548,7 @@ int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { flash_info_t *info; int i, j; - image_header_t *hdr; + void *hdr;
for (i = 0, info = &flash_info[0]; i < CFG_MAX_FLASH_BANKS; ++i, ++info) { @@ -479,23 +557,38 @@ int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) goto next_bank; for (j = 0; j < info->sector_count; ++j) {
- hdr = (image_header_t *)info->start[j]; - - if (!hdr || !image_check_magic (hdr)) + hdr = (void *)info->start[j]; + if (!hdr) goto next_sector;
- if (!image_check_hcrc (hdr)) + switch (gen_image_get_format (hdr)) { + case IMAGE_FORMAT_LEGACY: + if (!image_check_magic (hdr)) + goto next_sector; + + if (!image_check_hcrc (hdr)) + goto next_sector; + + printf ("Legacy Image at %08lX:\n", (ulong)hdr); + image_print_contents (hdr); + + puts (" Verifying Checksum ... "); + if (!image_check_dcrc (hdr)) { + puts ("Bad Data CRC\n"); + } else { + puts ("OK\n"); + } + break; +#if defined(CONFIG_FIT) + case IMAGE_FORMAT_FIT: + printf ("FIT Image at %08lX:\n", (ulong)hdr); + fit_unsupported ("imls"); + break; +#endif + default: goto next_sector; - - printf ("Image at %08lX:\n", (ulong)hdr); - image_print_contents (hdr); - - puts (" Verifying Checksum ... "); - if (!image_check_dcrc (hdr)) { - puts ("Bad Data CRC\n"); - } else { - puts ("OK\n"); } + next_sector: ; } next_bank: ; @@ -555,14 +648,22 @@ static void fixup_silent_linux ()
static void do_bootm_netbsd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - image_header_t *hdr, int verify) + bootm_headers_t *images, int verify) { void (*loader)(bd_t *, image_header_t *, char *, char *); - image_header_t *img_addr; + image_header_t *os_hdr, *hdr; ulong kernel_data, kernel_len; char *consdev; char *cmdline;
+#if defined(CONFIG_FIT) + if (!images->legacy_hdr_valid) { + fit_unsupported_reset ("NetBSD"); + do_reset (cmdtp, flag, argc, argv); + } +#endif + hdr = images->legacy_hdr_os; + /* * Booting a (NetBSD) kernel image * @@ -574,12 +675,11 @@ static void do_bootm_netbsd (cmd_tbl_t *cmdtp, int flag, * line, the name of the console device, and (optionally) the * address of the original image header. */ - - img_addr = 0; + os_hdr = NULL; if (image_check_type (hdr, IH_TYPE_MULTI)) { image_multi_getimg (hdr, 1, &kernel_data, &kernel_len); if (kernel_len) - img_addr = hdr; + os_hdr = hdr; }
consdev = ""; @@ -625,24 +725,41 @@ static void do_bootm_netbsd (cmd_tbl_t *cmdtp, int flag, * r5: console device * r6: boot args string */ - (*loader) (gd->bd, img_addr, consdev, cmdline); + (*loader) (gd->bd, os_hdr, consdev, cmdline); }
#ifdef CONFIG_LYNXKDI static void do_bootm_lynxkdi (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - image_header_t *hdr, int verify) + bootm_headers_t *images, int verify) { - lynxkdi_boot (hdr); + image_header_t *hdr = images->legacy_hdr_os; + +#if defined(CONFIG_FIT) + if (!images->legacy_hdr_valid) { + fit_unsupported_reset ("Lynx"); + do_reset (cmdtp, flag, argc, argv); + } +#endif + + lynxkdi_boot ((image_header_t *)hdr); } #endif /* CONFIG_LYNXKDI */
static void do_bootm_rtems (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - image_header_t *hdr, int verify) + bootm_headers_t *images, int verify) { + image_header_t *hdr = images->legacy_hdr_os; void (*entry_point)(bd_t *);
+#if defined(CONFIG_FIT) + if (!images->legacy_hdr_valid) { + fit_unsupported_reset ("RTEMS"); + do_reset (cmdtp, flag, argc, argv); + } +#endif + entry_point = (void (*)(bd_t *))image_get_ep (hdr);
printf ("## Transferring control to RTEMS (at address %08lx) ...\n", @@ -660,9 +777,17 @@ static void do_bootm_rtems (cmd_tbl_t *cmdtp, int flag, #if defined(CONFIG_CMD_ELF) static void do_bootm_vxworks (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - image_header_t *hdr, int verify) + bootm_headers_t *images, int verify) { char str[80]; + image_header_t *hdr = images->legacy_hdr_os; + +#if defined(CONFIG_FIT) + if (hdr == NULL) { + fit_unsupported_reset ("VxWorks"); + do_reset (cmdtp, flag, argc, argv); + } +#endif
sprintf(str, "%x", image_get_ep (hdr)); /* write entry-point into string */ setenv("loadaddr", str); @@ -671,10 +796,18 @@ static void do_bootm_vxworks (cmd_tbl_t *cmdtp, int flag,
static void do_bootm_qnxelf(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - image_header_t *hdr, int verify) + bootm_headers_t *images, int verify) { char *local_args[2]; char str[16]; + image_header_t *hdr = images->legacy_hdr_os; + +#if defined(CONFIG_FIT) + if (!images->legacy_hdr_valid) { + fit_unsupported_reset ("QNX"); + do_reset (cmdtp, flag, argc, argv); + } +#endif
sprintf(str, "%x", image_get_ep (hdr)); /* write entry-point into string */ local_args[0] = argv[0]; @@ -686,7 +819,7 @@ static void do_bootm_qnxelf(cmd_tbl_t *cmdtp, int flag, #if defined(CONFIG_ARTOS) && defined(CONFIG_PPC) static void do_bootm_artos (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - image_header_t *hdr, int verify) + bootm_headers_t *images, int verify) { ulong top; char *s, *cmdline; @@ -694,6 +827,14 @@ static void do_bootm_artos (cmd_tbl_t *cmdtp, int flag, int i, j, nxt, len, envno, envsz; bd_t *kbd; void (*entry)(bd_t *bd, char *cmdline, char **fwenv, ulong top); + image_header_t *hdr = images->legacy_hdr_os; + +#if defined(CONFIG_FIT) + if (!images->legacy_hdr_valid) { + fit_unsupported_reset ("ARTOS"); + do_reset (cmdtp, flag, argc, argv); + } +#endif
/* * Booting an ARTOS kernel image + application diff --git a/common/cmd_doc.c b/common/cmd_doc.c index 70bbd31..3358b04 100644 --- a/common/cmd_doc.c +++ b/common/cmd_doc.c @@ -261,17 +261,29 @@ int do_docboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } show_boot_progress (38);
- hdr = (image_header_t *)addr; + switch (gen_image_get_format ((void *)addr)) { + case IMAGE_FORMAT_LEGACY: + hdr = (image_header_t *)addr;
- if (image_check_magic (hdr)) { + if (image_check_magic (hdr)) {
- image_print_contents (hdr); + image_print_contents (hdr);
- cnt = image_get_image_size (hdr); - cnt -= SECTORSIZE; - } else { - puts ("\n** Bad Magic Number **\n"); - show_boot_progress (-39); + cnt = image_get_image_size (hdr); + cnt -= SECTORSIZE; + } else { + puts ("\n** Bad Magic Number **\n"); + show_boot_progress (-39); + return 1; + } + break; +#if defined(CONFIG_FIT) + case IMAGE_FORMAT_FIT: + fit_unsupported ("docboot"); + return 1; +#endif + default: + puts ("** Unknown image type\n"); return 1; } show_boot_progress (39); diff --git a/common/cmd_fdc.c b/common/cmd_fdc.c index 9ddc59b..b6e023a 100644 --- a/common/cmd_fdc.c +++ b/common/cmd_fdc.c @@ -835,14 +835,28 @@ int do_fdcboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) printf("result%d: 0x%02X\n",i,pCMD->result[i]); return 1; } - hdr = (image_header_t *)addr; - if (!image_check_magic (hdr)) { - printf ("Bad Magic Number\n"); + + switch (gen_image_get_format ((void *)addr)) { + case IMAGE_FORMAT_LEGACY: + hdr = (image_header_t *)addr; + if (!image_check_magic (hdr)) { + printf ("Bad Magic Number\n"); + return 1; + } + image_print_contents (hdr); + + imsize = image_get_image_size (hdr); + break; +#if defined(CONFIG_FIT) + case IMAGE_FORMAT_FIT: + fit_unsupported ("fdcboot"); + return 1; +#endif + default: + puts ("** Unknown image type\n"); return 1; } - image_print_contents (hdr);
- imsize= image_get_image_size (hdr); nrofblk=imsize/512; if((imsize%512)>0) nrofblk++; @@ -861,20 +875,18 @@ int do_fdcboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) /* Loading ok, update default load address */
load_addr = addr; - if(image_check_type (hdr, IH_TYPE_KERNEL)) { - /* Check if we should attempt an auto-start */ - if (((ep = getenv("autostart")) != NULL) && (strcmp(ep,"yes") == 0)) { - char *local_args[2]; - extern int do_bootm (cmd_tbl_t *, int, int, char *[]); + /* Check if we should attempt an auto-start */ + if (((ep = getenv("autostart")) != NULL) && (strcmp(ep,"yes") == 0)) { + char *local_args[2]; + extern int do_bootm (cmd_tbl_t *, int, int, char *[]);
- local_args[0] = argv[0]; - local_args[1] = NULL; + local_args[0] = argv[0]; + local_args[1] = NULL;
- printf ("Automatic boot of image at addr 0x%08lX ...\n", addr); + printf ("Automatic boot of image at addr 0x%08lX ...\n", addr);
- do_bootm (cmdtp, 0, 1, local_args); - rcode ++; - } + do_bootm (cmdtp, 0, 1, local_args); + rcode ++; } return rcode; } diff --git a/common/cmd_fpga.c b/common/cmd_fpga.c index 4030d04..10199f5 100644 --- a/common/cmd_fpga.c +++ b/common/cmd_fpga.c @@ -216,19 +216,31 @@ int do_fpga (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) break;
case FPGA_LOADMK: - { - image_header_t header; - image_header_t *hdr = &header; - ulong data; - - memmove (&header, (char *)fpga_data, image_get_header_size ()); - if (!image_check_magic (hdr)) { - puts ("Bad Magic Number\n"); - return 1; + switch (gen_image_get_format (fpga_data)) { + case IMAGE_FORMAT_LEGACY: + { + image_header_t *hdr = (image_header_t *)fpga_data; + ulong data; + + if (!image_check_magic (hdr)) { + puts ("Bad Magic Number\n"); + return 1; + } + data = (ulong)image_get_data (hdr); + data_size = image_get_data_size (hdr); + rc = fpga_load (dev, (void *)data, data_size); } - data = ((ulong)fpga_data + image_get_header_size ()); - data_size = image_get_data_size (hdr); - rc = fpga_load (dev, (void *)data, data_size); + break; +#if defined(CONFIG_FIT) + case IMAGE_FORMAT_FIT: + fit_unsupported ("fpga"); + rc = FPGA_FAIL; + break; +#endif + default: + puts ("** Unknown image type\n"); + rc = FPGA_FAIL; + break; } break;
diff --git a/common/cmd_ide.c b/common/cmd_ide.c index a396643..bef04db 100644 --- a/common/cmd_ide.c +++ b/common/cmd_ide.c @@ -446,25 +446,38 @@ int do_diskboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } show_boot_progress (48);
- hdr = (image_header_t *)addr; + switch (gen_image_get_format ((void *)addr)) { + case IMAGE_FORMAT_LEGACY: + hdr = (image_header_t *)addr;
- if (!image_check_magic (hdr)) { - printf("\n** Bad Magic Number **\n"); - show_boot_progress (-49); - return 1; - } - show_boot_progress (49); + if (!image_check_magic (hdr)) { + printf("\n** Bad Magic Number **\n"); + show_boot_progress (-49); + return 1; + } + show_boot_progress (49); + + if (!image_check_hcrc (hdr)) { + puts ("\n** Bad Header Checksum **\n"); + show_boot_progress (-50); + return 1; + } + show_boot_progress (50);
- if (!image_check_hcrc (hdr)) { - puts ("\n** Bad Header Checksum **\n"); - show_boot_progress (-50); + image_print_contents (hdr); + + cnt = image_get_image_size (hdr); + break; +#if defined(CONFIG_FIT) + case IMAGE_FORMAT_FIT: + fit_unsupported ("diskboot"); + return 1; +#endif + default: + puts ("** Unknown image type\n"); return 1; } - show_boot_progress (50); - - image_print_contents (hdr);
- cnt = image_get_image_size (hdr); cnt += info.blksz - 1; cnt /= info.blksz; cnt -= 1; diff --git a/common/cmd_nand.c b/common/cmd_nand.c index 7fd6667..b099afe 100644 --- a/common/cmd_nand.c +++ b/common/cmd_nand.c @@ -512,18 +512,32 @@ static int nand_load_image(cmd_tbl_t *cmdtp, nand_info_t *nand, } show_boot_progress (56);
- hdr = (image_header_t *) addr; + switch (gen_image_get_format ((void *)addr)) { + case IMAGE_FORMAT_LEGACY: + hdr = (image_header_t *)addr; + + if (!image_check_magic (hdr)) { + printf("\n** Bad Magic Number 0x%x **\n", + image_get_magic (hdr)); + show_boot_progress (-57); + return 1; + } + show_boot_progress (57); + + image_print_contents (hdr);
- if (!image_check_magic (hdr)) { - printf("\n** Bad Magic Number 0x%x **\n", image_get_magic (hdr)); - show_boot_progress (-57); + cnt = image_get_image_size (hdr); + break; +#if defined(CONFIG_FIT) + case IMAGE_FORMAT_FIT: + fit_unsupported ("nand_load_image"); + return 1; +#endif + default: + puts ("** Unknown image type\n"); return 1; } - show_boot_progress (57); - - image_print_contents (hdr);
- cnt = image_get_image_size (hdr); if (jffs2) { nand_read_options_t opts; memset(&opts, 0, sizeof(opts)); @@ -980,17 +994,30 @@ int do_nandboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } show_boot_progress (56);
- hdr = (image_header_t *)addr; + switch (gen_image_get_format ((void *)addr)) { + case IMAGE_FORMAT_LEGACY: + hdr = (image_header_t *)addr;
- if (image_check_magic (hdr)) { + if (image_check_magic (hdr)) {
- image_print_contents (hdr); + image_print_contents (hdr);
- cnt = image_get_image_size (hdr); - cnt -= SECTORSIZE; - } else { - printf ("\n** Bad Magic Number 0x%x **\n", image_get_magic (hdr)); - show_boot_progress (-57); + cnt = image_get_image_size (hdr); + cnt -= SECTORSIZE; + } else { + printf ("\n** Bad Magic Number 0x%x **\n", + image_get_magic (hdr)); + show_boot_progress (-57); + return 1; + } + break; +#if defined(CONFIG_FIT) + case IMAGE_FORMAT_FIT: + fit_unsupported ("nboot"); + return 1; +#endif + default: + puts ("** Unknown image type\n"); return 1; } show_boot_progress (57); diff --git a/common/cmd_scsi.c b/common/cmd_scsi.c index 5aae7ec..42b3072 100644 --- a/common/cmd_scsi.c +++ b/common/cmd_scsi.c @@ -273,20 +273,33 @@ int do_scsiboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) return 1; }
- hdr = (image_header_t *)addr; + switch (gen_image_get_format ((void *)addr)) { + case IMAGE_FORMAT_LEGACY: + hdr = (image_header_t *)addr;
- if (!image_check_magic (hdr)) { - printf("\n** Bad Magic Number **\n"); - return 1; - } + if (!image_check_magic (hdr)) { + printf("\n** Bad Magic Number **\n"); + return 1; + }
- if (!image_check_hcrc (hdr)) { - puts ("\n** Bad Header Checksum **\n"); + if (!image_check_hcrc (hdr)) { + puts ("\n** Bad Header Checksum **\n"); + return 1; + } + + image_print_contents (hdr); + cnt = image_get_image_size (hdr); + break; +#if defined(CONFIG_FIT) + case IMAGE_FORMAT_FIT: + fit_unsupported ("scsi"); + return 1; +#endif + default: + puts ("** Unknown image type\n"); return 1; }
- image_print_contents (hdr); - cnt = image_get_image_size (hdr); cnt += info.blksz - 1; cnt /= info.blksz; cnt -= 1; diff --git a/common/cmd_usb.c b/common/cmd_usb.c index 3f1aa7d..ad3873c 100644 --- a/common/cmd_usb.c +++ b/common/cmd_usb.c @@ -386,21 +386,34 @@ int do_usbboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) return 1; }
- hdr = (image_header_t *)addr; + switch (gen_image_get_format ((void *)addr)) { + case IMAGE_FORMAT_LEGACY: + hdr = (image_header_t *)addr;
- if (!image_check_magic (hdr)) { - printf("\n** Bad Magic Number **\n"); - return 1; - } + if (!image_check_magic (hdr)) { + printf("\n** Bad Magic Number **\n"); + return 1; + } + + if (!image_check_hcrc (hdr)) { + puts ("\n** Bad Header Checksum **\n"); + return 1; + }
- if (!image_check_hcrc (hdr)) { - puts ("\n** Bad Header Checksum **\n"); + image_print_contents (hdr); + + cnt = image_get_image_size (hdr); + break; +#if defined(CONFIG_FIT) + case IMAGE_FORMAT_FIT: + fit_unsupported ("usbboot"); + return 1; +#endif + default: + puts ("** Unknown image type\n"); return 1; }
- image_print_contents (hdr); - - cnt = image_get_image_size (hdr); cnt += info.blksz - 1; cnt /= info.blksz; cnt -= 1; diff --git a/common/cmd_ximg.c b/common/cmd_ximg.c index 7d83dc3..4dadc37 100644 --- a/common/cmd_ximg.c +++ b/common/cmd_ximg.c @@ -56,63 +56,76 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) dest = simple_strtoul(argv[3], NULL, 16); }
- printf("## Copying from image at %08lx ...\n", addr);
- hdr = (image_header_t *)addr; + switch (gen_image_get_format ((void *)addr)) { + case IMAGE_FORMAT_LEGACY:
- if (!image_check_magic (hdr)) { - printf("Bad Magic Number\n"); - return 1; - } - - if (!image_check_hcrc (hdr)) { - printf("Bad Header Checksum\n"); - return 1; - } -#ifdef DEBUG - image_print_contents (hdr); -#endif + printf("## Copying from legacy image at %08lx ...\n", addr); + hdr = (image_header_t *)addr; + if (!image_check_magic (hdr)) { + printf("Bad Magic Number\n"); + return 1; + }
- if (!image_check_type (hdr, IH_TYPE_MULTI)) { - printf("Wrong Image Type for %s command\n", cmdtp->name); - return 1; - } + if (!image_check_hcrc (hdr)) { + printf("Bad Header Checksum\n"); + return 1; + } + #ifdef DEBUG + image_print_contents (hdr); + #endif
- if (image_get_comp (hdr) != IH_COMP_NONE) { - printf("Wrong Compression Type for %s command\n", cmdtp->name); - return 1; - } + if (!image_check_type (hdr, IH_TYPE_MULTI)) { + printf("Wrong Image Type for %s command\n", + cmdtp->name); + return 1; + }
- if (verify) { - printf(" Verifying Checksum ... "); - if (!image_check_dcrc (hdr)) { - printf("Bad Data CRC\n"); + if (image_get_comp (hdr) != IH_COMP_NONE) { + printf("Wrong Compression Type for %s command\n", + cmdtp->name); return 1; } - printf("OK\n"); - }
- data = image_get_data (hdr); - len_ptr = (ulong *) data; - - data += 4; /* terminator */ - for (i = 0; len_ptr[i]; ++i) { - data += 4; - if (argc > 2 && part > i) { - u_long tail; - len = image_to_cpu (len_ptr[i]); - tail = len % 4; - data += len; - if (tail) { - data += 4 - tail; + if (verify) { + printf(" Verifying Checksum ... "); + if (!image_check_dcrc (hdr)) { + printf("Bad Data CRC\n"); + return 1; } + printf("OK\n"); } - } - if (argc > 2 && part >= i) { - printf("Bad Image Part\n"); + + data = image_get_data (hdr); + len_ptr = (ulong *) data; + + data += 4; /* terminator */ + for (i = 0; len_ptr[i]; ++i) { + data += 4; + if (argc > 2 && part > i) { + u_long tail; + len = image_to_cpu (len_ptr[i]); + tail = len % 4; + data += len; + if (tail) { + data += 4 - tail; + } + } + } + if (argc > 2 && part >= i) { + printf("Bad Image Part\n"); + return 1; + } + len = image_to_cpu (len_ptr[part]); +#if defined(CONFIG_FIT) + case IMAGE_FORMAT_FIT: + fit_unsupported ("imxtract"); + return 1; +#endif + default: + puts ("Invalid image type for imxtract\n"); return 1; } - len = image_to_cpu (len_ptr[part]);
if (argc > 3) { memcpy((char *) dest, (char *) data, len); diff --git a/common/image.c b/common/image.c index 690e0af..ea27b0b 100644 --- a/common/image.c +++ b/common/image.c @@ -490,9 +490,6 @@ image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag, image_header_t *rd_hdr;
show_boot_progress (9); - - /* copy from dataflash if needed */ - rd_addr = gen_get_image (rd_addr); rd_hdr = (image_header_t *)rd_addr;
if (!image_check_magic (rd_hdr)) { @@ -540,7 +537,7 @@ image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag, * @flag: command flag * @argc: command argument count * @argv: command argument list - * @hdr: pointer to the posiibly multi componet kernel image + * @images: pointer to the bootm images strcture * @verify: checksum verification flag * @arch: expected ramdisk architecture * @rd_start: pointer to a ulong variable, will hold ramdisk start address @@ -558,56 +555,111 @@ image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag, * board is reset if ramdisk image is found but corrupted */ void get_ramdisk (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - image_header_t *hdr, int verify, uint8_t arch, + bootm_headers_t *images, int verify, uint8_t arch, ulong *rd_start, ulong *rd_end) { - ulong rd_addr; + ulong rd_addr, rd_load; ulong rd_data, rd_len; image_header_t *rd_hdr; +#if defined(CONFIG_FIT) + void *fit_hdr; + const char *fit_uname_config = NULL; + const char *fit_uname_ramdisk = NULL; + ulong default_addr; +#endif
- if (argc >= 3) { + /* + * Look for a '-' which indicates to ignore the + * ramdisk argument + */ + if ((argc >= 3) && (strcmp(argv[2], "-") == 0)) { + debug ("## Skipping init Ramdisk\n"); + rd_len = rd_data = 0; + } else if (argc >= 3) { +#if defined(CONFIG_FIT) /* - * Look for a '-' which indicates to ignore the - * ramdisk argument + * If the init ramdisk comes from the FIT image and the FIT image + * address is omitted in the command line argument, try to use + * os FIT image address or default load address. */ - if (strcmp(argv[2], "-") == 0) { - debug ("## Skipping init Ramdisk\n"); - rd_len = rd_data = 0; - } else { - /* - * Check if there is an initrd image at the - * address provided in the second bootm argument - */ - rd_addr = simple_strtoul (argv[2], NULL, 16); - printf ("## Loading init Ramdisk Image at %08lx ...\n", + if (images->fit_uname_os) + default_addr = (ulong)images->fit_hdr_os; + else + default_addr = load_addr; + + if (fit_parse_conf (argv[2], default_addr, + &rd_addr, &fit_uname_config)) { + debug ("* ramdisk: config '%s' from image at 0x%08lx\n", + fit_uname_config, rd_addr); + } else if (fit_parse_subimage (argv[2], default_addr, + &rd_addr, &fit_uname_ramdisk)) { + debug ("* ramdisk: subimage '%s' from image at 0x%08lx\n", + fit_uname_ramdisk, rd_addr); + } else +#endif + { + rd_addr = simple_strtoul(argv[2], NULL, 16); + debug ("* ramdisk: cmdline image address = 0x%08lx\n", rd_addr); + } + + /* copy from dataflash if needed */ + printf ("## Loading init Ramdisk Image at %08lx ...\n", + rd_addr); + rd_addr = gen_get_image (rd_addr); + + /* + * Check if there is an initrd image at the + * address provided in the second bootm argument + * check image type, for FIT images get FIT node. + */ + switch (gen_image_get_format ((void *)rd_addr)) { + case IMAGE_FORMAT_LEGACY: + + debug ("* ramdisk: legacy format image\n");
rd_hdr = image_get_ramdisk (cmdtp, flag, argc, argv, rd_addr, arch, verify);
rd_data = image_get_data (rd_hdr); rd_len = image_get_data_size (rd_hdr); + rd_load = image_get_load (rd_hdr); + break; +#if defined(CONFIG_FIT) + case IMAGE_FORMAT_FIT: + fit_hdr = (void *)rd_addr; + debug ("* ramdisk: FIT format image\n"); + fit_unsupported_reset ("ramdisk"); + do_reset (cmdtp, flag, argc, argv); +#endif + default: + printf ("Wrong Image Format for %s command\n", + cmdtp->name); + rd_data = rd_len = 0; + }
#if defined(CONFIG_B2) || defined(CONFIG_EVB4510) || defined(CONFIG_ARMADILLO) - /* - *we need to copy the ramdisk to SRAM to let Linux boot - */ - memmove ((void *)image_get_load (rd_hdr), - (uchar *)rd_data, rd_len); - - rd_data = image_get_load (rd_hdr); -#endif /* CONFIG_B2 || CONFIG_EVB4510 || CONFIG_ARMADILLO */ + /* + * We need to copy the ramdisk to SRAM to let Linux boot + */ + if (rd_data) { + memmove ((void *)rd_load, (uchar *)rd_data, rd_len); + rd_data = rd_load; } +#endif /* CONFIG_B2 || CONFIG_EVB4510 || CONFIG_ARMADILLO */
- } else if (image_check_type (hdr, IH_TYPE_MULTI)) { + } else if (images->legacy_hdr_valid && + image_check_type (images->legacy_hdr_os, IH_TYPE_MULTI)) { /* - * Now check if we have a multifile image - * Get second entry data start address and len + * Now check if we have a legacy mult-component image, + * get second entry data start address and len. */ show_boot_progress (13); printf ("## Loading init Ramdisk from multi component " - "Image at %08lx ...\n", (ulong)hdr); - image_multi_getimg (hdr, 1, &rd_data, &rd_len); + "Image at %08lx ...\n", + (ulong)images->legacy_hdr_os); + + image_multi_getimg (images->legacy_hdr_os, 1, &rd_data, &rd_len); } else { /* * no initrd image @@ -904,6 +956,7 @@ inline int fit_parse_subimage (const char *spec, ulong addr_curr, { return fit_parse_spec (spec, ':', addr_curr, addr, image_name); } + #endif /* CONFIG_FIT */
#endif /* USE_HOSTCC */ diff --git a/include/image.h b/include/image.h index 502d35a..2f4b67d 100644 --- a/include/image.h +++ b/include/image.h @@ -44,6 +44,9 @@ #define CONFIG_FIT 1 #define CONFIG_OF_LIBFDT 1
+/* enable fit_format_error(), fit_format_warning() */ +#define CONFIG_FIT_VERBOSE 1 + #if defined(CONFIG_FIT) && !defined(CONFIG_OF_LIBFDT) #error "CONFIG_OF_LIBFDT not enabled, required by CONFIG_FIT!" #endif @@ -176,6 +179,33 @@ typedef struct image_header { } image_header_t;
/* + * Legacy and FIT format headers used by do_bootm() and do_bootm_<os>() + * routines. + */ +typedef struct bootm_headers { + /* + * Legacy os image header, if it is a multi component image + * then get_ramdisk() and get_fdt() will attempt to get + * data from second and third component accordingly. + */ + image_header_t *legacy_hdr_os; + ulong legacy_hdr_valid; + +#if defined(CONFIG_FIT) + void *fit_hdr_os; /* os FIT image header */ + char *fit_uname_os; /* os subimage node unit name */ + + void *fit_hdr_rd; /* init ramdisk FIT image header */ + char *fit_uname_rd; /* init ramdisk node unit name */ + +#if defined(CONFIG_PPC) + void *fit_hdr_fdt; /* FDT blob FIT image header */ + char *fit_uname_fdt; /* FDT blob node unit name */ +#endif +#endif +} bootm_headers_t; + +/* * Some systems (for example LWMON) have very short watchdog periods; * we must make sure to split long operations like memmove() or * crc32() into reasonable chunks. @@ -355,7 +385,7 @@ image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag, ulong rd_addr, uint8_t arch, int verify);
void get_ramdisk (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - image_header_t *hdr, int verify, uint8_t arch, + bootm_headers_t *images, int verify, uint8_t arch, ulong *rd_start, ulong *rd_end);
#if defined(CONFIG_PPC) || defined(CONFIG_M68K) @@ -368,14 +398,29 @@ ulong get_boot_cmdline (ulong alloc_current, ulong *cmd_start, ulong *cmd_end); ulong get_boot_kbd (ulong alloc_current, bd_t **kbd); #endif /* CONFIG_PPC || CONFIG_M68K */
+/*******************************************************************/ +/* New uImage format */ +/*******************************************************************/ #if defined(CONFIG_FIT) -/* - * New uImage format - */ inline int fit_parse_conf (const char *spec, ulong addr_curr, ulong *addr, const char **conf_name); inline int fit_parse_subimage (const char *spec, ulong addr_curr, ulong *addr, const char **image_name); + +#ifdef CONFIG_FIT_VERBOSE +#define fit_unsupported(msg) printf ("! %s:%d " \ + "FIT images not supported for '%s'\n", \ + __FILE__, __LINE__, (msg)) + +#define fit_unsupported_reset(msg) printf ("! %s:%d " \ + "FIT images not supported for '%s' " \ + "- must reset board to recover!\n", \ + __FILE__, __LINE__, (msg)) +#else +#define fit_unsupported(msg) +#define fit_unsupported_reset(msg) +#endif /* CONFIG_FIT_VERBOSE */ + #endif /* CONFIG_FIT */
#endif /* USE_HOSTCC */ diff --git a/lib_arm/bootm.c b/lib_arm/bootm.c index 31c2d67..4849c8a 100644 --- a/lib_arm/bootm.c +++ b/lib_arm/bootm.c @@ -56,24 +56,38 @@ static void setup_end_tag (bd_t *bd); static void setup_videolfb_tag (gd_t *gd); # endif
- static struct tag *params; #endif /* CONFIG_SETUP_MEMORY_TAGS || CONFIG_CMDLINE_TAG || CONFIG_INITRD_TAG */
+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) + bootm_headers_t *images, int verify) { - ulong initrd_start, initrd_end; - void (*theKernel)(int zero, int arch, uint params); - bd_t *bd = gd->bd; - int machid = bd->bi_arch_number; - char *s; + ulong initrd_start, initrd_end; + ulong ep = 0; + bd_t *bd = gd->bd; + char *s; + int machid = bd->bi_arch_number; + void (*theKernel)(int zero, int arch, uint params);
#ifdef CONFIG_CMDLINE_TAG char *commandline = getenv ("bootargs"); #endif
- theKernel = (void (*)(int, int, uint))image_get_ep (hdr); + /* find kernel entry point */ + if (images->legacy_hdr_valid) { + ep = image_get_ep (images->legacy_hdr_os); +#if defined(CONFIG_FIT) + } else if (images->fit_uname_os) { + fit_unsupported_reset ("ARM linux bootm"); + do_reset (cmdtp, flag, argc, argv); +#endif + } else { + puts ("Could not find kernel entry point!\n"); + do_reset (cmdtp, flag, argc, argv); + } + theKernel = (void (*)(int, int, uint))ep;
s = getenv ("machid"); if (s) { @@ -81,7 +95,7 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], printf ("Using machid 0x%x from environment\n", machid); }
- get_ramdisk (cmdtp, flag, argc, argv, hdr, verify, + get_ramdisk (cmdtp, flag, argc, argv, images, verify, IH_ARCH_ARM, &initrd_start, &initrd_end);
show_boot_progress (15); diff --git a/lib_avr32/bootm.c b/lib_avr32/bootm.c index a934cae..c449394 100644 --- a/lib_avr32/bootm.c +++ b/lib_avr32/bootm.c @@ -34,6 +34,8 @@ DECLARE_GLOBAL_DATA_PTR; /* CPU-specific hook to allow flushing of caches, etc. */ extern void prepare_to_boot(void);
+extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); + static struct tag *setup_start_tag(struct tag *params) { params->hdr.tag = ATAG_CORE; @@ -172,17 +174,29 @@ static void setup_end_tag(struct tag *params) }
void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - image_header_t *hdr, int verify) + bootm_headers_t *images, int verify) { - ulong initrd_start, initrd_end; - - void (*theKernel)(int magic, void *tagtable); - struct tag *params, *params_start; - char *commandline = getenv("bootargs"); - - theKernel = (void *)image_get_ep (hdr); + ulong initrd_start, initrd_end; + ulong ep = 0; + void (*theKernel)(int magic, void *tagtable); + struct tag *params, *params_start; + char *commandline = getenv("bootargs"); + + /* find kernel entry point */ + if (images->legacy_hdr_valid) { + ep = image_get_ep (images->legacy_hdr_os); +#if defined(CONFIG_FIT) + } else if (images->fit_uname_os) { + fit_unsupported_reset ("AVR32 linux bootm"); + do_reset (cmdtp, flag, argc, argv); +#endif + } else { + puts ("Could not find kernel entry point!\n"); + do_reset (cmdtp, flag, argc, argv); + } + theKernel = (void *)ep;
- get_ramdisk (cmdtp, flag, argc, argv, hdr, verify, + get_ramdisk (cmdtp, flag, argc, argv, images, verify, IH_ARCH_AVR32, &initrd_start, &initrd_end);
show_boot_progress (15); diff --git a/lib_blackfin/bootm.c b/lib_blackfin/bootm.c index 6299415..8010e5d 100644 --- a/lib_blackfin/bootm.c +++ b/lib_blackfin/bootm.c @@ -47,16 +47,30 @@ extern void flush_data_cache(void); static char *make_command_line(void);
void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[], - image_header_t *hdr, int verify) + bootm_headers_t *images, int verify) { - int (*appl) (char *cmdline); - char *cmdline; + int (*appl) (char *cmdline); + char *cmdline; + ulong ep = 0;
#ifdef SHARED_RESOURCES swap_to(FLASH); #endif
- appl = (int (*)(char *))image_get_ep (hdr); + /* find kernel entry point */ + if (images->legacy_hdr_valid) { + ep = image_get_ep (images->legacy_hdr_os); +#if defined(CONFIG_FIT) + } else if (images->fit_uname_os) { + fit_unsupported_reset ("AVR32 linux bootm"); + do_reset (cmdtp, flag, argc, argv); +#endif + } else { + puts ("Could not find kernel entry point!\n"); + do_reset (cmdtp, flag, argc, argv); + } + appl = (int (*)(char *))ep; + printf("Starting Kernel at = %x\n", appl); cmdline = make_command_line(); if (icache_status()) { diff --git a/lib_i386/bootm.c b/lib_i386/bootm.c index ab6c2a9..3a6497c 100644 --- a/lib_i386/bootm.c +++ b/lib_i386/bootm.c @@ -32,22 +32,35 @@ 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) + bootm_headers_t *images, int verify) { - void *base_ptr; + void *base_ptr; + ulong os_data, os_len; + ulong initrd_start, initrd_end; + ulong ep; + image_header_t *hdr;
- ulong os_data, os_len; - ulong initrd_start, initrd_end; - - get_ramdisk (cmdtp, flag, argc, argv, hdr, verify, + get_ramdisk (cmdtp, flag, argc, argv, images, verify, IH_ARCH_I386, &initrd_start, &initrd_end);
- /* 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) { + fit_unsupported_reset ("I386 linux bootm"); + do_reset (cmdtp, flag, argc, argv); +#endif } else { - os_data = image_get_data (hdr); - os_len = image_get_data_size (hdr); + puts ("Could not find kernel image!\n"); + do_reset (cmdtp, flag, argc, argv); }
base_ptr = load_zimage ((void*)os_data, os_len, diff --git a/lib_m68k/bootm.c b/lib_m68k/bootm.c index ac04da0..ce8be05 100644 --- a/lib_m68k/bootm.c +++ b/lib_m68k/bootm.c @@ -42,10 +42,11 @@ DECLARE_GLOBAL_DATA_PTR;
static ulong get_sp (void); static void set_clocks_in_mhz (bd_t *kbd); +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) + bootm_headers_t *images, int verify) { ulong sp, sp_limit, alloc_current;
@@ -53,8 +54,9 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, ulong initrd_start, initrd_end;
ulong cmd_start, cmd_end; - bd_t *kbd; - void (*kernel) (bd_t *, ulong, ulong, ulong, ulong); + bd_t *kbd; + ulong ep = 0; + void (*kernel) (bd_t *, ulong, ulong, ulong, ulong);
/* * Booting a (Linux) kernel image @@ -78,12 +80,22 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, alloc_current = get_boot_kbd (alloc_current, &kbd); set_clocks_in_mhz(kbd);
- /* find kernel */ - kernel = - (void (*)(bd_t *, ulong, ulong, ulong, ulong))image_get_ep (hdr); + /* find kernel entry point */ + if (images->legacy_hdr_valid) { + ep = image_get_ep (images->legacy_hdr_os); +#if defined(CONFIG_FIT) + } else if (images->fit_uname_os) { + fit_unsupported_reset ("M68K linux bootm"); + do_reset (cmdtp, flag, argc, argv); +#endif + } else { + puts ("Could not find kernel entry point!\n"); + do_reset (cmdtp, flag, argc, argv); + } + kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))ep;
/* find ramdisk */ - get_ramdisk (cmdtp, flag, argc, argv, hdr, verify, + get_ramdisk (cmdtp, flag, argc, argv, images, verify, IH_ARCH_M68K, &rd_data_start, &rd_data_end);
rd_len = rd_data_end - rd_data_start; diff --git a/lib_microblaze/bootm.c b/lib_microblaze/bootm.c index bccfbe1..1455211 100644 --- a/lib_microblaze/bootm.c +++ b/lib_microblaze/bootm.c @@ -32,14 +32,29 @@
DECLARE_GLOBAL_DATA_PTR;
+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) + bootm_headers_t *images, int verify) { /* First parameter is mapped to $r5 for kernel boot args */ - void (*theKernel) (char *); - char *commandline = getenv ("bootargs"); + void (*theKernel) (char *); + char *commandline = getenv ("bootargs"); + ulong ep = 0;
- theKernel = (void (*)(char *))image_get_ep (hdr); + /* find kernel entry point */ + if (images->legacy_hdr_valid) { + ep = image_get_ep (images->legacy_hdr_os); +#if defined(CONFIG_FIT) + } else if (images->fit_uname_os) { + fit_unsupported_reset ("MICROBLAZE linux bootm"); + do_reset (cmdtp, flag, argc, argv); +#endif + } else { + puts ("Could not find kernel entry point!\n"); + do_reset (cmdtp, flag, argc, argv); + } + theKernel = (void (*)(char *))ep;
show_boot_progress (15);
diff --git a/lib_mips/bootm.c b/lib_mips/bootm.c index fb91c76..5c2f28e 100644 --- a/lib_mips/bootm.c +++ b/lib_mips/bootm.c @@ -43,20 +43,32 @@ static int linux_env_idx; static void linux_params_init (ulong start, char * commandline); static void linux_env_set (char * env_name, char * env_val);
+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) + bootm_headers_t *images, int verify) { - ulong initrd_start, initrd_end; - - void (*theKernel) (int, char **, char **, int *); - char *commandline = getenv ("bootargs"); - char env_buf[12]; - - theKernel = - (void (*)(int, char **, char **, int *))image_get_ep (hdr); + ulong initrd_start, initrd_end; + ulong ep = 0; + void (*theKernel) (int, char **, char **, int *); + char *commandline = getenv ("bootargs"); + char env_buf[12]; + + /* find kernel entry point */ + if (images->legacy_hdr_valid) { + ep = image_get_ep (images->legacy_hdr_os); +#if defined(CONFIG_FIT) + } else if (images->fit_uname_os) { + fit_unsupported_reset ("MIPS linux bootm"); + do_reset (cmdtp, flag, argc, argv); +#endif + } else { + puts ("Could not find kernel entry point!\n"); + do_reset (cmdtp, flag, argc, argv); + } + theKernel = (void (*)(int, char **, char **, int *))ep;
- get_ramdisk (cmdtp, flag, argc, argv, hdr, verify, + get_ramdisk (cmdtp, flag, argc, argv, images, verify, IH_ARCH_MIPS, &initrd_start, &initrd_end);
show_boot_progress (15); diff --git a/lib_nios/bootm.c b/lib_nios/bootm.c index 55f7e3a..92a58f2 100644 --- a/lib_nios/bootm.c +++ b/lib_nios/bootm.c @@ -29,6 +29,6 @@ * */ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - image__header_t *hdr, int verify) + bootm_headers_t *images, int verify) { } diff --git a/lib_nios2/bootm.c b/lib_nios2/bootm.c index cb84324..56d1d19 100644 --- a/lib_nios2/bootm.c +++ b/lib_nios2/bootm.c @@ -25,10 +25,26 @@ #include <command.h> #include <asm/byteorder.h>
+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) + bootm_headers_t *images, int verify) { - void (*kernel)(void) = (void (*)(void))image_get_ep (hdr); + ulong ep = 0; + + /* find kernel entry point */ + if (images->legacy_hdr_valid) { + ep = image_get_ep (images->legacy_hdr_os); +#if defined(CONFIG_FIT) + } else if (images->fit_uname_os) { + fit_unsupported_reset ("NIOS2 linux bootm"); + do_reset (cmdtp, flag, argc, argv); +#endif + } else { + puts ("Could not find kernel entry point!\n"); + do_reset (cmdtp, flag, argc, argv); + } + void (*kernel)(void) = (void (*)(void))ep;
/* For now we assume the Microtronix linux ... which only * needs to be called ;-) diff --git a/lib_ppc/bootm.c b/lib_ppc/bootm.c index d2ee3dc..a1bbfc6 100644 --- a/lib_ppc/bootm.c +++ b/lib_ppc/bootm.c @@ -43,7 +43,7 @@ static void fdt_error (const char *msg); static ulong get_fdt (ulong alloc_current, cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - image_header_t *hdr, char **of_flat_tree); + bootm_headers_t *images, char **of_flat_tree); #endif
#ifdef CFG_INIT_RAM_LOCK @@ -59,7 +59,7 @@ static void set_clocks_in_mhz (bd_t *kbd); void __attribute__((noinline)) do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - image_header_t *hdr, + bootm_headers_t *images, int verify) { ulong sp, sp_limit, alloc_current; @@ -69,6 +69,7 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag,
ulong cmd_start, cmd_end; bd_t *kbd; + ulong ep = 0; void (*kernel)(bd_t *, ulong, ulong, ulong, ulong);
#if defined(CONFIG_OF_LIBFDT) @@ -97,11 +98,22 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, alloc_current = get_boot_kbd (alloc_current, &kbd); set_clocks_in_mhz(kbd);
- /* find kernel */ - kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))image_get_ep (hdr); + /* find kernel entry point */ + if (images->legacy_hdr_valid) { + ep = image_get_ep (images->legacy_hdr_os); +#if defined(CONFIG_FIT) + } else if (images->fit_uname_os) { + fit_unsupported_reset ("PPC linux bootm"); + do_reset (cmdtp, flag, argc, argv); +#endif + } else { + puts ("Could not find kernel entry point!\n"); + do_reset (cmdtp, flag, argc, argv); + } + kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))ep;
/* find ramdisk */ - get_ramdisk (cmdtp, flag, argc, argv, hdr, verify, + get_ramdisk (cmdtp, flag, argc, argv, images, verify, IH_ARCH_PPC, &rd_data_start, &rd_data_end);
rd_len = rd_data_end - rd_data_start; @@ -113,7 +125,7 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, #if defined(CONFIG_OF_LIBFDT) /* find flattened device tree */ alloc_current = get_fdt (alloc_current, - cmdtp, flag, argc, argv, hdr, &of_flat_tree); + cmdtp, flag, argc, argv, images, &of_flat_tree);
/* * Add the chosen node if it doesn't exist, add the env and bd_t @@ -225,33 +237,69 @@ static void fdt_error (const char *msg) static ulong get_fdt (ulong alloc_current, cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - image_header_t *hdr, char **of_flat_tree) + bootm_headers_t *images, char **of_flat_tree) { + ulong fdt_addr; image_header_t *fdt_hdr; + char *fdt_blob = NULL; ulong fdt_relocate = 0; - char *fdt = NULL; ulong new_alloc_current; + ulong image_start, image_end; + ulong load_start, load_end; +#if defined(CONFIG_FIT) + void *fit_hdr; + const char *fit_uname_config = NULL; + const char *fit_uname_fdt = NULL; + ulong default_addr; +#endif
- if(argc > 3) { - fdt = (char *)simple_strtoul (argv[3], NULL, 16); + if (argc > 3) { +#if defined(CONFIG_FIT) + /* + * If the FDT blob comes from the FIT image and the FIT image + * address is omitted in the command line argument, try to use + * ramdisk or os FIT image address or default load address. + */ + if (images->fit_uname_rd) + default_addr = (ulong)images->fit_hdr_rd; + else if (images->fit_uname_os) + default_addr = (ulong)images->fit_hdr_os; + else + default_addr = load_addr; + + if (fit_parse_conf (argv[3], default_addr, + &fdt_addr, &fit_uname_config)) { + debug ("* fdt: config '%s' from image at 0x%08lx\n", + fit_uname_config, fdt_addr); + } else if (fit_parse_subimage (argv[3], default_addr, + &fdt_addr, &fit_uname_fdt)) { + debug ("* fdt: subimage '%s' from image at 0x%08lx\n", + fit_uname_fdt, fdt_addr); + } else +#endif + { + fdt_addr = simple_strtoul(argv[3], NULL, 16); + debug ("* fdt: cmdline image address = 0x%08lx\n", + fdt_addr); + }
- debug ("## Checking for 'FDT'/'FDT image' at %08lx\n", fdt); + debug ("## Checking for 'FDT'/'FDT image' at %08lx\n", + fdt_addr);
/* copy from dataflash if needed */ - fdt = (char *)gen_get_image ((ulong)fdt); - fdt_hdr = (image_header_t *)fdt; + fdt_addr = gen_get_image (fdt_addr);
- if (fdt_check_header (fdt) == 0) { - printf ("## Flattened Device Tree blob at %08lx\n", fdt); -#ifndef CFG_NO_FLASH - if (addr2info ((ulong)fdt) != NULL) - fdt_relocate = 1; -#endif - } else if (image_check_magic (fdt_hdr)) { - ulong image_start, image_end; - ulong load_start, load_end; + /* + * Check if there is an FDT image at the + * address provided in the second bootm argument + * check image type, for FIT images get a FIT node. + */ + switch (gen_image_get_format ((void *)fdt_addr)) { + case IMAGE_FORMAT_LEGACY: + debug ("* fdt: legacy format image\n");
- printf ("## Flattened Device Tree Image at %08lx\n", + fdt_hdr = (image_header_t *)fdt_addr; + printf ("## Flattened Device Tree Legacy Image at %08lx\n", fdt_hdr);
image_print_contents (fdt_hdr); @@ -296,51 +344,87 @@ static ulong get_fdt (ulong alloc_current, (void *)image_get_data (fdt_hdr), image_get_data_size (fdt_hdr));
- fdt = (char *)image_get_load (fdt_hdr); - } else { - fdt_error ("Did not find a Flattened Device Tree"); + fdt_blob = (char *)image_get_load (fdt_hdr); + break; +#if defined(CONFIG_FIT) + case IMAGE_FORMAT_FIT: + + /* check FDT blob vs FIT hdr */ + if (fit_uname_config || fit_uname_fdt) { + /* + * FIT image + */ + fit_hdr = (void *)fdt_addr; + debug ("* fdt: FIT format image\n"); + fit_unsupported_reset ("PPC fdt"); + do_reset (cmdtp, flag, argc, argv); + } else { + /* + * FDT blob + */ + printf ("## Flattened Device Tree blob at %08lx\n", fdt_blob); + fdt_blob = (char *)fdt_addr; + } + break; +#endif + default: + fdt_error ("Did not find a cmdline Flattened Device Tree"); do_reset (cmdtp, flag, argc, argv); } - printf (" Booting using the fdt at 0x%x\n", - fdt); - } else if (image_check_type (hdr, IH_TYPE_MULTI)) { + + printf (" Booting using the fdt blob at 0x%x\n", fdt_blob); + + } else if (images->legacy_hdr_valid && + image_check_type (images->legacy_hdr_os, IH_TYPE_MULTI)) { + ulong fdt_data, fdt_len;
+ /* + * Now check if we have a legacy multi-component image, + * get second entry data start address and len. + */ printf ("## Flattened Device Tree from multi " - "component Image at %08lX\n", (ulong)hdr); + "component Image at %08lX\n", + (ulong)images->legacy_hdr_os);
- image_multi_getimg (hdr, 2, &fdt_data, &fdt_len); + image_multi_getimg (images->legacy_hdr_os, 2, &fdt_data, &fdt_len); if (fdt_len) {
- fdt = (char *)fdt_data; - printf (" Booting using the fdt at 0x%x\n", fdt); + fdt_blob = (char *)fdt_data; + printf (" Booting using the fdt at 0x%x\n", fdt_blob);
-#ifndef CFG_NO_FLASH - /* move the blob if it is in flash (set of_relocte) */ - if (addr2info ((ulong)fdt) != NULL) - fdt_relocate = 1; -#endif - - if (fdt_check_header (fdt) != 0) { + if (fdt_check_header (fdt_blob) != 0) { fdt_error ("image is not a fdt"); do_reset (cmdtp, flag, argc, argv); }
- if (be32_to_cpu (fdt_totalsize (fdt)) != fdt_len) { + if (be32_to_cpu (fdt_totalsize (fdt_blob)) != fdt_len) { fdt_error ("fdt size != image size"); do_reset (cmdtp, flag, argc, argv); } } else { - debug (" Did not find a Flattened Device Tree"); + fdt_error ("Did not find a Flattened Device Tree " + "in a legacy multi-component image"); + do_reset (cmdtp, flag, argc, argv); } + } else { + debug ("## No Flattened Device Tree\n"); + *of_flat_tree = NULL; + return alloc_current; }
+#ifndef CFG_NO_FLASH + /* move the blob if it is in flash (set fdt_relocate) */ + if (addr2info ((ulong)fdt_blob) != NULL) + fdt_relocate = 1; +#endif + #ifdef CFG_BOOTMAPSZ /* * The blob must be within CFG_BOOTMAPSZ, * so we flag it to be copied if it is not. */ - if (fdt >= (char *)CFG_BOOTMAPSZ) + if (fdt_blob >= (char *)CFG_BOOTMAPSZ) fdt_relocate = 1; #endif
@@ -349,20 +433,20 @@ static ulong get_fdt (ulong alloc_current, int err; ulong of_start, of_len;
- of_len = be32_to_cpu (fdt_totalsize (fdt)); + of_len = be32_to_cpu (fdt_totalsize (fdt_blob));
/* position on a 4K boundary before the alloc_current */ of_start = alloc_current - of_len; of_start &= ~(4096 - 1); /* align on page */
debug ("## device tree at 0x%08lX ... 0x%08lX (len=%ld=0x%lX)\n", - (ulong)fdt, (ulong)fdt + of_len - 1, + (ulong)fdt_blob, (ulong)fdt_blob + of_len - 1, of_len, of_len);
printf (" Loading Device Tree to %08lx, end %08lx ... ", of_start, of_start + of_len - 1);
- err = fdt_open_into (fdt, (void *)of_start, of_len); + err = fdt_open_into (fdt_blob, (void *)of_start, of_len); if (err != 0) { fdt_error ("fdt move failed"); do_reset (cmdtp, flag, argc, argv); @@ -372,7 +456,7 @@ static ulong get_fdt (ulong alloc_current, *of_flat_tree = (char *)of_start; new_alloc_current = of_start; } else { - *of_flat_tree = fdt; + *of_flat_tree = fdt_blob; new_alloc_current = alloc_current; }
diff --git a/lib_sh/bootm.c b/lib_sh/bootm.c index 4e5fe77..55e64f5 100644 --- a/lib_sh/bootm.c +++ b/lib_sh/bootm.c @@ -43,6 +43,8 @@
#define RAMDISK_IMAGE_START_MASK 0x07FF
+extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); + #ifdef CFG_DEBUG static void hexdump (unsigned char *buf, int len) { @@ -58,10 +60,24 @@ static void hexdump (unsigned char *buf, int len) #endif
void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - image_header_t *hdr, int verify) + bootm_headers_t *images, int verify) { - char *bootargs = getenv("bootargs"); - void (*kernel) (void) = (void (*)(void))image_get_ep (hdr); + ulong ep = 0; + char *bootargs = getenv("bootargs"); + + /* find kernel entry point */ + if (images->legacy_hdr_valid) { + ep = image_get_ep (images->legacy_hdr_os); +#if defined(CONFIG_FIT) + } else if (images->fit_uname_os) { + fit_unsupported_reset ("SH linux bootm"); + do_reset (cmdtp, flag, argc, argv); +#endif + } else { + puts ("Could not find kernel entry point!\n"); + do_reset (cmdtp, flag, argc, argv); + } + void (*kernel) (void) = (void (*)(void))ep;
/* Setup parameters */ memset(PARAM, 0, 0x1000); /* Clear zero page */

PPC specific FDT blob handling code is divided into two separate routines:
get_fdt() - find and verify a FDT blob (either raw or image embedded) fdt_relocate() - move FDT blob to within BOOTMAP if needed
Signed-off-by: Marian Balakowicz m8@semihalf.com ---
lib_ppc/bootm.c | 61 +++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 43 insertions(+), 18 deletions(-)
diff --git a/lib_ppc/bootm.c b/lib_ppc/bootm.c index a1bbfc6..d5e019e 100644 --- a/lib_ppc/bootm.c +++ b/lib_ppc/bootm.c @@ -41,9 +41,11 @@ #include <fdt_support.h>
static void fdt_error (const char *msg); -static ulong get_fdt (ulong alloc_current, cmd_tbl_t *cmdtp, int flag, - int argc, char *argv[], - bootm_headers_t *images, char **of_flat_tree); +static void get_fdt (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], + bootm_headers_t *images, char **of_flat_tree, ulong *of_size); +static ulong fdt_relocate (ulong alloc_current, + cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], + char **of_flat_tree, ulong *of_size); #endif
#ifdef CFG_INIT_RAM_LOCK @@ -73,7 +75,8 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, void (*kernel)(bd_t *, ulong, ulong, ulong, ulong);
#if defined(CONFIG_OF_LIBFDT) - char *of_flat_tree; + char *of_flat_tree = NULL; + ulong of_size = 0; #endif
/* @@ -124,14 +127,16 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag,
#if defined(CONFIG_OF_LIBFDT) /* find flattened device tree */ - alloc_current = get_fdt (alloc_current, - cmdtp, flag, argc, argv, images, &of_flat_tree); + get_fdt (cmdtp, flag, argc, argv, images, &of_flat_tree, &of_size); + + alloc_current = fdt_relocate (alloc_current, + cmdtp, flag, argc, argv, &of_flat_tree, &of_size);
/* * Add the chosen node if it doesn't exist, add the env and bd_t * if the user wants it (the logic is in the subroutines). */ - if (of_flat_tree) { + if (of_size) { if (fdt_chosen(of_flat_tree, initrd_start, initrd_end, 0) < 0) { fdt_error ("/chosen node create failed"); do_reset (cmdtp, flag, argc, argv); @@ -234,16 +239,12 @@ static void fdt_error (const char *msg) puts (" - must RESET the board to recover.\n"); }
-static ulong get_fdt (ulong alloc_current, - cmd_tbl_t *cmdtp, int flag, - int argc, char *argv[], - bootm_headers_t *images, char **of_flat_tree) +static void get_fdt (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], + bootm_headers_t *images, char **of_flat_tree, ulong *of_size) { ulong fdt_addr; image_header_t *fdt_hdr; char *fdt_blob = NULL; - ulong fdt_relocate = 0; - ulong new_alloc_current; ulong image_start, image_end; ulong load_start, load_end; #if defined(CONFIG_FIT) @@ -410,13 +411,37 @@ static ulong get_fdt (ulong alloc_current, } else { debug ("## No Flattened Device Tree\n"); *of_flat_tree = NULL; + *of_size = 0; + return; + } + + *of_flat_tree = fdt_blob; + *of_size = be32_to_cpu (fdt_totalsize (fdt_blob)); + debug (" of_flat_tree at 0x%08lx size 0x%08lx\n", + *of_flat_tree, *of_size); +} + +static ulong fdt_relocate (ulong alloc_current, + cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], + char **of_flat_tree, ulong *of_size) +{ + char *fdt_blob = *of_flat_tree; + ulong relocate = 0; + ulong new_alloc_current; + + /* nothing to do */ + if (*of_size == 0) return alloc_current; + + if (fdt_check_header (fdt_blob) != 0) { + fdt_error ("image is not a fdt"); + do_reset (cmdtp, flag, argc, argv); }
#ifndef CFG_NO_FLASH - /* move the blob if it is in flash (set fdt_relocate) */ + /* move the blob if it is in flash (set relocate) */ if (addr2info ((ulong)fdt_blob) != NULL) - fdt_relocate = 1; + relocate = 1; #endif
#ifdef CFG_BOOTMAPSZ @@ -425,15 +450,15 @@ static ulong get_fdt (ulong alloc_current, * so we flag it to be copied if it is not. */ if (fdt_blob >= (char *)CFG_BOOTMAPSZ) - fdt_relocate = 1; + relocate = 1; #endif
/* move flattend device tree if needed */ - if (fdt_relocate) { + if (relocate) { int err; ulong of_start, of_len;
- of_len = be32_to_cpu (fdt_totalsize (fdt_blob)); + of_len = *of_size;
/* position on a 4K boundary before the alloc_current */ of_start = alloc_current - of_len;

On Feb 25, 2008, at 11:34 AM, Marian Balakowicz wrote:
PPC specific FDT blob handling code is divided into two separate routines:
get_fdt() - find and verify a FDT blob (either raw or image embedded) fdt_relocate() - move FDT blob to within BOOTMAP if needed
Signed-off-by: Marian Balakowicz m8@semihalf.com
lib_ppc/bootm.c | 61 ++++++++++++++++++++++++++++++++++++++ +---------------- 1 files changed, 43 insertions(+), 18 deletions(-)
Acked-by: Kumar Gala galak@kernel.crashing.org
- k

When CONFIG_HAS_DATAFLASH is not defined gen_get_image() routine has nothing to do, update its control flow to better reflect that simple case.
Signed-off-by: Marian Balakowicz m8@semihalf.com ---
common/image.c | 64 +++++++++++++++++++++++++++++--------------------------- 1 files changed, 33 insertions(+), 31 deletions(-)
diff --git a/common/image.c b/common/image.c index ea27b0b..dd55264 100644 --- a/common/image.c +++ b/common/image.c @@ -408,55 +408,57 @@ int gen_image_get_format (void *img_addr) */ ulong gen_get_image (ulong img_addr) { - ulong ram_addr, h_size, d_size; - - h_size = image_get_header_size (); -#if defined(CONFIG_FIT) - if (sizeof(struct fdt_header) > h_size) - h_size = sizeof(struct fdt_header); -#endif + ulong ram_addr = img_addr;
#ifdef CONFIG_HAS_DATAFLASH + ulong h_size, d_size; + if (addr_dataflash (img_addr)){ + /* ger RAM address */ ram_addr = CFG_LOAD_ADDR; + + /* get header size */ + h_size = image_get_header_size (); +#if defined(CONFIG_FIT) + if (sizeof(struct fdt_header) > h_size) + h_size = sizeof(struct fdt_header); +#endif + + /* read in header */ debug (" Reading image header from dataflash address " "%08lx to RAM address %08lx\n", img_addr, ram_addr); - read_dataflash (img_addr, h_size, (char *)ram_addr); - } else -#endif - return img_addr;
- ram_addr = img_addr; + read_dataflash (img_addr, h_size, (char *)ram_addr);
- switch (gen_image_get_format ((void *)ram_addr)) { - case IMAGE_FORMAT_LEGACY: - d_size = image_get_data_size ((image_header_t *)ram_addr); - debug (" Legacy format image found at 0x%08lx, size 0x%08lx\n", - ram_addr, d_size); - break; + /* get data size */ + switch (gen_image_get_format ((void *)ram_addr)) { + case IMAGE_FORMAT_LEGACY: + d_size = image_get_data_size ((image_header_t *)ram_addr); + debug (" Legacy format image found at 0x%08lx, size 0x%08lx\n", + ram_addr, d_size); + break; #if defined(CONFIG_FIT) - case IMAGE_FORMAT_FIT: - d_size = fdt_totalsize((void *)ram_addr) - h_size; - debug (" FIT/FDT format image found at 0x%08lx, size 0x%08lx\n", - ram_addr, d_size); - - break; + case IMAGE_FORMAT_FIT: + d_size = fdt_totalsize((void *)ram_addr) - h_size; + debug (" FIT/FDT format image found at 0x%08lx, size 0x%08lx\n", + ram_addr, d_size); + break; #endif - default: - printf (" No valid image found at 0x%08lx\n", img_addr); - return ram_addr; - } + default: + printf (" No valid image found at 0x%08lx\n", img_addr); + return ram_addr; + }
-#ifdef CONFIG_HAS_DATAFLASH - if (addr_dataflash (img_addr)) { + /* read in image data */ debug (" Reading image remaining data from dataflash address " "%08lx to RAM address %08lx\n", img_addr + h_size, ram_addr + h_size);
read_dataflash (img_addr + h_size, d_size, (char *)(ram_addr + h_size)); + } -#endif +#endif /* CONFIG_HAS_DATAFLASH */
return ram_addr; }

On Feb 25, 2008, at 11:35 AM, Marian Balakowicz wrote:
When CONFIG_HAS_DATAFLASH is not defined gen_get_image() routine has nothing to do, update its control flow to better reflect that simple case.
Signed-off-by: Marian Balakowicz m8@semihalf.com
common/image.c | 64 ++++++++++++++++++++++++++++ +--------------------------- 1 files changed, 33 insertions(+), 31 deletions(-)
Acked-by: Kumar Gala galak@kernel.crashing.org
- k

Signed-off-by: Marian Balakowicz m8@semihalf.com ---
lib_avr32/Makefile | 2 +- lib_blackfin/Makefile | 4 ++-- lib_i386/Makefile | 4 ++-- lib_m68k/Makefile | 2 +- lib_microblaze/Makefile | 2 +- lib_mips/Makefile | 2 +- lib_nios/Makefile | 2 +- lib_nios2/Makefile | 2 +- lib_ppc/Makefile | 5 ++--- 9 files changed, 12 insertions(+), 13 deletions(-)
diff --git a/lib_avr32/Makefile b/lib_avr32/Makefile index ebe237b..afbce45 100644 --- a/lib_avr32/Makefile +++ b/lib_avr32/Makefile @@ -29,7 +29,7 @@ LIB = $(obj)lib$(ARCH).a
SOBJS = memset.o
-COBJS = board.o interrupts.o bootm.o +COBJS = board.o bootm.o interrupts.o
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/lib_blackfin/Makefile b/lib_blackfin/Makefile index ac3fb28..4a262fc 100644 --- a/lib_blackfin/Makefile +++ b/lib_blackfin/Makefile @@ -29,9 +29,9 @@ include $(TOPDIR)/config.mk
LIB = $(obj)lib$(ARCH).a
-SOBJS = memcpy.o memcmp.o memset.o memmove.o +SOBJS = memcmp.o memcpy.o memmove.o memset.o
-COBJS = post.o tests.o board.o bootm.o bf533_string.o cache.o muldi3.o +COBJS = bf533_string.o board.o bootm.o cache.o muldi3.o post.o tests.o
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/lib_i386/Makefile b/lib_i386/Makefile index ef0ba54..004278f 100644 --- a/lib_i386/Makefile +++ b/lib_i386/Makefile @@ -27,8 +27,8 @@ LIB = $(obj)lib$(ARCH).a
SOBJS = bios.o bios_pci.o realmode_switch.o
-COBJS = board.o bios_setup.o bootm.o zimage.o realmode.o \ - pci_type1.o pci.o video_bios.o video.o +COBJS = bios_setup.o board.o bootm.o pci.o pci_type1.o \ + realmode.o video_bios.o video.o zimage.o
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/lib_m68k/Makefile b/lib_m68k/Makefile index d515223..efde75d 100644 --- a/lib_m68k/Makefile +++ b/lib_m68k/Makefile @@ -27,7 +27,7 @@ LIB = $(obj)lib$(ARCH).a
SOBJS =
-COBJS = cache.o traps.o time.o interrupts.o board.o bootm.o +COBJS = board.o bootm.o cache.o interrupts.o time.o traps.o
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/lib_microblaze/Makefile b/lib_microblaze/Makefile index 9b317a2..9c3b519 100644 --- a/lib_microblaze/Makefile +++ b/lib_microblaze/Makefile @@ -27,7 +27,7 @@ LIB = $(obj)lib$(ARCH).a
SOBJS =
-COBJS = board.o bootm.o time.o cache.o +COBJS = board.o bootm.o cache.o time.o
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/lib_mips/Makefile b/lib_mips/Makefile index 93cca7a..bfcf463 100644 --- a/lib_mips/Makefile +++ b/lib_mips/Makefile @@ -27,7 +27,7 @@ LIB = $(obj)lib$(ARCH).a
SOBJS =
-COBJS = board.o time.o bootm.o +COBJS = board.o bootm.o time.o
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/lib_nios/Makefile b/lib_nios/Makefile index d8ae7bd..b81a3d4 100644 --- a/lib_nios/Makefile +++ b/lib_nios/Makefile @@ -27,7 +27,7 @@ LIB = $(obj)lib$(ARCH).a
SOBJS =
-COBJS = board.o cache.o divmod.o bootm.o mult.o time.o +COBJS = board.o bootm.o cache.o divmod.o mult.o time.o
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/lib_nios2/Makefile b/lib_nios2/Makefile index 5f996d3..c69cdd7 100644 --- a/lib_nios2/Makefile +++ b/lib_nios2/Makefile @@ -27,7 +27,7 @@ LIB = $(obj)lib$(ARCH).a
SOBJS = cache.o
-COBJS = board.o divmod.o bootm.o mult.o time.o +COBJS = board.o bootm.o divmod.o mult.o time.o
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/lib_ppc/Makefile b/lib_ppc/Makefile index 61507b0..21f644e 100644 --- a/lib_ppc/Makefile +++ b/lib_ppc/Makefile @@ -27,9 +27,8 @@ LIB = $(obj)lib$(ARCH).a
SOBJS = ppccache.o ppcstring.o ticks.o
-COBJS = board.o \ - bat_rw.o cache.o extable.o kgdb.o time.o interrupts.o \ - bootm.o +COBJS = bat_rw.o board.o bootm.o cache.o extable.o \ + interrupts.o kgdb.o time.o
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))

On 18:35 Mon 25 Feb , Marian Balakowicz wrote:
Signed-off-by: Marian Balakowicz m8@semihalf.com
lib_avr32/Makefile | 2 +- lib_blackfin/Makefile | 4 ++-- lib_i386/Makefile | 4 ++-- lib_m68k/Makefile | 2 +- lib_microblaze/Makefile | 2 +- lib_mips/Makefile | 2 +- lib_nios/Makefile | 2 +- lib_nios2/Makefile | 2 +- lib_ppc/Makefile | 5 ++--- 9 files changed, 12 insertions(+), 13 deletions(-)
diff --git a/lib_avr32/Makefile b/lib_avr32/Makefile index ebe237b..afbce45 100644 --- a/lib_avr32/Makefile +++ b/lib_avr32/Makefile @@ -29,7 +29,7 @@ LIB = $(obj)lib$(ARCH).a
SOBJS = memset.o
-COBJS = board.o interrupts.o bootm.o +COBJS = board.o bootm.o interrupts.o
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/lib_blackfin/Makefile b/lib_blackfin/Makefile index ac3fb28..4a262fc 100644 --- a/lib_blackfin/Makefile +++ b/lib_blackfin/Makefile @@ -29,9 +29,9 @@ include $(TOPDIR)/config.mk
LIB = $(obj)lib$(ARCH).a
-SOBJS = memcpy.o memcmp.o memset.o memmove.o +SOBJS = memcmp.o memcpy.o memmove.o memset.o
-COBJS = post.o tests.o board.o bootm.o bf533_string.o cache.o muldi3.o +COBJS = bf533_string.o board.o bootm.o cache.o muldi3.o post.o tests.o
It will be nice if you could split it in 1 line for 1 file as it
-SOBJS = memcpy.o memcmp.o memset.o memmove.o +SOBJS += memcmp.o +SOBJS += mmemcpy.o +SOBJS += memmove.o +SOBJS += memset.o .....
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/lib_i386/Makefile b/lib_i386/Makefile
Best regards, J.

Jean-Christophe PLAGNIOL-VILLARD wrote:
On 18:35 Mon 25 Feb , Marian Balakowicz wrote:
Signed-off-by: Marian Balakowicz m8@semihalf.com
lib_avr32/Makefile | 2 +- lib_blackfin/Makefile | 4 ++-- lib_i386/Makefile | 4 ++-- lib_m68k/Makefile | 2 +- lib_microblaze/Makefile | 2 +- lib_mips/Makefile | 2 +- lib_nios/Makefile | 2 +- lib_nios2/Makefile | 2 +- lib_ppc/Makefile | 5 ++--- 9 files changed, 12 insertions(+), 13 deletions(-)
diff --git a/lib_avr32/Makefile b/lib_avr32/Makefile index ebe237b..afbce45 100644 --- a/lib_avr32/Makefile +++ b/lib_avr32/Makefile @@ -29,7 +29,7 @@ LIB = $(obj)lib$(ARCH).a
SOBJS = memset.o
-COBJS = board.o interrupts.o bootm.o +COBJS = board.o bootm.o interrupts.o
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/lib_blackfin/Makefile b/lib_blackfin/Makefile index ac3fb28..4a262fc 100644 --- a/lib_blackfin/Makefile +++ b/lib_blackfin/Makefile @@ -29,9 +29,9 @@ include $(TOPDIR)/config.mk
LIB = $(obj)lib$(ARCH).a
-SOBJS = memcpy.o memcmp.o memset.o memmove.o +SOBJS = memcmp.o memcpy.o memmove.o memset.o
-COBJS = post.o tests.o board.o bootm.o bf533_string.o cache.o muldi3.o +COBJS = bf533_string.o board.o bootm.o cache.o muldi3.o post.o tests.o
It will be nice if you could split it in 1 line for 1 file as it ...
Right, should have done this way, will update the patch.
Thanks, m.

Jean-Christophe PLAGNIOL-VILLARD wrote:
It will be nice if you could split it in 1 line for 1 file as it
-SOBJS = memcpy.o memcmp.o memset.o memmove.o +SOBJS += memcmp.o +SOBJS += mmemcpy.o +SOBJS += memmove.o +SOBJS += memset.o .....
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/lib_i386/Makefile b/lib_i386/Makefile
Best regards, J.
Yes, please. But also, while you are there, we need to go one step further and convert to SOBJS-y and COBJS-y as well.
If you don't do it, I will eventually be converting them all to look like this:
COBJS-y += file.o COBJS-y += other.o
OBJS := $(addprefix $(obj),$(SOBJS-y) $(COBJS-y))
Might as well head in that direction as we go along...
Thanks, jdl

Jon Loeliger wrote:
Jean-Christophe PLAGNIOL-VILLARD wrote:
It will be nice if you could split it in 1 line for 1 file as it
-SOBJS = memcpy.o memcmp.o memset.o memmove.o +SOBJS += memcmp.o +SOBJS += mmemcpy.o +SOBJS += memmove.o +SOBJS += memset.o .....
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/lib_i386/Makefile b/lib_i386/Makefile
Best regards, J.
Yes, please. But also, while you are there, we need to go one step further and convert to SOBJS-y and COBJS-y as well.
If you don't do it, I will eventually be converting them all to look like this:
COBJS-y += file.o COBJS-y += other.o
OBJS := $(addprefix $(obj),$(SOBJS-y) $(COBJS-y))
Might as well head in that direction as we go along...
Done, updated version of the commit will cover this.
Cheers, m.

Do not pass image verification flag directly to related routines. Simplify argument passing and move it to the bootm_header structure which contains curently processed image specific data and is already being passed on the argument list.
Signed-off-by: Marian Balakowicz m8@semihalf.com ---
common/cmd_bootm.c | 47 +++++++++++++++++++++-------------------------- common/image.c | 13 ++++++++----- include/image.h | 7 ++----- lib_arm/bootm.c | 4 ++-- lib_avr32/bootm.c | 4 ++-- lib_blackfin/bootm.c | 2 +- lib_i386/bootm.c | 4 ++-- lib_m68k/bootm.c | 4 ++-- lib_microblaze/bootm.c | 2 +- lib_mips/bootm.c | 4 ++-- lib_nios/bootm.c | 2 +- lib_nios2/bootm.c | 2 +- lib_ppc/bootm.c | 8 +++----- lib_sh/bootm.c | 2 +- 14 files changed, 49 insertions(+), 56 deletions(-)
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index 3f09988..ce2de2e 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -65,10 +65,8 @@ static int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); static void fixup_silent_linux (void); #endif
-static void *get_kernel (cmd_tbl_t *cmdtp, int flag, - int argc, char *argv[], int verify, - bootm_headers_t *images, - ulong *os_data, ulong *os_len); +static void *get_kernel (cmd_tbl_t *cmdtp, int flag,int argc, char *argv[], + bootm_headers_t *images, ulong *os_data, ulong *os_len); extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
/* @@ -81,8 +79,7 @@ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); */ typedef void boot_os_fn (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - bootm_headers_t *images,/* pointers to os/initrd/fdt */ - int verify); /* getenv("verify")[0] != 'n' */ + bootm_headers_t *images); /* pointers to os/initrd/fdt */
extern boot_os_fn do_bootm_linux; static boot_os_fn do_bootm_netbsd; @@ -114,7 +111,6 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) ulong iflag; const char *type_name; uint unc_len = CFG_BOOTM_LEN; - int verify = getenv_verify(); uint8_t comp, type, os;
void *os_hdr; @@ -123,9 +119,10 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) ulong load_start, load_end;
memset ((void *)&images, 0, sizeof (images)); + images.verify = getenv_verify();
/* get kernel image header, start address and length */ - os_hdr = get_kernel (cmdtp, flag, argc, argv, verify, + os_hdr = get_kernel (cmdtp, flag, argc, argv, &images, &os_data, &os_len); if (os_len == 0) return 1; @@ -246,36 +243,36 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) #ifdef CONFIG_SILENT_CONSOLE fixup_silent_linux(); #endif - do_bootm_linux (cmdtp, flag, argc, argv, &images, verify); + do_bootm_linux (cmdtp, flag, argc, argv, &images); break;
case IH_OS_NETBSD: - do_bootm_netbsd (cmdtp, flag, argc, argv, &images, verify); + do_bootm_netbsd (cmdtp, flag, argc, argv, &images); break;
#ifdef CONFIG_LYNXKDI case IH_OS_LYNXOS: - do_bootm_lynxkdi (cmdtp, flag, argc, argv, &images, verify); + do_bootm_lynxkdi (cmdtp, flag, argc, argv, &images); break; #endif
case IH_OS_RTEMS: - do_bootm_rtems (cmdtp, flag, argc, argv, &images, verify); + do_bootm_rtems (cmdtp, flag, argc, argv, &images); break;
#if defined(CONFIG_CMD_ELF) case IH_OS_VXWORKS: - do_bootm_vxworks (cmdtp, flag, argc, argv, &images, verify); + do_bootm_vxworks (cmdtp, flag, argc, argv, &images); break;
case IH_OS_QNX: - do_bootm_qnxelf (cmdtp, flag, argc, argv, &images, verify); + do_bootm_qnxelf (cmdtp, flag, argc, argv, &images); break; #endif
#ifdef CONFIG_ARTOS case IH_OS_ARTOS: - do_bootm_artos (cmdtp, flag, argc, argv, &images, verify); + do_bootm_artos (cmdtp, flag, argc, argv, &images); break; #endif } @@ -300,10 +297,8 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) * pointer to image header if valid image was found, plus kernel start * address and length, otherwise NULL */ -static void *get_kernel (cmd_tbl_t *cmdtp, int flag, - int argc, char *argv[], int verify, - bootm_headers_t *images, - ulong *os_data, ulong *os_len) +static void *get_kernel (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], + bootm_headers_t *images, ulong *os_data, ulong *os_len) { image_header_t *hdr; ulong img_addr; @@ -362,7 +357,7 @@ static void *get_kernel (cmd_tbl_t *cmdtp, int flag, show_boot_progress (3); image_print_contents (hdr);
- if (verify) { + if (images->verify) { puts (" Verifying Checksum ... "); if (!image_check_dcrc (hdr)) { printf ("Bad Data CRC\n"); @@ -648,7 +643,7 @@ static void fixup_silent_linux ()
static void do_bootm_netbsd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - bootm_headers_t *images, int verify) + bootm_headers_t *images) { void (*loader)(bd_t *, image_header_t *, char *, char *); image_header_t *os_hdr, *hdr; @@ -731,7 +726,7 @@ static void do_bootm_netbsd (cmd_tbl_t *cmdtp, int flag, #ifdef CONFIG_LYNXKDI static void do_bootm_lynxkdi (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - bootm_headers_t *images, int verify) + bootm_headers_t *images) { image_header_t *hdr = images->legacy_hdr_os;
@@ -748,7 +743,7 @@ static void do_bootm_lynxkdi (cmd_tbl_t *cmdtp, int flag,
static void do_bootm_rtems (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - bootm_headers_t *images, int verify) + bootm_headers_t *images) { image_header_t *hdr = images->legacy_hdr_os; void (*entry_point)(bd_t *); @@ -777,7 +772,7 @@ static void do_bootm_rtems (cmd_tbl_t *cmdtp, int flag, #if defined(CONFIG_CMD_ELF) static void do_bootm_vxworks (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - bootm_headers_t *images, int verify) + bootm_headers_t *images) { char str[80]; image_header_t *hdr = images->legacy_hdr_os; @@ -796,7 +791,7 @@ static void do_bootm_vxworks (cmd_tbl_t *cmdtp, int flag,
static void do_bootm_qnxelf(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - bootm_headers_t *images, int verify) + bootm_headers_t *images) { char *local_args[2]; char str[16]; @@ -819,7 +814,7 @@ static void do_bootm_qnxelf(cmd_tbl_t *cmdtp, int flag, #if defined(CONFIG_ARTOS) && defined(CONFIG_PPC) static void do_bootm_artos (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - bootm_headers_t *images, int verify) + bootm_headers_t *images) { ulong top; char *s, *cmdline; diff --git a/common/image.c b/common/image.c index dd55264..5ca77b9 100644 --- a/common/image.c +++ b/common/image.c @@ -58,6 +58,10 @@ extern int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); #endif
DECLARE_GLOBAL_DATA_PTR; + +static image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag, + int argc, char *argv[], + ulong rd_addr, uint8_t arch, int verify); #else #include "mkimage.h" #endif /* USE_HOSTCC*/ @@ -485,7 +489,7 @@ ulong gen_get_image (ulong img_addr) * pointer to a ramdisk image header, if image was found and valid * otherwise, board is reset */ -image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag, +static image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], ulong rd_addr, uint8_t arch, int verify) { @@ -539,8 +543,7 @@ image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag, * @flag: command flag * @argc: command argument count * @argv: command argument list - * @images: pointer to the bootm images strcture - * @verify: checksum verification flag + * @images: pointer to the bootm images structure * @arch: expected ramdisk architecture * @rd_start: pointer to a ulong variable, will hold ramdisk start address * @rd_end: pointer to a ulong variable, will hold ramdisk end @@ -557,7 +560,7 @@ image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag, * board is reset if ramdisk image is found but corrupted */ void get_ramdisk (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - bootm_headers_t *images, int verify, uint8_t arch, + bootm_headers_t *images, uint8_t arch, ulong *rd_start, ulong *rd_end) { ulong rd_addr, rd_load; @@ -621,7 +624,7 @@ void get_ramdisk (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], debug ("* ramdisk: legacy format image\n");
rd_hdr = image_get_ramdisk (cmdtp, flag, argc, argv, - rd_addr, arch, verify); + rd_addr, arch, images->verify);
rd_data = image_get_data (rd_hdr); rd_len = image_get_data_size (rd_hdr); diff --git a/include/image.h b/include/image.h index 2f4b67d..1bc090a 100644 --- a/include/image.h +++ b/include/image.h @@ -202,6 +202,7 @@ typedef struct bootm_headers { void *fit_hdr_fdt; /* FDT blob FIT image header */ char *fit_uname_fdt; /* FDT blob node unit name */ #endif + int verify; /* getenv("verify")[0] != 'n' */ #endif } bootm_headers_t;
@@ -380,12 +381,8 @@ void image_print_contents (image_header_t *hdr); int gen_image_get_format (void *img_addr); ulong gen_get_image (ulong img_addr);
-image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag, - int argc, char *argv[], - ulong rd_addr, uint8_t arch, int verify); - void get_ramdisk (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - bootm_headers_t *images, int verify, uint8_t arch, + bootm_headers_t *images, uint8_t arch, ulong *rd_start, ulong *rd_end);
#if defined(CONFIG_PPC) || defined(CONFIG_M68K) diff --git a/lib_arm/bootm.c b/lib_arm/bootm.c index 4849c8a..e1a9ee2 100644 --- a/lib_arm/bootm.c +++ b/lib_arm/bootm.c @@ -62,7 +62,7 @@ static struct tag *params; 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[], - bootm_headers_t *images, int verify) + bootm_headers_t *images) { ulong initrd_start, initrd_end; ulong ep = 0; @@ -95,7 +95,7 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], printf ("Using machid 0x%x from environment\n", machid); }
- get_ramdisk (cmdtp, flag, argc, argv, images, verify, + get_ramdisk (cmdtp, flag, argc, argv, images, IH_ARCH_ARM, &initrd_start, &initrd_end);
show_boot_progress (15); diff --git a/lib_avr32/bootm.c b/lib_avr32/bootm.c index c449394..69a69df 100644 --- a/lib_avr32/bootm.c +++ b/lib_avr32/bootm.c @@ -174,7 +174,7 @@ static void setup_end_tag(struct tag *params) }
void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - bootm_headers_t *images, int verify) + bootm_headers_t *images) { ulong initrd_start, initrd_end; ulong ep = 0; @@ -196,7 +196,7 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], } theKernel = (void *)ep;
- get_ramdisk (cmdtp, flag, argc, argv, images, verify, + get_ramdisk (cmdtp, flag, argc, argv, images, IH_ARCH_AVR32, &initrd_start, &initrd_end);
show_boot_progress (15); diff --git a/lib_blackfin/bootm.c b/lib_blackfin/bootm.c index 8010e5d..26ac88b 100644 --- a/lib_blackfin/bootm.c +++ b/lib_blackfin/bootm.c @@ -47,7 +47,7 @@ extern void flush_data_cache(void); static char *make_command_line(void);
void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[], - bootm_headers_t *images, int verify) + bootm_headers_t *images) { int (*appl) (char *cmdline); char *cmdline; diff --git a/lib_i386/bootm.c b/lib_i386/bootm.c index 3a6497c..aea58d1 100644 --- a/lib_i386/bootm.c +++ b/lib_i386/bootm.c @@ -32,7 +32,7 @@ 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[], - bootm_headers_t *images, int verify) + bootm_headers_t *images) { void *base_ptr; ulong os_data, os_len; @@ -40,7 +40,7 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], ulong ep; image_header_t *hdr;
- get_ramdisk (cmdtp, flag, argc, argv, images, verify, + get_ramdisk (cmdtp, flag, argc, argv, images, IH_ARCH_I386, &initrd_start, &initrd_end);
if (images->legacy_hdr_valid) { diff --git a/lib_m68k/bootm.c b/lib_m68k/bootm.c index ce8be05..c611497 100644 --- a/lib_m68k/bootm.c +++ b/lib_m68k/bootm.c @@ -46,7 +46,7 @@ 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[], - bootm_headers_t *images, int verify) + bootm_headers_t *images) { ulong sp, sp_limit, alloc_current;
@@ -95,7 +95,7 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))ep;
/* find ramdisk */ - get_ramdisk (cmdtp, flag, argc, argv, images, verify, + get_ramdisk (cmdtp, flag, argc, argv, images, IH_ARCH_M68K, &rd_data_start, &rd_data_end);
rd_len = rd_data_end - rd_data_start; diff --git a/lib_microblaze/bootm.c b/lib_microblaze/bootm.c index 1455211..5881df6 100644 --- a/lib_microblaze/bootm.c +++ b/lib_microblaze/bootm.c @@ -35,7 +35,7 @@ DECLARE_GLOBAL_DATA_PTR; 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[], - bootm_headers_t *images, int verify) + bootm_headers_t *images) { /* First parameter is mapped to $r5 for kernel boot args */ void (*theKernel) (char *); diff --git a/lib_mips/bootm.c b/lib_mips/bootm.c index 5c2f28e..998aa22 100644 --- a/lib_mips/bootm.c +++ b/lib_mips/bootm.c @@ -46,7 +46,7 @@ static void linux_env_set (char * env_name, char * env_val); 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[], - bootm_headers_t *images, int verify) + bootm_headers_t *images) { ulong initrd_start, initrd_end; ulong ep = 0; @@ -68,7 +68,7 @@ void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[], } theKernel = (void (*)(int, char **, char **, int *))ep;
- get_ramdisk (cmdtp, flag, argc, argv, images, verify, + get_ramdisk (cmdtp, flag, argc, argv, images, IH_ARCH_MIPS, &initrd_start, &initrd_end);
show_boot_progress (15); diff --git a/lib_nios/bootm.c b/lib_nios/bootm.c index 92a58f2..fb2e9b5 100644 --- a/lib_nios/bootm.c +++ b/lib_nios/bootm.c @@ -29,6 +29,6 @@ * */ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - bootm_headers_t *images, int verify) + bootm_headers_t *images) { } diff --git a/lib_nios2/bootm.c b/lib_nios2/bootm.c index 56d1d19..70d2bb0 100644 --- a/lib_nios2/bootm.c +++ b/lib_nios2/bootm.c @@ -28,7 +28,7 @@ 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[], - bootm_headers_t *images, int verify) + bootm_headers_t *images) { ulong ep = 0;
diff --git a/lib_ppc/bootm.c b/lib_ppc/bootm.c index d5e019e..319d4ba 100644 --- a/lib_ppc/bootm.c +++ b/lib_ppc/bootm.c @@ -59,10 +59,8 @@ static ulong get_sp (void); static void set_clocks_in_mhz (bd_t *kbd);
void __attribute__((noinline)) -do_bootm_linux(cmd_tbl_t *cmdtp, int flag, - int argc, char *argv[], - bootm_headers_t *images, - int verify) +do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], + bootm_headers_t *images) { ulong sp, sp_limit, alloc_current;
@@ -116,7 +114,7 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))ep;
/* find ramdisk */ - get_ramdisk (cmdtp, flag, argc, argv, images, verify, + get_ramdisk (cmdtp, flag, argc, argv, images, IH_ARCH_PPC, &rd_data_start, &rd_data_end);
rd_len = rd_data_end - rd_data_start; diff --git a/lib_sh/bootm.c b/lib_sh/bootm.c index 55e64f5..de5c9ea 100644 --- a/lib_sh/bootm.c +++ b/lib_sh/bootm.c @@ -60,7 +60,7 @@ static void hexdump (unsigned char *buf, int len) #endif
void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - bootm_headers_t *images, int verify) + bootm_headers_t *images) { ulong ep = 0; char *bootargs = getenv("bootargs");

On Feb 25, 2008, at 11:35 AM, Marian Balakowicz wrote:
Do not pass image verification flag directly to related routines. Simplify argument passing and move it to the bootm_header structure which contains curently processed image specific data and is already being passed on the argument list.
Signed-off-by: Marian Balakowicz m8@semihalf.com
common/cmd_bootm.c | 47 ++++++++++++++++++++ +-------------------------- common/image.c | 13 ++++++++----- include/image.h | 7 ++----- lib_arm/bootm.c | 4 ++-- lib_avr32/bootm.c | 4 ++-- lib_blackfin/bootm.c | 2 +- lib_i386/bootm.c | 4 ++-- lib_m68k/bootm.c | 4 ++-- lib_microblaze/bootm.c | 2 +- lib_mips/bootm.c | 4 ++-- lib_nios/bootm.c | 2 +- lib_nios2/bootm.c | 2 +- lib_ppc/bootm.c | 8 +++----- lib_sh/bootm.c | 2 +- 14 files changed, 49 insertions(+), 56 deletions(-)
Acked-by: Kumar Gala galak@kernel.crashing.org
- k

Legacy image specific verification is factored out to a separate helper routine to keep get_kernel() generic and simple.
Signed-off-by: Marian Balakowicz m8@semihalf.com ---
common/cmd_bootm.c | 86 ++++++++++++++++++++++++++++++++-------------------- 1 files changed, 53 insertions(+), 33 deletions(-)
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index ce2de2e..e5ed167 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -297,6 +297,57 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) * pointer to image header if valid image was found, plus kernel start * address and length, otherwise NULL */ +static image_header_t *image_get_kernel (ulong img_addr, int verify) +{ + image_header_t *hdr = (image_header_t *)img_addr; + + if (!image_check_magic(hdr)) { + puts ("Bad Magic Number\n"); + show_boot_progress (-1); + return NULL; + } + show_boot_progress (2); + + if (!image_check_hcrc (hdr)) { + puts ("Bad Header Checksum\n"); + show_boot_progress (-2); + return NULL; + } + + show_boot_progress (3); + image_print_contents (hdr); + + if (verify) { + puts (" Verifying Checksum ... "); + if (!image_check_dcrc (hdr)) { + printf ("Bad Data CRC\n"); + show_boot_progress (-3); + return NULL; + } + puts ("OK\n"); + } + show_boot_progress (4); + + if (!image_check_target_arch (hdr)) { + printf ("Unsupported Architecture 0x%x\n", image_get_arch (hdr)); + show_boot_progress (-4); + return NULL; + } + return hdr; +} + +/** + * get_kernel - find kernel image + * @os_data: pointer to a ulong variable, will hold os data start address + * @os_len: pointer to a ulong variable, will hold os data length + * + * get_kernel() tries to find a kernel image, verifies its integrity + * and locates kernel data. + * + * returns: + * pointer to image header if valid image was found, plus kernel start + * address and length, otherwise NULL + */ static void *get_kernel (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], bootm_headers_t *images, ulong *os_data, ulong *os_len) { @@ -339,40 +390,9 @@ static void *get_kernel (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], case IMAGE_FORMAT_LEGACY:
debug ("* kernel: legacy format image\n"); - hdr = (image_header_t *)img_addr; - - if (!image_check_magic(hdr)) { - puts ("Bad Magic Number\n"); - show_boot_progress (-1); + hdr = image_get_kernel (img_addr, images->verify); + if (!hdr) return NULL; - } - show_boot_progress (2); - - if (!image_check_hcrc (hdr)) { - puts ("Bad Header Checksum\n"); - show_boot_progress (-2); - return NULL; - } - - show_boot_progress (3); - image_print_contents (hdr); - - if (images->verify) { - puts (" Verifying Checksum ... "); - if (!image_check_dcrc (hdr)) { - printf ("Bad Data CRC\n"); - show_boot_progress (-3); - return NULL; - } - puts ("OK\n"); - } - show_boot_progress (4); - - if (!image_check_target_arch (hdr)) { - printf ("Unsupported Architecture 0x%x\n", image_get_arch (hdr)); - show_boot_progress (-4); - return NULL; - } show_boot_progress (5);
switch (image_get_type (hdr)) {

On Feb 25, 2008, at 11:35 AM, Marian Balakowicz wrote:
Legacy image specific verification is factored out to a separate helper routine to keep get_kernel() generic and simple.
Signed-off-by: Marian Balakowicz m8@semihalf.com
common/cmd_bootm.c | 86 +++++++++++++++++++++++++++++++ +-------------------- 1 files changed, 53 insertions(+), 33 deletions(-)
Acked-by: Kumar Gala galak@kernel.crashing.org
- k

FDT blob may be passed either: (1) raw (2) or embedded in the legacy uImage (3) or embedded in the new uImage. For the (2) case embedding image must be verified before we get FDT from it. This patch factors out legacy image specific verification routine to the separate helper routine.
Signed-off-by: Marian Balakowicz m8@semihalf.com ---
lib_ppc/bootm.c | 76 ++++++++++++++++++++++++++++++++----------------------- 1 files changed, 44 insertions(+), 32 deletions(-)
diff --git a/lib_ppc/bootm.c b/lib_ppc/bootm.c index 319d4ba..ad05bc5 100644 --- a/lib_ppc/bootm.c +++ b/lib_ppc/bootm.c @@ -237,6 +237,39 @@ static void fdt_error (const char *msg) puts (" - must RESET the board to recover.\n"); }
+static image_header_t *image_get_fdt (ulong fdt_addr) +{ + image_header_t *fdt_hdr = (image_header_t *)fdt_addr; + + image_print_contents (fdt_hdr); + + puts (" Verifying Checksum ... "); + if (!image_check_hcrc (fdt_hdr)) { + fdt_error ("fdt header checksum invalid"); + return NULL; + } + + if (!image_check_dcrc (fdt_hdr)) { + fdt_error ("fdt checksum invalid"); + return NULL; + } + puts ("OK\n"); + + if (!image_check_type (fdt_hdr, IH_TYPE_FLATDT)) { + fdt_error ("uImage is not a fdt"); + return NULL; + } + if (image_get_comp (fdt_hdr) != IH_COMP_NONE) { + fdt_error ("uImage is compressed"); + return NULL; + } + if (fdt_check_header ((char *)image_get_data (fdt_hdr)) != 0) { + fdt_error ("uImage data is not a fdt"); + return NULL; + } + return fdt_hdr; +} + static void get_fdt (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], bootm_headers_t *images, char **of_flat_tree, ulong *of_size) { @@ -297,12 +330,17 @@ static void get_fdt (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], case IMAGE_FORMAT_LEGACY: debug ("* fdt: legacy format image\n");
- fdt_hdr = (image_header_t *)fdt_addr; + /* verify fdt_addr points to a valid image header */ printf ("## Flattened Device Tree Legacy Image at %08lx\n", - fdt_hdr); - - image_print_contents (fdt_hdr); + fdt_addr); + fdt_hdr = image_get_fdt (fdt_addr); + if (!fdt_hdr) + do_reset (cmdtp, flag, argc, argv);
+ /* + * move image data to the load address, + * make sure we don't overwrite initial image + */ image_start = (ulong)fdt_hdr; image_end = image_get_image_end (fdt_hdr);
@@ -313,35 +351,9 @@ static void get_fdt (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], fdt_error ("fdt overwritten"); do_reset (cmdtp, flag, argc, argv); } - - puts (" Verifying Checksum ... "); - if (!image_check_hcrc (fdt_hdr)) { - fdt_error ("fdt header checksum invalid"); - do_reset (cmdtp, flag, argc, argv); - } - - if (!image_check_dcrc (fdt_hdr)) { - fdt_error ("fdt checksum invalid"); - do_reset (cmdtp, flag, argc, argv); - } - puts ("OK\n"); - - if (!image_check_type (fdt_hdr, IH_TYPE_FLATDT)) { - fdt_error ("uImage is not a fdt"); - do_reset (cmdtp, flag, argc, argv); - } - if (image_get_comp (fdt_hdr) != IH_COMP_NONE) { - fdt_error ("uImage is compressed"); - do_reset (cmdtp, flag, argc, argv); - } - if (fdt_check_header ((char *)image_get_data (fdt_hdr)) != 0) { - fdt_error ("uImage data is not a fdt"); - do_reset (cmdtp, flag, argc, argv); - } - memmove ((void *)image_get_load (fdt_hdr), - (void *)image_get_data (fdt_hdr), - image_get_data_size (fdt_hdr)); + (void *)image_get_data (fdt_hdr), + image_get_data_size (fdt_hdr));
fdt_blob = (char *)image_get_load (fdt_hdr); break;

On Feb 25, 2008, at 11:35 AM, Marian Balakowicz wrote:
FDT blob may be passed either: (1) raw (2) or embedded in the legacy uImage (3) or embedded in the new uImage. For the (2) case embedding image must be verified before we get FDT from it. This patch factors out legacy image specific verification routine to the separate helper routine.
Signed-off-by: Marian Balakowicz m8@semihalf.com
lib_ppc/bootm.c | 76 +++++++++++++++++++++++++++++++ +----------------------- 1 files changed, 44 insertions(+), 32 deletions(-)
Acked-by: Kumar Gala galak@kernel.crashing.org
- k

Dual format image code must properly handle all three FDT passing methods: - raw FDT blob passed - FDT blob embedded in the legacy uImage - FDT blob embedded in the new uImage
This patch enables proper raw FDT handling when no FIT imaeg support is compiled in. This is a bit tricky as we must dected FIT format even when FIT uImage handling is not enabled as both FIT uImages and raw FDT blobs use tha same low level format (libfdt).
Signed-off-by: Marian Balakowicz m8@semihalf.com ---
common/image.c | 8 ++++++-- include/image.h | 5 +++-- lib_ppc/bootm.c | 18 ++++++++++++------ 3 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/common/image.c b/common/image.c index 5ca77b9..c689b0e 100644 --- a/common/image.c +++ b/common/image.c @@ -375,6 +375,10 @@ void image_print_contents (image_header_t *hdr) * gen_image_get_format() checks whether provided address points to a valid * legacy or FIT image. * + * New uImage format and FDT blob are based on a libfdt. FDT blob + * may be passed directly or embedded in a FIT image. In both situations + * gen_image_get_format() must be able to dectect libfdt header. + * * returns: * image format type or IMAGE_FORMAT_INVALID if no image is present */ @@ -382,14 +386,14 @@ int gen_image_get_format (void *img_addr) { ulong format = IMAGE_FORMAT_INVALID; image_header_t *hdr; -#if defined(CONFIG_FIT) +#if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT) char *fit_hdr; #endif
hdr = (image_header_t *)img_addr; if (image_check_magic(hdr)) format = IMAGE_FORMAT_LEGACY; -#if defined(CONFIG_FIT) +#if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT) else { fit_hdr = (char *)img_addr; if (fdt_check_header (fit_hdr) == 0) diff --git a/include/image.h b/include/image.h index 1bc090a..08566ea 100644 --- a/include/image.h +++ b/include/image.h @@ -376,8 +376,9 @@ const char* image_get_comp_name (uint8_t comp); void image_print_contents (image_header_t *hdr);
#define IMAGE_FORMAT_INVALID 0x00 -#define IMAGE_FORMAT_LEGACY 0x01 -#define IMAGE_FORMAT_FIT 0x02 +#define IMAGE_FORMAT_LEGACY 0x01 /* legacy image_header based format */ +#define IMAGE_FORMAT_FIT 0x02 /* new, libfdt based format */ + int gen_image_get_format (void *img_addr); ulong gen_get_image (ulong img_addr);
diff --git a/lib_ppc/bootm.c b/lib_ppc/bootm.c index ad05bc5..d80d69a 100644 --- a/lib_ppc/bootm.c +++ b/lib_ppc/bootm.c @@ -357,11 +357,15 @@ static void get_fdt (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
fdt_blob = (char *)image_get_load (fdt_hdr); break; -#if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: - - /* check FDT blob vs FIT hdr */ - if (fit_uname_config || fit_uname_fdt) { + /* + * This case will catch both: new uImage format + * (libfdt based) and raw FDT blob (also libfdt + * based). + */ +#if defined(CONFIG_FIT) + /* check FDT blob vs FIT blob */ + if (0) { /* FIXME: call FIT format verification */ /* * FIT image */ @@ -369,15 +373,17 @@ static void get_fdt (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], debug ("* fdt: FIT format image\n"); fit_unsupported_reset ("PPC fdt"); do_reset (cmdtp, flag, argc, argv); - } else { + } else +#endif + { /* * FDT blob */ + debug ("* fdt: raw FDT blob\n"); printf ("## Flattened Device Tree blob at %08lx\n", fdt_blob); fdt_blob = (char *)fdt_addr; } break; -#endif default: fdt_error ("Did not find a cmdline Flattened Device Tree"); do_reset (cmdtp, flag, argc, argv);

On Feb 25, 2008, at 11:34 AM, Marian Balakowicz wrote:
This patch series adds initial framework for dual format uImage support to U-boot. Booting control flow is reworked and is now able to recognize both formats: legacy format based on a binary image_header stucture and new FIT uImage format based on a libfdt. Legacy specific code is adapted a bit and enterd only for legacy format images. Proper new uImage format handling is not implement in this patch series, appropriate cases are stubed and will be updated with the new uImage format low level code in the comming patchsets.
To sum up: Legacy format image handling shall continue to work, FIT format image handling will produce debug messages and return with error.
Three other patches refactor legacy format specific code to a helper routines image_get_kernel(), image_get_fdt() and move PPC FDT blob relocattion code to a dedicated routine fdt_relocate().
Included are also fixes: reworked gen_get_image() and correced raw FDT blob handling when CONFIG_FIT is disabled.
Please review and comment.
Marian Balakowicz (8): [new uImage] Correct raw FDT blob handlig when CONFIG_FIT is disabled [new uImage] POWERPC: Add image_get_fdt() routine [new uImage] Add image_get_kernel() routine [new uImage] Move image verify flag to bootm_headers structure [Makefile] Sort COBJS in lib_<arch> Makefiles [new uImage] Optimize gen_get_image() flow control [new uImage] POWERPC: Split get_fdt() into get and relocate routines [new uImage] Add dual format uImage support framework
Is it just me or did patch [1/8 - add dual format..] not make it to the list?
-k

Kumar Gala wrote:
On Feb 25, 2008, at 11:34 AM, Marian Balakowicz wrote:
Is it just me or did patch [1/8 - add dual format..] not make it to the list?
It did not make it, the reason is that it's bigger than allowed 40K, so it awaits Wolfgang's approval. As there is a show in Nurnberg at the moment, we may need to wait a bit, so I have copied it to the temp location for now: http://frozne.semihalf.com/~m8/new-image/patchset5/01-p5.dual_format_framewo...
Cheers, m.

Marian Balakowicz wrote:
Kumar Gala wrote:
On Feb 25, 2008, at 11:34 AM, Marian Balakowicz wrote:
Is it just me or did patch [1/8 - add dual format..] not make it to the list?
It did not make it, the reason is that it's bigger than allowed 40K, so it awaits Wolfgang's approval. As there is a show in Nurnberg at the moment, we may need to wait a bit, so I have copied it to the temp location for now: http://frozne.semihalf.com/~m8/new-image/patchset5/01-p5.dual_format_framewo...
Forget the above location, the correct one is:
http://frozen.semihalf.com/~m8/new-image/patchset5/01-p5.dual_format_framewo...
m.
participants (4)
-
Jean-Christophe PLAGNIOL-VILLARD
-
Jon Loeliger
-
Kumar Gala
-
Marian Balakowicz