summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorMarian Balakowicz <m8@semihalf.com>2008-04-11 11:07:49 +0200
committerWolfgang Denk <wd@denx.de>2008-04-17 23:59:05 -0700
commitcb1c4896905ab22fcd982e6a8a539f0031942e71 (patch)
tree31e02bd5eb93e4692cb23289a108beb951211e91 /common
parentde2b3216e6b4f3b2fe93759c05b17504f9dfe036 (diff)
downloadu-boot-imx-cb1c4896905ab22fcd982e6a8a539f0031942e71.zip
u-boot-imx-cb1c4896905ab22fcd982e6a8a539f0031942e71.tar.gz
u-boot-imx-cb1c4896905ab22fcd982e6a8a539f0031942e71.tar.bz2
Restore the ability to continue booting after legacy image overwrite
Before new uImage code was merged, bootm code allowed for the kernel image to get overwritten during decompresion. new uImage introduced a check for image overwrites and refused to boot the image that got overwritten. This patch restores the old behavior. It also adds a warning when the image overwriten is a multi-image file, because in such case accessing componentes other than the first one will fail. Signed-off-by: Marian Balakowicz <m8@semihalf.com>
Diffstat (limited to 'common')
-rw-r--r--common/cmd_bootm.c37
-rw-r--r--common/image.c2
2 files changed, 27 insertions, 12 deletions
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index 9e5ce4b..3a0c83d 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -286,9 +286,16 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
debug ("image_start = 0x%lX, image_end = 0x%lx\n", image_start, image_end);
debug ("load_start = 0x%lx, load_end = 0x%lx\n", load_start, load_end);
- puts ("ERROR: image overwritten - must RESET the board to recover.\n");
- show_boot_progress (-113);
- do_reset (cmdtp, flag, argc, argv);
+ if (images.legacy_hdr_valid) {
+ if (image_get_type (&images.legacy_hdr_os_copy) == IH_TYPE_MULTI)
+ puts ("WARNING: legacy format multi component "
+ "image overwritten\n");
+ } else {
+ puts ("ERROR: new format image overwritten - "
+ "must RESET the board to recover\n");
+ show_boot_progress (-113);
+ do_reset (cmdtp, flag, argc, argv);
+ }
}
show_boot_progress (8);
@@ -533,9 +540,17 @@ static void *boot_get_kernel (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]
show_boot_progress (-5);
return NULL;
}
+
+ /*
+ * copy image header to allow for image overwrites during kernel
+ * decompression.
+ */
+ memmove (&images->legacy_hdr_os_copy, hdr, sizeof(image_header_t));
+
+ /* save pointer to image header */
images->legacy_hdr_os = hdr;
- images->legacy_hdr_valid = 1;
+ images->legacy_hdr_valid = 1;
show_boot_progress (6);
break;
#if defined(CONFIG_FIT)
@@ -890,7 +905,7 @@ static void do_bootm_netbsd (cmd_tbl_t *cmdtp, int flag,
* address of the original image header.
*/
os_hdr = NULL;
- if (image_check_type (hdr, IH_TYPE_MULTI)) {
+ if (image_check_type (&images->legacy_hdr_os_copy, IH_TYPE_MULTI)) {
image_multi_getimg (hdr, 1, &kernel_data, &kernel_len);
if (kernel_len)
os_hdr = hdr;
@@ -947,7 +962,7 @@ static void do_bootm_lynxkdi (cmd_tbl_t *cmdtp, int flag,
int argc, char *argv[],
bootm_headers_t *images)
{
- image_header_t *hdr = images->legacy_hdr_os;
+ image_header_t *hdr = &images->legacy_hdr_os_copy;
#if defined(CONFIG_FIT)
if (!images->legacy_hdr_valid) {
@@ -964,7 +979,7 @@ static void do_bootm_rtems (cmd_tbl_t *cmdtp, int flag,
int argc, char *argv[],
bootm_headers_t *images)
{
- image_header_t *hdr = images->legacy_hdr_os;
+ image_header_t *hdr = &images->legacy_hdr_os_copy;
void (*entry_point)(bd_t *);
#if defined(CONFIG_FIT)
@@ -994,10 +1009,10 @@ static void do_bootm_vxworks (cmd_tbl_t *cmdtp, int flag,
bootm_headers_t *images)
{
char str[80];
- image_header_t *hdr = images->legacy_hdr_os;
+ image_header_t *hdr = &images->legacy_hdr_os_copy;
#if defined(CONFIG_FIT)
- if (hdr == NULL) {
+ if (!images->legacy_hdr_valid) {
fit_unsupported_reset ("VxWorks");
do_reset (cmdtp, flag, argc, argv);
}
@@ -1014,7 +1029,7 @@ static void do_bootm_qnxelf(cmd_tbl_t *cmdtp, int flag,
{
char *local_args[2];
char str[16];
- image_header_t *hdr = images->legacy_hdr_os;
+ image_header_t *hdr = &images->legacy_hdr_os_copy;
#if defined(CONFIG_FIT)
if (!images->legacy_hdr_valid) {
@@ -1041,7 +1056,7 @@ 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;
+ image_header_t *hdr = &images->legacy_hdr_os_copy;
#if defined(CONFIG_FIT)
if (!images->legacy_hdr_valid) {
diff --git a/common/image.c b/common/image.c
index 9e63432..d218f2f 100644
--- a/common/image.c
+++ b/common/image.c
@@ -983,7 +983,7 @@ int boot_get_ramdisk (int argc, char *argv[], bootm_headers_t *images,
#endif /* CONFIG_B2 || CONFIG_EVB4510 || CONFIG_ARMADILLO */
} else if (images->legacy_hdr_valid &&
- image_check_type (images->legacy_hdr_os, IH_TYPE_MULTI)) {
+ image_check_type (&images->legacy_hdr_os_copy, IH_TYPE_MULTI)) {
/*
* Now check if we have a legacy mult-component image,
* get second entry data start address and len.