X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=common%2Fimage.c;h=6eaf41eb131feb2624421b590c99441bc3a542bf;hb=c253122395753abb9e531d8906c5265dc8803fb1;hp=dc8d7dda6b8abe3a05676a3d0af5caae984349a3;hpb=fc9c1727b5b3483ce49c3cb668e8332fb001b8a7;p=u-boot diff --git a/common/image.c b/common/image.c index dc8d7dda6b..6eaf41eb13 100644 --- a/common/image.c +++ b/common/image.c @@ -65,7 +65,7 @@ extern int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); DECLARE_GLOBAL_DATA_PTR; -static image_header_t* image_get_ramdisk (ulong rd_addr, uint8_t arch, +static const image_header_t* image_get_ramdisk (ulong rd_addr, uint8_t arch, int verify); #else #include "mkimage.h" @@ -74,12 +74,6 @@ static image_header_t* image_get_ramdisk (ulong rd_addr, uint8_t arch, #include #endif /* !USE_HOSTCC*/ -typedef struct table_entry { - int id; /* as defined in image.h */ - char *sname; /* short (input) name */ - char *lname; /* long (output) name */ -} table_entry_t; - static table_entry_t uimage_arch[] = { { IH_ARCH_INVALID, NULL, "Invalid ARCH", }, { IH_ARCH_ALPHA, "alpha", "Alpha", }, @@ -145,6 +139,7 @@ static table_entry_t uimage_type[] = { { IH_TYPE_SCRIPT, "script", "Script", }, { IH_TYPE_STANDALONE, "standalone", "Standalone Program", }, { IH_TYPE_FLATDT, "flat_dt", "Flat Device Tree", }, + { IH_TYPE_KWBIMAGE, "kwbimage", "Kirkwood Boot Image",}, { -1, "", "", }, }; @@ -158,7 +153,6 @@ static table_entry_t uimage_comp[] = { uint32_t crc32 (uint32_t, const unsigned char *, uint); uint32_t crc32_wd (uint32_t, const unsigned char *, uint, uint); -static void genimg_print_size (uint32_t size); #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || defined(USE_HOSTCC) static void genimg_print_time (time_t timestamp); #endif @@ -166,7 +160,7 @@ static void genimg_print_time (time_t timestamp); /*****************************************************************************/ /* Legacy format routines */ /*****************************************************************************/ -int image_check_hcrc (image_header_t *hdr) +int image_check_hcrc (const image_header_t *hdr) { ulong hcrc; ulong len = image_get_header_size (); @@ -181,7 +175,7 @@ int image_check_hcrc (image_header_t *hdr) return (hcrc == image_get_hcrc (hdr)); } -int image_check_dcrc (image_header_t *hdr) +int image_check_dcrc (const image_header_t *hdr) { ulong data = image_get_data (hdr); ulong len = image_get_data_size (hdr); @@ -203,7 +197,7 @@ int image_check_dcrc (image_header_t *hdr) * returns: * number of components */ -ulong image_multi_count (image_header_t *hdr) +ulong image_multi_count (const image_header_t *hdr) { ulong i, count = 0; uint32_t *size; @@ -236,7 +230,7 @@ ulong image_multi_count (image_header_t *hdr) * data address and size of the component, if idx is valid * 0 in data and len, if idx is out of range */ -void image_multi_getimg (image_header_t *hdr, ulong idx, +void image_multi_getimg (const image_header_t *hdr, ulong idx, ulong *data, ulong *len) { int i; @@ -272,7 +266,7 @@ void image_multi_getimg (image_header_t *hdr, ulong idx, } } -static void image_print_type (image_header_t *hdr) +static void image_print_type (const image_header_t *hdr) { const char *os, *arch, *type, *comp; @@ -286,7 +280,7 @@ static void image_print_type (image_header_t *hdr) /** * image_print_contents - prints out the contents of the legacy format image - * @hdr: pointer to the legacy format image header + * @ptr: pointer to the legacy format image header * @p: pointer to prefix string * * image_print_contents() formats a multi line legacy image contents description. @@ -296,8 +290,9 @@ static void image_print_type (image_header_t *hdr) * returns: * no returned results */ -void image_print_contents (image_header_t *hdr) +void image_print_contents (const void *ptr) { + const image_header_t *hdr = (const image_header_t *)ptr; const char *p; #ifdef USE_HOSTCC @@ -363,10 +358,10 @@ void image_print_contents (image_header_t *hdr) * pointer to a ramdisk image header, if image was found and valid * otherwise, return NULL */ -static image_header_t* image_get_ramdisk (ulong rd_addr, uint8_t arch, +static const image_header_t *image_get_ramdisk (ulong rd_addr, uint8_t arch, int verify) { - image_header_t *rd_hdr = (image_header_t *)rd_addr; + const image_header_t *rd_hdr = (const image_header_t *)rd_addr; if (!image_check_magic (rd_hdr)) { puts ("Bad Magic Number\n"); @@ -426,8 +421,8 @@ ulong getenv_bootm_low(void) return tmp; } -#if defined(CFG_SDRAM_BASE) - return CFG_SDRAM_BASE; +#if defined(CONFIG_SYS_SDRAM_BASE) + return CONFIG_SYS_SDRAM_BASE; #elif defined(CONFIG_ARM) return gd->bd->bi_dram[0].start; #else @@ -440,7 +435,7 @@ phys_size_t getenv_bootm_size(void) char *s = getenv ("bootm_size"); if (s) { phys_size_t tmp; -#ifdef CFG_64BIT_STRTOUL +#ifdef CONFIG_SYS_64BIT_STRTOUL tmp = (phys_size_t)simple_strtoull (s, NULL, 16); #else tmp = (phys_size_t)simple_strtoul (s, NULL, 16); @@ -472,7 +467,7 @@ void memmove_wd (void *to, void *from, size_t len, ulong chunksz) } #endif /* !USE_HOSTCC */ -static void genimg_print_size (uint32_t size) +void genimg_print_size (uint32_t size) { #ifndef USE_HOSTCC printf ("%d Bytes = ", size); @@ -514,11 +509,15 @@ static void genimg_print_time (time_t timestamp) * long entry name if translation succeeds * msg otherwise */ -static char *get_table_entry_name (table_entry_t *table, char *msg, int id) +char *get_table_entry_name (table_entry_t *table, char *msg, int id) { for (; table->id >= 0; ++table) { if (table->id == id) - return (table->lname); +#if defined(USE_HOSTCC) || defined(CONFIG_RELOC_FIXUP_WORKS) + return table->lname; +#else + return table->lname + gd->reloc_off; +#endif } return (msg); } @@ -557,7 +556,7 @@ const char *genimg_get_comp_name (uint8_t comp) * entry id if translation succeeds * -1 otherwise */ -static int get_table_entry_id (table_entry_t *table, +int get_table_entry_id (table_entry_t *table, const char *table_name, const char *name) { table_entry_t *t; @@ -579,7 +578,11 @@ static int get_table_entry_id (table_entry_t *table, fprintf (stderr, "\n"); #else for (t = table; t->id >= 0; ++t) { +#ifdef CONFIG_RELOC_FIXUP_WORKS if (t->sname && strcmp(t->sname, name) == 0) +#else + if (t->sname && strcmp(t->sname + gd->reloc_off, name) == 0) +#endif return (t->id); } debug ("Invalid %s Type: %s\n", table_name, name); @@ -624,13 +627,13 @@ int genimg_get_comp_id (const char *name) */ int genimg_get_format (void *img_addr) { - ulong format = IMAGE_FORMAT_INVALID; - image_header_t *hdr; + ulong format = IMAGE_FORMAT_INVALID; + const image_header_t *hdr; #if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT) - char *fit_hdr; + char *fit_hdr; #endif - hdr = (image_header_t *)img_addr; + hdr = (const image_header_t *)img_addr; if (image_check_magic(hdr)) format = IMAGE_FORMAT_LEGACY; #if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT) @@ -663,7 +666,7 @@ ulong genimg_get_image (ulong img_addr) if (addr_dataflash (img_addr)){ /* ger RAM address */ - ram_addr = CFG_LOAD_ADDR; + ram_addr = CONFIG_SYS_LOAD_ADDR; /* get header size */ h_size = image_get_header_size (); @@ -681,7 +684,7 @@ ulong genimg_get_image (ulong img_addr) /* get data size */ switch (genimg_get_format ((void *)ram_addr)) { case IMAGE_FORMAT_LEGACY: - d_size = image_get_data_size ((image_header_t *)ram_addr); + d_size = image_get_data_size ((const image_header_t *)ram_addr); debug (" Legacy format image found at 0x%08lx, size 0x%08lx\n", ram_addr, d_size); break; @@ -758,7 +761,7 @@ int boot_get_ramdisk (int argc, char *argv[], bootm_headers_t *images, { ulong rd_addr, rd_load; ulong rd_data, rd_len; - image_header_t *rd_hdr; + const image_header_t *rd_hdr; #if defined(CONFIG_FIT) void *fit_hdr; const char *fit_uname_config = NULL; @@ -1071,6 +1074,7 @@ int boot_ramdisk_high (struct lmb *lmb, ulong rd_data, ulong rd_len, error: return -1; } +#endif /* defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_SPARC) */ #ifdef CONFIG_OF_LIBFDT static void fdt_error (const char *msg) @@ -1080,9 +1084,9 @@ 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) +static const image_header_t *image_get_fdt (ulong fdt_addr) { - image_header_t *fdt_hdr = (image_header_t *)fdt_addr; + const image_header_t *fdt_hdr = (const image_header_t *)fdt_addr; image_print_contents (fdt_hdr); @@ -1154,8 +1158,8 @@ static int fit_check_fdt (const void *fit, int fdt_noffset, int verify) } #endif /* CONFIG_FIT */ -#ifndef CFG_FDT_PAD -#define CFG_FDT_PAD 0x3000 +#ifndef CONFIG_SYS_FDT_PAD +#define CONFIG_SYS_FDT_PAD 0x3000 #endif /** @@ -1190,7 +1194,7 @@ int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base, goto error; } -#ifndef CFG_NO_FLASH +#ifndef CONFIG_SYS_NO_FLASH /* move the blob if it is in flash (set relocate) */ if (addr2info ((ulong)fdt_blob) != NULL) relocate = 1; @@ -1202,8 +1206,8 @@ int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base, if (fdt_blob < (char *)bootmap_base) relocate = 1; - if ((fdt_blob + *of_size + CFG_FDT_PAD) >= - ((char *)CFG_BOOTMAPSZ + bootmap_base)) + if ((fdt_blob + *of_size + CONFIG_SYS_FDT_PAD) >= + ((char *)CONFIG_SYS_BOOTMAPSZ + bootmap_base)) relocate = 1; /* move flattend device tree if needed */ @@ -1213,9 +1217,9 @@ int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base, /* position on a 4K boundary before the alloc_current */ /* Pad the FDT by a specified amount */ - of_len = *of_size + CFG_FDT_PAD; + of_len = *of_size + CONFIG_SYS_FDT_PAD; of_start = (unsigned long)lmb_alloc_base(lmb, of_len, 0x1000, - (CFG_BOOTMAPSZ + bootmap_base)); + (CONFIG_SYS_BOOTMAPSZ + bootmap_base)); if (of_start == 0) { puts("device tree - allocation error\n"); @@ -1240,7 +1244,7 @@ int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base, *of_size = of_len; } else { *of_flat_tree = fdt_blob; - of_len = (CFG_BOOTMAPSZ + bootmap_base) - (ulong)fdt_blob; + of_len = (CONFIG_SYS_BOOTMAPSZ + bootmap_base) - (ulong)fdt_blob; lmb_reserve(lmb, (ulong)fdt_blob, of_len); fdt_set_totalsize(*of_flat_tree, of_len); @@ -1278,8 +1282,8 @@ error: int boot_get_fdt (int flag, int argc, char *argv[], bootm_headers_t *images, char **of_flat_tree, ulong *of_size) { + const image_header_t *fdt_hdr; ulong fdt_addr; - image_header_t *fdt_hdr; char *fdt_blob = NULL; ulong image_start, image_end; ulong load_start, load_end; @@ -1575,6 +1579,7 @@ error: } #endif /* CONFIG_OF_LIBFDT */ +#if defined(CONFIG_PPC) || defined(CONFIG_M68K) /** * boot_get_cmdline - allocate and initialize kernel cmdline * @lmb: pointer to lmb handle, will be used for memory mgmt @@ -1598,8 +1603,8 @@ int boot_get_cmdline (struct lmb *lmb, ulong *cmd_start, ulong *cmd_end, char *cmdline; char *s; - cmdline = (char *)(ulong)lmb_alloc_base(lmb, CFG_BARGSIZE, 0xf, - CFG_BOOTMAPSZ + bootmap_base); + cmdline = (char *)(ulong)lmb_alloc_base(lmb, CONFIG_SYS_BARGSIZE, 0xf, + CONFIG_SYS_BOOTMAPSZ + bootmap_base); if (cmdline == NULL) return -1; @@ -1635,7 +1640,7 @@ int boot_get_cmdline (struct lmb *lmb, ulong *cmd_start, ulong *cmd_end, int boot_get_kbd (struct lmb *lmb, bd_t **kbd, ulong bootmap_base) { *kbd = (bd_t *)(ulong)lmb_alloc_base(lmb, sizeof(bd_t), 0xf, - CFG_BOOTMAPSZ + bootmap_base); + CONFIG_SYS_BOOTMAPSZ + bootmap_base); if (*kbd == NULL) return -1; @@ -1852,7 +1857,10 @@ void fit_print_contents (const void *fit) * @p: pointer to prefix string * * fit_image_print() lists all mandatory properies for the processed component - * image. If present, hash nodes are printed out as well. + * image. If present, hash nodes are printed out as well. Load + * address for images of type firmware is also printed out. Since the load + * address is not mandatory for firmware images, it will be output as + * "unavailable" when not present. * * returns: * no returned results @@ -1911,14 +1919,17 @@ void fit_image_print (const void *fit, int image_noffset, const char *p) printf ("%s OS: %s\n", p, genimg_get_os_name (os)); } - if ((type == IH_TYPE_KERNEL) || (type == IH_TYPE_STANDALONE)) { + if ((type == IH_TYPE_KERNEL) || (type == IH_TYPE_STANDALONE) || + (type == IH_TYPE_FIRMWARE)) { ret = fit_image_get_load (fit, image_noffset, &load); printf ("%s Load Address: ", p); if (ret) printf ("unavailable\n"); else printf ("0x%08lx\n", load); + } + if ((type == IH_TYPE_KERNEL) || (type == IH_TYPE_STANDALONE)) { fit_image_get_entry (fit, image_noffset, &entry); printf ("%s Entry Point: ", p); if (ret) @@ -2844,7 +2855,7 @@ int fit_check_format (const void *fit) #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || defined(USE_HOSTCC) /* mandatory / node 'timestamp' property */ if (fdt_getprop (fit, 0, FIT_TIMESTAMP_PROP, NULL) == NULL) { - debug ("Wrong FIT format: no description\n"); + debug ("Wrong FIT format: no timestamp\n"); return 0; } #endif