[new uImage] Cleanup image header pointer use in bootm code

- use single image header pointer instead of a set of auxilliary variables.
- add multi component image helper routines: get component size/data address

Signed-off-by: Marian Balakowicz <m8@semihalf.com>
master
Marian Balakowicz 17 years ago committed by Wolfgang Denk
parent 1ee1180b6e
commit f13e7b2e99
  1. 10
      common/cmd_autoscript.c
  2. 153
      common/cmd_bootm.c
  3. 86
      common/image.c
  4. 27
      include/image.h
  5. 88
      lib_arm/armlinux.c
  6. 68
      lib_avr32/avr32_linux.c
  7. 4
      lib_blackfin/bf533_linux.c
  8. 81
      lib_i386/i386_linux.c
  9. 84
      lib_m68k/m68k_linux.c
  10. 71
      lib_microblaze/microblaze_linux.c
  11. 68
      lib_mips/mips_linux.c
  12. 2
      lib_nios/nios_linux.c
  13. 5
      lib_nios2/nios_linux.c
  14. 177
      lib_ppc/ppc_linux.c

@ -54,7 +54,7 @@ autoscript (ulong addr)
{ {
ulong len; ulong len;
image_header_t *hdr = (image_header_t *)addr; image_header_t *hdr = (image_header_t *)addr;
ulong *len_ptr; ulong *data;
char *cmd; char *cmd;
int rcode = 0; int rcode = 0;
int verify; int verify;
@ -84,9 +84,9 @@ autoscript (ulong addr)
} }
/* get length of script */ /* get length of script */
len_ptr = (ulong *)image_get_data (hdr); data = (ulong *)image_get_data (hdr);
if ((len = image_to_cpu (*len_ptr)) == 0) { if ((len = image_to_cpu (*data)) == 0) {
puts ("Empty Script\n"); puts ("Empty Script\n");
return 1; return 1;
} }
@ -97,10 +97,10 @@ autoscript (ulong addr)
return 1; return 1;
} }
while (*len_ptr++); while (*data++);
/* make sure cmd is null terminated */ /* make sure cmd is null terminated */
memmove (cmd, (char *)len_ptr, len); memmove (cmd, (char *)data, len);
*(cmd + len) = 0; *(cmd + len) = 0;
#ifdef CFG_HUSH_PARSER /*?? */ #ifdef CFG_HUSH_PARSER /*?? */

@ -93,14 +93,13 @@ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
* - disabled interrupts. * - disabled interrupts.
*/ */
typedef void boot_os_fn (cmd_tbl_t *cmdtp, int flag, typedef void boot_os_fn (cmd_tbl_t *cmdtp, int flag,
int argc, char *argv[], int argc, char *argv[],
ulong addr, /* of image to boot */ image_header_t *hdr, /* of image to boot */
ulong *len_ptr, /* multi-file image length table */ int verify); /* getenv("verify")[0] != 'n' */
int verify); /* getenv("verify")[0] != 'n' */
extern boot_os_fn do_bootm_linux; extern boot_os_fn do_bootm_linux;
static boot_os_fn do_bootm_netbsd; static boot_os_fn do_bootm_netbsd;
#ifdef CONFIG_LYNXKDI #if defined(CONFIG_LYNXKDI)
static boot_os_fn do_bootm_lynxkdi; static boot_os_fn do_bootm_lynxkdi;
extern void lynxkdi_boot (image_header_t *); extern void lynxkdi_boot (image_header_t *);
#endif #endif
@ -116,8 +115,6 @@ extern uchar (*env_get_char)(int); /* Returns a character from the environment *
static boot_os_fn do_bootm_artos; static boot_os_fn do_bootm_artos;
#endif #endif
image_header_t header;
ulong load_addr = CFG_LOAD_ADDR; /* Default Load Address */ ulong load_addr = CFG_LOAD_ADDR; /* Default Load Address */
@ -126,34 +123,32 @@ ulong load_addr = CFG_LOAD_ADDR; /* Default Load Address */
/*******************************************************************/ /*******************************************************************/
int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{ {
ulong iflag; ulong iflag;
ulong addr; char *name, *s;
ulong data, len; int (*appl)(int, char *[]);
ulong *len_ptr; uint unc_len = CFG_BOOTM_LEN;
uint unc_len = CFG_BOOTM_LEN; int verify = getenv_verify();
int i, verify;
char *name, *s;
int (*appl)(int, char *[]);
image_header_t *hdr = &header;
verify = getenv_verify (); image_header_t *hdr;
ulong img_addr;
ulong os_data, os_len;
if (argc < 2) { if (argc < 2) {
addr = load_addr; img_addr = load_addr;
} else { } else {
addr = simple_strtoul(argv[1], NULL, 16); img_addr = simple_strtoul(argv[1], NULL, 16);
} }
show_boot_progress (1); show_boot_progress (1);
printf ("## Booting image at %08lx ...\n", addr); printf ("## Booting image at %08lx ...\n", img_addr);
/* Copy header so we can blank CRC field for re-calculation */
#ifdef CONFIG_HAS_DATAFLASH #ifdef CONFIG_HAS_DATAFLASH
if (addr_dataflash(addr)){ if (addr_dataflash (img_addr)){
read_dataflash (addr, image_get_header_size (), (char *)&header); hdr = (image_header_t *)CFG_LOAD_ADDR;
read_dataflash (img_addr, image_get_header_size (), (char *)hdr);
} else } else
#endif #endif
memmove (&header, (char *)addr, image_get_header_size ()); hdr = (image_header_t *)img_addr;
if (!image_check_magic(hdr)) { if (!image_check_magic(hdr)) {
puts ("Bad Magic Number\n"); puts ("Bad Magic Number\n");
@ -170,23 +165,18 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
show_boot_progress (3); show_boot_progress (3);
#ifdef CONFIG_HAS_DATAFLASH #ifdef CONFIG_HAS_DATAFLASH
if (addr_dataflash(addr)){ if (addr_dataflash (img_addr))
len = image_get_image_size (hdr); read_dataflash (img_addr + image_get_header_size (),
read_dataflash(addr, len, (char *)CFG_LOAD_ADDR); image_get_data_size (hdr),
addr = CFG_LOAD_ADDR; (char *)image_get_data (hdr));
}
#endif #endif
/* for multi-file images we need the data part, too */ /* uImage is in a system RAM, pointed to by hdr */
print_image_hdr ((image_header_t *)addr); print_image_hdr (hdr);
len = image_get_data_size (hdr);
data = addr + image_get_header_size ();
len_ptr = (ulong *)data;
if (verify) { if (verify) {
puts (" Verifying Checksum ... "); puts (" Verifying Checksum ... ");
if (!image_check_dcrc ((image_header_t *)addr)) { if (!image_check_dcrc (hdr)) {
printf ("Bad Data CRC\n"); printf ("Bad Data CRC\n");
show_boot_progress (-3); show_boot_progress (-3);
return 1; return 1;
@ -212,14 +202,12 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
break; break;
case IH_TYPE_KERNEL: case IH_TYPE_KERNEL:
name = "Kernel Image"; name = "Kernel Image";
os_data = image_get_data (hdr);
os_len = image_get_data_size (hdr);
break; break;
case IH_TYPE_MULTI: case IH_TYPE_MULTI:
name = "Multi-File Image"; name = "Multi-File Image";
len = image_to_cpu (len_ptr[0]); image_multi_getimg (hdr, 0, &os_data, &os_len);
/* OS kernel is always the first image */
data += 8; /* kernel_len + terminator */
for (i=1; len_ptr[i]; ++i)
data += 4;
break; break;
default: default:
printf ("Wrong Image Type for %s command\n", cmdtp->name); printf ("Wrong Image Type for %s command\n", cmdtp->name);
@ -248,13 +236,13 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
switch (image_get_comp (hdr)) { switch (image_get_comp (hdr)) {
case IH_COMP_NONE: case IH_COMP_NONE:
if (image_get_load (hdr) == addr) { if (image_get_load (hdr) == img_addr) {
printf (" XIP %s ... ", name); printf (" XIP %s ... ", name);
} else { } else {
printf (" Loading %s ... ", name); printf (" Loading %s ... ", name);
memmove_wd ((void *)image_get_load (hdr), memmove_wd ((void *)image_get_load (hdr),
(void *)data, len, CHUNKSZ); (void *)os_data, os_len, CHUNKSZ);
puts("OK\n"); puts("OK\n");
} }
@ -262,7 +250,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
case IH_COMP_GZIP: case IH_COMP_GZIP:
printf (" Uncompressing %s ... ", name); printf (" Uncompressing %s ... ", name);
if (gunzip ((void *)image_get_load (hdr), unc_len, if (gunzip ((void *)image_get_load (hdr), unc_len,
(uchar *)data, &len) != 0) { (uchar *)os_data, &os_len) != 0) {
puts ("GUNZIP ERROR - must RESET board to recover\n"); puts ("GUNZIP ERROR - must RESET board to recover\n");
show_boot_progress (-6); show_boot_progress (-6);
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
@ -276,9 +264,9 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
* use slower decompression algorithm which requires * use slower decompression algorithm which requires
* at most 2300 KB of memory. * at most 2300 KB of memory.
*/ */
i = BZ2_bzBuffToBuffDecompress ((char*)image_get_load (hdr), int i = BZ2_bzBuffToBuffDecompress ((char*)image_get_load (hdr),
&unc_len, (char *)data, len, &unc_len, (char *)os_data, os_len,
CFG_MALLOC_LEN < (4096 * 1024), 0); CFG_MALLOC_LEN < (4096 * 1024), 0);
if (i != BZ_OK) { if (i != BZ_OK) {
printf ("BUNZIP2 ERROR %d - must RESET board to recover\n", i); printf ("BUNZIP2 ERROR %d - must RESET board to recover\n", i);
show_boot_progress (-6); show_boot_progress (-6);
@ -306,7 +294,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
*/ */
if (((s = getenv("autostart")) != NULL) && (strcmp(s,"no") == 0)) { if (((s = getenv("autostart")) != NULL) && (strcmp(s,"no") == 0)) {
char buf[32]; char buf[32];
sprintf(buf, "%lX", len); sprintf(buf, "%lX", image_get_data_size(hdr));
setenv("filesize", buf); setenv("filesize", buf);
return 0; return 0;
} }
@ -332,42 +320,36 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
#ifdef CONFIG_SILENT_CONSOLE #ifdef CONFIG_SILENT_CONSOLE
fixup_silent_linux(); fixup_silent_linux();
#endif #endif
do_bootm_linux (cmdtp, flag, argc, argv, do_bootm_linux (cmdtp, flag, argc, argv, hdr, verify);
addr, len_ptr, verify);
break; break;
case IH_OS_NETBSD: case IH_OS_NETBSD:
do_bootm_netbsd (cmdtp, flag, argc, argv, do_bootm_netbsd (cmdtp, flag, argc, argv, hdr, verify);
addr, len_ptr, verify);
break; break;
#ifdef CONFIG_LYNXKDI #ifdef CONFIG_LYNXKDI
case IH_OS_LYNXOS: case IH_OS_LYNXOS:
do_bootm_lynxkdi (cmdtp, flag, argc, argv, do_bootm_lynxkdi (cmdtp, flag, argc, argv, hdr, verify);
addr, len_ptr, verify);
break; break;
#endif #endif
case IH_OS_RTEMS: case IH_OS_RTEMS:
do_bootm_rtems (cmdtp, flag, argc, argv, do_bootm_rtems (cmdtp, flag, argc, argv, hdr, verify);
addr, len_ptr, verify);
break; break;
#if defined(CONFIG_CMD_ELF) #if defined(CONFIG_CMD_ELF)
case IH_OS_VXWORKS: case IH_OS_VXWORKS:
do_bootm_vxworks (cmdtp, flag, argc, argv, do_bootm_vxworks (cmdtp, flag, argc, argv, hdr, verify);
addr, len_ptr, verify);
break; break;
case IH_OS_QNX: case IH_OS_QNX:
do_bootm_qnxelf (cmdtp, flag, argc, argv, do_bootm_qnxelf (cmdtp, flag, argc, argv, hdr, verify);
addr, len_ptr, verify);
break; break;
#endif #endif
#ifdef CONFIG_ARTOS #ifdef CONFIG_ARTOS
case IH_OS_ARTOS: case IH_OS_ARTOS:
do_bootm_artos (cmdtp, flag, argc, argv, do_bootm_artos (cmdtp, flag, argc, argv, hdr, verify);
addr, len_ptr, verify);
break; break;
#endif #endif
} }
@ -570,11 +552,12 @@ void print_image_hdr (image_header_t *hdr)
if (image_check_type (hdr, IH_TYPE_MULTI)) { if (image_check_type (hdr, IH_TYPE_MULTI)) {
int i; int i;
ulong len; ulong data, len;
ulong *len_ptr = (ulong *)((ulong)hdr + image_get_header_size ()); ulong count = image_multi_count (hdr);
puts (" Contents:\n"); puts (" Contents:\n");
for (i = 0; (len = image_to_cpu (*len_ptr)); ++i, ++len_ptr) { for (i = 0; i < count; i++) {
image_multi_getimg (hdr, i, &data, &len);
printf (" Image %d: %8ld Bytes = ", i, len); printf (" Image %d: %8ld Bytes = ", i, len);
print_size (len, "\n"); print_size (len, "\n");
} }
@ -684,14 +667,12 @@ static void fixup_silent_linux ()
/*******************************************************************/ /*******************************************************************/
static void do_bootm_netbsd (cmd_tbl_t *cmdtp, int flag, static void do_bootm_netbsd (cmd_tbl_t *cmdtp, int flag,
int argc, char *argv[], int argc, char *argv[],
ulong addr, ulong *len_ptr, image_header_t *hdr, int verify)
int verify)
{ {
image_header_t *hdr = &header;
void (*loader)(bd_t *, image_header_t *, char *, char *); void (*loader)(bd_t *, image_header_t *, char *, char *);
image_header_t *img_addr; image_header_t *img_addr;
ulong kernel_data, kernel_len;
char *consdev; char *consdev;
char *cmdline; char *cmdline;
@ -708,8 +689,11 @@ static void do_bootm_netbsd (cmd_tbl_t *cmdtp, int flag,
*/ */
img_addr = 0; img_addr = 0;
if ((image_check_type (hdr, IH_TYPE_MULTI)) && (len_ptr[1])) if (image_check_type (hdr, IH_TYPE_MULTI)) {
img_addr = (image_header_t *)addr; image_multi_getimg (hdr, 1, &kernel_data, &kernel_len);
if (kernel_len)
img_addr = hdr;
}
consdev = ""; consdev = "";
#if defined (CONFIG_8xx_CONS_SMC1) #if defined (CONFIG_8xx_CONS_SMC1)
@ -760,19 +744,16 @@ static void do_bootm_netbsd (cmd_tbl_t *cmdtp, int flag,
#ifdef CONFIG_LYNXKDI #ifdef CONFIG_LYNXKDI
static void do_bootm_lynxkdi (cmd_tbl_t *cmdtp, int flag, static void do_bootm_lynxkdi (cmd_tbl_t *cmdtp, int flag,
int argc, char *argv[], int argc, char *argv[],
ulong addr, ulong *len_ptr, image_header_t *hdr, int verify)
int verify)
{ {
lynxkdi_boot (&header); lynxkdi_boot (hdr);
} }
#endif /* CONFIG_LYNXKDI */ #endif /* CONFIG_LYNXKDI */
static void do_bootm_rtems (cmd_tbl_t *cmdtp, int flag, static void do_bootm_rtems (cmd_tbl_t *cmdtp, int flag,
int argc, char *argv[], int argc, char *argv[],
ulong addr, ulong *len_ptr, image_header_t *hdr, int verify)
int verify)
{ {
image_header_t *hdr = &header;
void (*entry_point)(bd_t *); void (*entry_point)(bd_t *);
entry_point = (void (*)(bd_t *))image_get_ep (hdr); entry_point = (void (*)(bd_t *))image_get_ep (hdr);
@ -792,10 +773,8 @@ static void do_bootm_rtems (cmd_tbl_t *cmdtp, int flag,
#if defined(CONFIG_CMD_ELF) #if defined(CONFIG_CMD_ELF)
static void do_bootm_vxworks (cmd_tbl_t *cmdtp, int flag, static void do_bootm_vxworks (cmd_tbl_t *cmdtp, int flag,
int argc, char *argv[], int argc, char *argv[],
ulong addr, ulong *len_ptr, image_header_t *hdr, int verify)
int verify)
{ {
image_header_t *hdr = &header;
char str[80]; char str[80];
sprintf(str, "%x", image_get_ep (hdr)); /* write entry-point into string */ sprintf(str, "%x", image_get_ep (hdr)); /* write entry-point into string */
@ -803,12 +782,10 @@ static void do_bootm_vxworks (cmd_tbl_t *cmdtp, int flag,
do_bootvx(cmdtp, 0, 0, NULL); do_bootvx(cmdtp, 0, 0, NULL);
} }
static void do_bootm_qnxelf (cmd_tbl_t *cmdtp, int flag, static void do_bootm_qnxelf(cmd_tbl_t *cmdtp, int flag,
int argc, char *argv[], int argc, char *argv[],
ulong addr, ulong *len_ptr, image_header_t *hdr, int verify)
int verify)
{ {
image_header_t *hdr = &header;
char *local_args[2]; char *local_args[2];
char str[16]; char str[16];
@ -822,8 +799,7 @@ static void do_bootm_qnxelf (cmd_tbl_t *cmdtp, int flag,
#if defined(CONFIG_ARTOS) && defined(CONFIG_PPC) #if defined(CONFIG_ARTOS) && defined(CONFIG_PPC)
static void do_bootm_artos (cmd_tbl_t *cmdtp, int flag, static void do_bootm_artos (cmd_tbl_t *cmdtp, int flag,
int argc, char *argv[], int argc, char *argv[],
ulong addr, ulong *len_ptr, image_header_t *hdr, int verify)
int verify)
{ {
ulong top; ulong top;
char *s, *cmdline; char *s, *cmdline;
@ -831,7 +807,6 @@ static void do_bootm_artos (cmd_tbl_t *cmdtp, int flag,
int i, j, nxt, len, envno, envsz; int i, j, nxt, len, envno, envsz;
bd_t *kbd; bd_t *kbd;
void (*entry)(bd_t *bd, char *cmdline, char **fwenv, ulong top); void (*entry)(bd_t *bd, char *cmdline, char **fwenv, ulong top);
image_header_t *hdr = &header;
/* /*
* Booting an ARTOS kernel image + application * Booting an ARTOS kernel image + application

@ -107,3 +107,89 @@ void memmove_wd (void *to, void *from, size_t len, ulong chunksz)
#endif /* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */ #endif /* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
} }
#endif /* USE_HOSTCC */ #endif /* USE_HOSTCC */
/**
* image_multi_count - get component (sub-image) count
* @hdr: pointer to the header of the multi component image
*
* image_multi_count() returns number of components in a multi
* component image.
*
* Note: no checking of the image type is done, caller must pass
* a valid multi component image.
*
* returns:
* number of components
*/
ulong image_multi_count (image_header_t *hdr)
{
ulong i, count = 0;
ulong *size;
/* get start of the image payload, which in case of multi
* component images that points to a table of component sizes */
size = (ulong *)image_get_data (hdr);
/* count non empty slots */
for (i = 0; size[i]; ++i)
count++;
return count;
}
/**
* image_multi_getimg - get component data address and size
* @hdr: pointer to the header of the multi component image
* @idx: index of the requested component
* @data: pointer to a ulong variable, will hold component data address
* @len: pointer to a ulong variable, will hold component size
*
* image_multi_getimg() returns size and data address for the requested
* component in a multi component image.
*
* Note: no checking of the image type is done, caller must pass
* a valid multi component image.
*
* returns:
* 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,
ulong *data, ulong *len)
{
int i;
ulong *size;
ulong offset, tail, count, img_data;
/* get number of component */
count = image_multi_count (hdr);
/* get start of the image payload, which in case of multi
* component images that points to a table of component sizes */
size = (ulong *)image_get_data (hdr);
/* get address of the proper component data start, which means
* skipping sizes table (add 1 for last, null entry) */
img_data = image_get_data (hdr) + (count + 1) * sizeof (ulong);
if (idx < count) {
*len = size[idx];
offset = 0;
tail = 0;
/* go over all indices preceding requested component idx */
for (i = 0; i < idx; i++) {
/* add up i-th component size */
offset += size[i];
/* add up alignment for i-th component */
tail += (4 - size[i] % 4);
}
/* calculate idx-th component data address */
*data = img_data + offset + tail;
} else {
*len = 0;
*data = 0;
}
}

@ -211,13 +211,30 @@ static inline uint32_t image_get_data_size (image_header_t *hdr)
{ {
return image_get_size (hdr); return image_get_size (hdr);
} }
/**
* image_get_data - get image payload start address
* @hdr: image header
*
* image_get_data() returns address of the image payload. For single
* component images it is image data start. For multi component
* images it points to the null terminated table of sub-images sizes.
*
* returns:
* image payload data start address
*/
static inline ulong image_get_data (image_header_t *hdr)
{
return ((ulong)hdr + image_get_header_size ());
}
static inline uint32_t image_get_image_size (image_header_t *hdr) static inline uint32_t image_get_image_size (image_header_t *hdr)
{ {
return (image_get_size (hdr) + image_get_header_size ()); return (image_get_size (hdr) + image_get_header_size ());
} }
static inline ulong image_get_data (image_header_t *hdr) static inline ulong image_get_image_end (image_header_t *hdr)
{ {
return ((ulong)hdr + image_get_header_size ()); return ((ulong)hdr + image_get_image_size (hdr));
} }
#define image_set_hdr_l(f) \ #define image_set_hdr_l(f) \
@ -307,4 +324,8 @@ static inline int image_check_target_arch (image_header_t *hdr)
} }
#endif #endif
#endif /* __IMAGE_H__ */ ulong image_multi_count (image_header_t *hdr);
void image_multi_getimg (image_header_t *hdr, ulong idx,
ulong *data, ulong *len);
#endif /* __IMAGE_H__ */

@ -66,17 +66,14 @@ static void setup_videolfb_tag (gd_t *gd);
static struct tag *params; static struct tag *params;
#endif /* CONFIG_SETUP_MEMORY_TAGS || CONFIG_CMDLINE_TAG || CONFIG_INITRD_TAG */ #endif /* CONFIG_SETUP_MEMORY_TAGS || CONFIG_CMDLINE_TAG || CONFIG_INITRD_TAG */
extern image_header_t header; /* from cmd_bootm.c */
void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
ulong addr, ulong *len_ptr, int verify) image_header_t *hdr, int verify)
{ {
ulong len = 0; ulong rd_addr;
ulong rd_data, rd_len = 0;
ulong initrd_start, initrd_end; ulong initrd_start, initrd_end;
ulong data; image_header_t *rd_hdr;
void (*theKernel)(int zero, int arch, uint params); void (*theKernel)(int zero, int arch, uint params);
image_header_t *hdr = &header;
bd_t *bd = gd->bd; bd_t *bd = gd->bd;
#ifdef CONFIG_CMDLINE_TAG #ifdef CONFIG_CMDLINE_TAG
@ -91,27 +88,26 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
if (argc >= 3) { if (argc >= 3) {
show_boot_progress (9); show_boot_progress (9);
addr = simple_strtoul (argv[2], NULL, 16); rd_addr = simple_strtoul (argv[2], NULL, 16);
printf ("## Loading Ramdisk Image at %08lx ...\n", rd_addr);
printf ("## Loading Ramdisk Image at %08lx ...\n", addr);
/* Copy header so we can blank CRC field for re-calculation */ /* Copy header so we can blank CRC field for re-calculation */
#ifdef CONFIG_HAS_DATAFLASH #ifdef CONFIG_HAS_DATAFLASH
if (addr_dataflash (addr)) { if (addr_dataflash (rd_addr)) {
read_dataflash (addr, image_get_header_size (), rd_hdr = (image_header_t *)CFG_LOAD_ADDR;
(char *) &header); read_dataflash (rd_addr, image_get_header_size (),
(char *)rd_hdr);
} else } else
#endif #endif
memcpy (&header, (char *) addr, rd_hdr = (image_header_t *)rd_addr;
image_get_header_size ());
if (!image_check_magic (hdr)) { if (!image_check_magic (rd_hdr)) {
printf ("Bad Magic Number\n"); printf ("Bad Magic Number\n");
show_boot_progress (-10); show_boot_progress (-10);
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
} }
if (!image_check_hcrc (hdr)) { if (!image_check_hcrc (rd_hdr)) {
printf ("Bad Header Checksum\n"); printf ("Bad Header Checksum\n");
show_boot_progress (-11); show_boot_progress (-11);
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
@ -119,21 +115,20 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
show_boot_progress (10); show_boot_progress (10);
print_image_hdr (hdr); print_image_hdr (rd_hdr);
data = image_get_data (hdr); rd_data = image_get_data (rd_hdr);
len = image_get_data_size (hdr); rd_len = image_get_data_size (rd_hdr);
#ifdef CONFIG_HAS_DATAFLASH #ifdef CONFIG_HAS_DATAFLASH
if (addr_dataflash (addr)) { if (addr_dataflash (rd_addr))
read_dataflash (data, len, (char *) CFG_LOAD_ADDR); read_dataflash (rd_addr + image_get_header_size (),
data = CFG_LOAD_ADDR; rd_len, (char *)rd_data);
}
#endif #endif
if (verify) { if (verify) {
printf (" Verifying Checksum ... "); printf (" Verifying Checksum ... ");
if (!image_get_dcrc (hdr)) { if (!image_get_dcrc (rd_hdr)) {
printf ("Bad Data CRC\n"); printf ("Bad Data CRC\n");
show_boot_progress (-12); show_boot_progress (-12);
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
@ -143,9 +138,9 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
show_boot_progress (11); show_boot_progress (11);
if (!image_check_os (hdr, IH_OS_LINUX) || if (!image_check_os (rd_hdr, IH_OS_LINUX) ||
!image_check_arch (hdr, IH_ARCH_ARM) || !image_check_arch (rd_hdr, IH_ARCH_ARM) ||
!image_check_type (hdr, IH_TYPE_RAMDISK)) { !image_check_type (rd_hdr, IH_TYPE_RAMDISK)) {
printf ("No Linux ARM Ramdisk Image\n"); printf ("No Linux ARM Ramdisk Image\n");
show_boot_progress (-13); show_boot_progress (-13);
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
@ -155,50 +150,37 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
/* /*
*we need to copy the ramdisk to SRAM to let Linux boot *we need to copy the ramdisk to SRAM to let Linux boot
*/ */
memmove ((void *)image_get_load (hdr), (uchar *)data, len); memmove ((void *)image_get_load (rd_hdr), (uchar *)rd_data, rd_len);
data = image_get_load (hdr); rd_data = image_get_load (rd_hdr);
#endif /* CONFIG_B2 || CONFIG_EVB4510 */ #endif /* CONFIG_B2 || CONFIG_EVB4510 */
/* /*
* Now check if we have a multifile image * Now check if we have a multifile image
*/ */
} else if (image_check_type (hdr, IH_TYPE_MULTI) && (len_ptr[1])) { } else if (image_check_type (hdr, IH_TYPE_MULTI)) {
ulong tail = image_to_cpu (len_ptr[0]) % 4; /*
int i; * Get second entry data start address and len
*/
show_boot_progress (13); show_boot_progress (13);
image_multi_getimg (hdr, 1, &rd_data, &rd_len);
/* skip kernel length and terminator */
data = (ulong) (&len_ptr[2]);
/* skip any additional image length fields */
for (i = 1; len_ptr[i]; ++i)
data += 4;
/* add kernel length, and align */
data += image_to_cpu (len_ptr[0]);
if (tail) {
data += 4 - tail;
}
len = image_to_cpu (len_ptr[1]);
} else { } else {
/* /*
* no initrd image * no initrd image
*/ */
show_boot_progress (14); show_boot_progress (14);
len = data = 0; rd_len = rd_data = 0;
} }
#ifdef DEBUG #ifdef DEBUG
if (!data) { if (!rd_data) {
printf ("No initrd\n"); printf ("No initrd\n");
} }
#endif #endif
if (data) { if (rd_data) {
initrd_start = data; initrd_start = rd_data;
initrd_end = initrd_start + len; initrd_end = initrd_start + rd_len;
} else { } else {
initrd_start = 0; initrd_start = 0;
initrd_end = 0; initrd_end = 0;

@ -174,20 +174,16 @@ static void setup_end_tag(struct tag *params)
} }
void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
unsigned long addr, unsigned long *len_ptr, int verify) image_header_t *hdr, int verify)
{ {
unsigned long data, len = 0; ulong rd_data, rd_len = 0;
unsigned long initrd_start, initrd_end; ulong initrd_start, initrd_end;
unsigned long image_start, image_end; image_header_t *rd_hdr;
void (*theKernel)(int magic, void *tagtable); void (*theKernel)(int magic, void *tagtable);
image_header_t *hdr;
struct tag *params, *params_start; struct tag *params, *params_start;
char *commandline = getenv("bootargs"); char *commandline = getenv("bootargs");
hdr = (image_header_t *)addr;
image_start = addr;
image_end = addr + image_get_data_size (hdr);
theKernel = (void *)image_get_ep (hdr); theKernel = (void *)image_get_ep (hdr);
/* /*
@ -196,29 +192,27 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
if (argc >= 3) { if (argc >= 3) {
show_boot_progress (9); show_boot_progress (9);
addr = simple_strtoul(argv[2], NULL, 16); rd_hdr = (image_header_t *)simple_strtoul (argv[2], NULL, 16);
hdr = (image_header_t *)addr; printf ("## Loading RAMDISK image at %08lx ...\n", rd_hdr);
printf("## Loading RAMDISK image at %08lx ...\n", addr); if (!image_check_magic (rd_hdr)) {
if (!image_check_magic (hdr)) {
puts("Bad Magic Number\n"); puts("Bad Magic Number\n");
show_boot_progress (-10); show_boot_progress (-10);
do_reset(cmdtp, flag, argc, argv); do_reset(cmdtp, flag, argc, argv);
} }
if (!image_check_hcrc (hdr)) { if (!image_check_hcrc (rd_hdr)) {
puts("Bad Header Checksum\n"); puts("Bad Header Checksum\n");
show_boot_progress (-11); show_boot_progress (-11);
do_reset(cmdtp, flag, argc, argv); do_reset(cmdtp, flag, argc, argv);
} }
show_boot_progress (10); show_boot_progress (10);
print_image_hdr (hdr); print_image_hdr (rd_hdr);
if (verify) { if (verify) {
puts(" Verifying Checksum ... "); puts(" Verifying Checksum ... ");
if (!image_check_dcrc (hdr)) { if (!image_check_dcrc (rd_hdr)) {
puts("Bad Data CRC\n"); puts("Bad Data CRC\n");
show_boot_progress (-12); show_boot_progress (-12);
do_reset(cmdtp, flag, argc, argv); do_reset(cmdtp, flag, argc, argv);
@ -228,44 +222,32 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
show_boot_progress (11); show_boot_progress (11);
if (!image_check_os (hdr, IH_OS_LINUX) || if (!image_check_os (rd_hdr, IH_OS_LINUX) ||
!image_check_arch (hdr, IH_ARCH_AVR32) || !image_check_arch (rd_hdr, IH_ARCH_AVR32) ||
!image_check_type (hdr, IH_TYPE_RAMDISK)) { !image_check_type (rd_hdr, IH_TYPE_RAMDISK)) {
puts("Not a Linux/AVR32 RAMDISK image\n"); puts("Not a Linux/AVR32 RAMDISK image\n");
show_boot_progress (-13); show_boot_progress (-13);
do_reset(cmdtp, flag, argc, argv); do_reset(cmdtp, flag, argc, argv);
} }
data = image_get_data (hdr); rd_data = image_get_data (rd_hdr);
len = image_get_data_size (hdr); rd_len = image_get_data_size (rd_hdr);
} else if (image_check_type (hdr, IH_TYPE_MULTI) && (len_ptr[1])) {
ulong tail = image_to_cpu (len_ptr[0]) % 4;
int i;
} else if (image_check_type (hdr, IH_TYPE_MULTI)) {
/*
* Get second entry data start address and len
*/
show_boot_progress (13); show_boot_progress (13);
image_multi_getimg (hdr, 1, &rd_data, &rd_len);
/* skip kernel length and terminator */
data = (ulong) (&len_ptr[2]);
/* skip any additional image length fields */
for (i = 1; len_ptr[i]; ++i)
data += 4;
/* add kernel length, and align */
data += image_to_cpu (len_ptr[0]);
if (tail) {
data += 4 - tail;
}
len = image_to_cpu (len_ptr[1]);
} else { } else {
/* no initrd image */ /* no initrd image */
show_boot_progress (14); show_boot_progress (14);
len = data = 0; rd_len = rd_data = 0;
} }
if (data) { if (rd_data) {
initrd_start = data; initrd_start = rd_data;
initrd_end = initrd_start + len; initrd_end = initrd_start + rd_len;
} else { } else {
initrd_start = 0; initrd_start = 0;
initrd_end = 0; initrd_end = 0;

@ -42,17 +42,15 @@
extern void swap_to(int device_id); extern void swap_to(int device_id);
#endif #endif
extern image_header_t header;
extern void flush_instruction_cache(void); extern void flush_instruction_cache(void);
extern void flush_data_cache(void); extern void flush_data_cache(void);
static char *make_command_line(void); static char *make_command_line(void);
void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[], void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
ulong addr, ulong * len_ptr, int verify) image_header_t *hdr, int verify)
{ {
int (*appl) (char *cmdline); int (*appl) (char *cmdline);
char *cmdline; char *cmdline;
image_header_t *hdr = &header;
#ifdef SHARED_RESOURCES #ifdef SHARED_RESOURCES
swap_to(FLASH); swap_to(FLASH);

@ -31,54 +31,50 @@
/*cmd_boot.c*/ /*cmd_boot.c*/
extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
extern image_header_t header; /* from cmd_bootm.c */
void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
ulong addr, ulong *len_ptr, int verify) image_header_t *hdr, int verify)
{ {
void *base_ptr; void *base_ptr;
ulong len = 0; ulong os_data, os_len;
ulong rd_data, rd_len;
ulong initrd_start, initrd_end; ulong initrd_start, initrd_end;
ulong data; image_header_t *rd_hdr;
image_header_t *hdr = &header;
/* /*
* Check if there is an initrd image * Check if there is an initrd image
*/ */
if (argc >= 3) { if (argc >= 3) {
addr = simple_strtoul(argv[2], NULL, 16); rd_hdr = (image_header_t *)simple_strtoul (argv[2], NULL, 16);
hdr = (image_header_t *)addr; printf ("## Loading Ramdisk Image at %08lx ...\n", rd_hdr);
printf ("## Loading Ramdisk Image at %08lx ...\n", addr);
if (!image_check_magic (hdr)) { if (!image_check_magic (rd_hdr)) {
printf ("Bad Magic Number\n"); printf ("Bad Magic Number\n");
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
} }
if (!image_check_hcrc (hdr)) { if (!image_check_hcrc (rd_hdr)) {
printf ("Bad Header Checksum\n"); printf ("Bad Header Checksum\n");
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
} }
print_image_hdr (hdr); print_image_hdr (rd_hdr);
data = image_get_data (hdr); rd_data = image_get_data (rd_hdr);
len = image_get_data_size (hdr); rd_len = image_get_data_size (rd_hdr);
if (verify) { if (verify) {
printf (" Verifying Checksum ... "); printf (" Verifying Checksum ... ");
if (!image_check_dcrc (hdr)) { if (!image_check_dcrc (rd_hdr)) {
printf ("Bad Data CRC\n"); printf ("Bad Data CRC\n");
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
} }
printf ("OK\n"); printf ("OK\n");
} }
if (!image_check_os (hdr, IH_OS_LINUX) || if (!image_check_os (rd_hdr, IH_OS_LINUX) ||
!image_check_arch (hdr, IH_ARCH_I386) || !image_check_arch (rd_hdr, IH_ARCH_I386) ||
!image_check_type (hdr, IH_TYPE_RAMDISK)) { !image_check_type (rd_hdr, IH_TYPE_RAMDISK)) {
printf ("No Linux i386 Ramdisk Image\n"); printf ("No Linux i386 Ramdisk Image\n");
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
} }
@ -86,42 +82,30 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
/* /*
* Now check if we have a multifile image * Now check if we have a multifile image
*/ */
} else if (image_check_type (hdr, IH_TYPE_MULTI) && (len_ptr[1])) { } else if (image_check_type (hdr, IH_TYPE_MULTI)) {
ulong tail = image_to_cpu (len_ptr[0]) % 4; /*
int i; * Get second entry data start address and len
*/
/* skip kernel length and terminator */ image_multi_getimg (hdr, 1, &rd_data, &rd_len);
data = (ulong)(&len_ptr[2]);
/* skip any additional image length fields */
for (i=1; len_ptr[i]; ++i)
data += 4;
/* add kernel length, and align */
data += image_to_cpu (len_ptr[0]);
if (tail) {
data += 4 - tail;
}
len = image_to_cpu (len_ptr[1]);
} else { } else {
/* /*
* no initrd image * no initrd image
*/ */
data = 0; rd_data = rd_len = 0;
} }
#ifdef DEBUG #ifdef DEBUG
if (!data) { if (!rd_data) {
printf ("No initrd\n"); printf ("No initrd\n");
} }
#endif #endif
if (data) { if (rd_data) {
initrd_start = data; initrd_start = rd_data;
initrd_end = initrd_start + len; initrd_end = initrd_start + rd_len;
printf (" Loading Ramdisk to %08lx, end %08lx ... ", printf (" Loading Ramdisk to %08lx, end %08lx ... ",
initrd_start, initrd_end); initrd_start, initrd_end);
memmove ((void *)initrd_start, (void *)data, len); memmove ((void *)initrd_start, (void *)rd_data, rd_len);
printf ("OK\n"); printf ("OK\n");
} else { } else {
initrd_start = 0; initrd_start = 0;
@ -129,14 +113,15 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
} }
/* if multi-part image, we need to advance base ptr */ /* if multi-part image, we need to advance base ptr */
if (image_check_type (&header, IH_TYPE_MULTI) && (len_ptr[1])) { if (image_check_type (hdr, IH_TYPE_MULTI)) {
int i; image_multi_getimg (hdr, 0, &os_data, &os_len);
for (i=0, addr+=sizeof(int); len_ptr[i++]; addr+=sizeof(int)); } else {
os_data = image_get_data (hdr);
os_len = image_get_data_size (hdr);
} }
base_ptr = load_zimage ((void*)addr + image_get_header_size (), base_ptr = load_zimage ((void*)os_data, os_len,
image_get_data_size (&header), initrd_start, rd_len, 0);
initrd_start, initrd_end-initrd_start, 0);
if (NULL == base_ptr) { if (NULL == base_ptr) {
printf ("## Kernel loading failed ...\n"); printf ("## Kernel loading failed ...\n");

@ -44,26 +44,25 @@ DECLARE_GLOBAL_DATA_PTR;
# define SHOW_BOOT_PROGRESS(arg) # define SHOW_BOOT_PROGRESS(arg)
#endif #endif
extern image_header_t header;
int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, void do_bootm_linux(cmd_tbl_t * cmdtp, int flag,
int argc, char *argv[], int argc, char *argv[],
ulong addr, ulong * len_ptr, int verify) image_header_t *hdr, int verify)
{ {
ulong sp; ulong sp;
ulong len;
ulong initrd_start, initrd_end; ulong rd_data, rd_len;
ulong cmd_start, cmd_end;
ulong initrd_high; ulong initrd_high;
ulong data; ulong initrd_start, initrd_end;
image_header_t *rd_hdr;
int initrd_copy_to_ram = 1; int initrd_copy_to_ram = 1;
ulong cmd_start, cmd_end;
char *cmdline; char *cmdline;
char *s; char *s;
bd_t *kbd; bd_t *kbd;
void (*kernel) (bd_t *, ulong, ulong, ulong, ulong); void (*kernel) (bd_t *, ulong, ulong, ulong, ulong);
image_header_t *hdr = &header;
if ((s = getenv("initrd_high")) != NULL) { if ((s = getenv("initrd_high")) != NULL) {
/* a value of "no" or a similar string will act like 0, /* a value of "no" or a similar string will act like 0,
@ -141,18 +140,16 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag,
debug("Not skipping initrd\n"); debug("Not skipping initrd\n");
SHOW_BOOT_PROGRESS(9); SHOW_BOOT_PROGRESS(9);
addr = simple_strtoul(argv[2], NULL, 16); rd_hdr = (image_header_t *)simple_strtoul (argv[2], NULL, 16);
hdr = (image_header_t *)addr; printf ("## Loading RAMDisk Image at %08lx ...\n", rd_hdr);
printf("## Loading RAMDisk Image at %08lx ...\n", addr); if (!image_check_magic (rd_hdr)) {
if (!image_check_magic (hdr)) {
puts("Bad Magic Number\n"); puts("Bad Magic Number\n");
SHOW_BOOT_PROGRESS(-10); SHOW_BOOT_PROGRESS(-10);
do_reset(cmdtp, flag, argc, argv); do_reset(cmdtp, flag, argc, argv);
} }
if (!image_check_hcrc (hdr)) { if (!image_check_hcrc (rd_hdr)) {
puts("Bad Header Checksum\n"); puts("Bad Header Checksum\n");
SHOW_BOOT_PROGRESS(-11); SHOW_BOOT_PROGRESS(-11);
do_reset(cmdtp, flag, argc, argv); do_reset(cmdtp, flag, argc, argv);
@ -160,14 +157,14 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag,
SHOW_BOOT_PROGRESS(10); SHOW_BOOT_PROGRESS(10);
print_image_hdr (hdr); print_image_hdr (rd_hdr);
data = image_get_data (hdr); rd_data = image_get_data (rd_hdr);
len = image_get_data_size (hdr); rd_len = image_get_data_size (rd_hdr);
if (verify) { if (verify) {
puts(" Verifying Checksum ... "); puts(" Verifying Checksum ... ");
if (!image_check_dcrc_wd (hdr, CHUNKSZ)) { if (!image_check_dcrc_wd (rd_hdr, CHUNKSZ)) {
puts("Bad Data CRC\n"); puts("Bad Data CRC\n");
SHOW_BOOT_PROGRESS(-12); SHOW_BOOT_PROGRESS(-12);
do_reset(cmdtp, flag, argc, argv); do_reset(cmdtp, flag, argc, argv);
@ -177,9 +174,9 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag,
SHOW_BOOT_PROGRESS(11); SHOW_BOOT_PROGRESS(11);
if (!image_check_os (hdr, IH_OS_LINUX) || if (!image_check_os (rd_hdr, IH_OS_LINUX) ||
!image_check_arch (hdr, IH_ARCH_M68K) || !image_check_arch (rd_hdr, IH_ARCH_M68K) ||
!image_check_type (hdr, IH_TYPE_RAMDISK)) { !image_check_type (rd_hdr, IH_TYPE_RAMDISK)) {
puts("No Linux ColdFire Ramdisk Image\n"); puts("No Linux ColdFire Ramdisk Image\n");
SHOW_BOOT_PROGRESS(-13); SHOW_BOOT_PROGRESS(-13);
do_reset(cmdtp, flag, argc, argv); do_reset(cmdtp, flag, argc, argv);
@ -188,44 +185,31 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag,
/* /*
* Now check if we have a multifile image * Now check if we have a multifile image
*/ */
} else if (image_check_type (hdr, IH_TYPE_MULTI) && (len_ptr[1])) { } else if (image_check_type (hdr, IH_TYPE_MULTI)) {
u_long tail = image_to_cpu (len_ptr[0]) % 4; /*
int i; * Get second entry data start address and len
*/
SHOW_BOOT_PROGRESS(13); SHOW_BOOT_PROGRESS (13);
image_multi_getimg (hdr, 1, &rd_data, &rd_len);
/* skip kernel length and terminator */
data = (ulong) (&len_ptr[2]);
/* skip any additional image length fields */
for (i = 1; len_ptr[i]; ++i)
data += 4;
/* add kernel length, and align */
data += image_to_cpu (len_ptr[0]);
if (tail) {
data += 4 - tail;
}
len = image_to_cpu (len_ptr[1]);
} else { } else {
/* /*
* no initrd image * no initrd image
*/ */
SHOW_BOOT_PROGRESS(14); SHOW_BOOT_PROGRESS(14);
len = data = 0; rd_len = rd_data = 0;
} }
if (!data) { if (!rd_data) {
debug("No initrd\n"); debug("No initrd\n");
} }
if (data) { if (rd_data) {
if (!initrd_copy_to_ram) { /* zero-copy ramdisk support */ if (!initrd_copy_to_ram) { /* zero-copy ramdisk support */
initrd_start = data; initrd_start = rd_data;
initrd_end = initrd_start + len; initrd_end = initrd_start + rd_len;
} else { } else {
initrd_start = (ulong) kbd - len; initrd_start = (ulong) kbd - rd_len;
initrd_start &= ~(4096 - 1); /* align on page */ initrd_start &= ~(4096 - 1); /* align on page */
if (initrd_high) { if (initrd_high) {
@ -250,7 +234,7 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag,
if (nsp > initrd_high) /* limit as specified */ if (nsp > initrd_high) /* limit as specified */
nsp = initrd_high; nsp = initrd_high;
nsp -= len; nsp -= rd_len;
nsp &= ~(4096 - 1); /* align on page */ nsp &= ~(4096 - 1); /* align on page */
if (nsp >= sp) if (nsp >= sp)
@ -261,14 +245,14 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag,
debug debug
("## initrd at 0x%08lX ... 0x%08lX (len=%ld=0x%lX)\n", ("## initrd at 0x%08lX ... 0x%08lX (len=%ld=0x%lX)\n",
data, data + len - 1, len, len); rd_data, rd_data + rd_len - 1, rd_len, rd_len);
initrd_end = initrd_start + len; initrd_end = initrd_start + rd_len;
printf(" Loading Ramdisk to %08lx, end %08lx ... ", printf(" Loading Ramdisk to %08lx, end %08lx ... ",
initrd_start, initrd_end); initrd_start, initrd_end);
memmove_wd((void *)initrd_start, memmove_wd((void *)initrd_start,
(void *)data, len, CHUNKSZ); (void *)rd_data, rd_len, CHUNKSZ);
puts("OK\n"); puts("OK\n");
} }

@ -32,21 +32,21 @@
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
extern image_header_t header; /* from cmd_bootm.c */
/*cmd_boot.c*/
extern int do_reset (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]); 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[], void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
ulong addr, ulong * len_ptr, int verify) image_header_t *hdr, int verify)
{ {
ulong len = 0, checksum; int i;
ulong checksum;
ulong rd_data, rd_len;
ulong initrd_start, initrd_end; ulong initrd_start, initrd_end;
ulong data; image_header_t *rd_hdr;
/* First parameter is mapped to $r5 for kernel boot args */ /* First parameter is mapped to $r5 for kernel boot args */
void (*theKernel) (char *); void (*theKernel) (char *);
image_header_t *hdr = &header;
char *commandline = getenv ("bootargs"); char *commandline = getenv ("bootargs");
int i;
theKernel = (void (*)(char *))image_get_ep (hdr); theKernel = (void (*)(char *))image_get_ep (hdr);
@ -54,33 +54,30 @@ void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
if (argc >= 3) { if (argc >= 3) {
show_boot_progress (9); show_boot_progress (9);
addr = simple_strtoul (argv[2], NULL, 16); rd_hdr = (image_header_t *)simple_strtoul (argv[2], NULL, 16);
hdr = (image_header_t *)addr; printf ("## Loading Ramdisk Image at %08lx ...\n", rd_hdr);
printf ("## Loading Ramdisk Image at %08lx ...\n", addr); if (!image_check_magic (rd_hdr)) {
if (!image_check_magic (hdr)) {
printf ("Bad Magic Number\n"); printf ("Bad Magic Number\n");
show_boot_progress (-10); show_boot_progress (-10);
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
} }
if (!image_check_magic (hdr)) { if (!image_check_magic (rd_hdr)) {
printf ("Bad Header Checksum\n"); printf ("Bad Header Checksum\n");
show_boot_progress (-11); show_boot_progress (-11);
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
} }
show_boot_progress (10); show_boot_progress (10);
print_image_hdr (rd_hdr);
print_image_hdr (hdr); rd_data = image_get_data (rd_hdr);
rd_en = image_get_data_size (rd_hdr);
data = image_get_data (hdr);
len = image_get_data_size (hdr);
if (verify) { if (verify) {
printf (" Verifying Checksum ... "); printf (" Verifying Checksum ... ");
if (!image_check_dcrc (hdr)) { if (!image_check_dcrc (rd_hdr)) {
printf ("Bad Data CRC\n"); printf ("Bad Data CRC\n");
show_boot_progress (-12); show_boot_progress (-12);
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
@ -90,9 +87,9 @@ void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
show_boot_progress (11); show_boot_progress (11);
if (!image_check_os (hdr, IH_OS_LINUX) || if (!image_check_os (rd_hdr, IH_OS_LINUX) ||
!image_check_arch (hdr, IH_ARCH_MICROBLAZE) || !image_check_arch (rd_hdr, IH_ARCH_MICROBLAZE) ||
!image_check_type (hdr, IH_TYPE_RAMDISK)) { !image_check_type (rd_hdr, IH_TYPE_RAMDISK)) {
printf ("No Linux Microblaze Ramdisk Image\n"); printf ("No Linux Microblaze Ramdisk Image\n");
show_boot_progress (-13); show_boot_progress (-13);
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
@ -101,42 +98,30 @@ void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
/* /*
* Now check if we have a multifile image * Now check if we have a multifile image
*/ */
} else if (image_check_type (hdr, IH_TYPE_MULTI) && (len_ptr[1])) { } else if (image_check_type (hdr, IH_TYPE_MULTI)) {
ulong tail = image_to_cpu (len_ptr[0]) % 4; /*
* Get second entry data start address and len
*/
show_boot_progress (13); show_boot_progress (13);
image_multi_getimg (hdr, 1, &rd_data, &rd_len);
/* skip kernel length and terminator */
data = (ulong) (&len_ptr[2]);
/* skip any additional image length fields */
for (i = 1; len_ptr[i]; ++i)
data += 4;
/* add kernel length, and align */
data += image_to_cpu (len_ptr[0]);
if (tail) {
data += 4 - tail;
}
len = image_to_cpu (len_ptr[1]);
} else { } else {
/* /*
* no initrd image * no initrd image
*/ */
show_boot_progress (14); show_boot_progress (14);
data = 0; rd_data = rd_len = 0;
} }
#ifdef DEBUG #ifdef DEBUG
if (!data) { if (!rd_data) {
printf ("No initrd\n"); printf ("No initrd\n");
} }
#endif #endif
if (data) { if (rd_data) {
initrd_start = data; initrd_start = rd_data;
initrd_end = initrd_start + len; initrd_end = initrd_start + rd_len;
} else { } else {
initrd_start = 0; initrd_start = 0;
initrd_end = 0; initrd_end = 0;

@ -33,8 +33,6 @@ DECLARE_GLOBAL_DATA_PTR;
#define LINUX_MAX_ENVS 256 #define LINUX_MAX_ENVS 256
#define LINUX_MAX_ARGS 256 #define LINUX_MAX_ARGS 256
extern image_header_t header; /* from cmd_bootm.c */
extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
static int linux_argc; static int linux_argc;
@ -49,13 +47,13 @@ static void linux_env_set (char * env_name, char * env_val);
void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[], void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
ulong addr, ulong * len_ptr, int verify) image_header_t *hdr, int verify)
{ {
ulong len = 0; ulong rd_data, rd_len;
ulong initrd_start, initrd_end; ulong initrd_start, initrd_end;
ulong data; image_header_t *rd_hdr;
void (*theKernel) (int, char **, char **, int *); void (*theKernel) (int, char **, char **, int *);
image_header_t *hdr = &header;
char *commandline = getenv ("bootargs"); char *commandline = getenv ("bootargs");
char env_buf[12]; char env_buf[12];
@ -68,33 +66,30 @@ void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
if (argc >= 3) { if (argc >= 3) {
show_boot_progress (9); show_boot_progress (9);
addr = simple_strtoul (argv[2], NULL, 16); rd_hdr = (image_header_t *)simple_strtoul (argv[2], NULL, 16);
hdr = (image_header_t *)addr; printf ("## Loading Ramdisk Image at %08lx ...\n", rd_hdr);
printf ("## Loading Ramdisk Image at %08lx ...\n", addr);
if (!image_check_magic (hdr)) { if (!image_check_magic (rd_hdr)) {
printf ("Bad Magic Number\n"); printf ("Bad Magic Number\n");
show_boot_progress (-10); show_boot_progress (-10);
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
} }
if (!image_check_hcrc (hdr)) { if (!image_check_hcrc (rd_hdr)) {
printf ("Bad Header Checksum\n"); printf ("Bad Header Checksum\n");
show_boot_progress (-11); show_boot_progress (-11);
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
} }
show_boot_progress (10); show_boot_progress (10);
print_image_hdr (rd_hdr);
print_image_hdr (hdr); rd_data = image_get_data (rd_hdr);
rd_len = image_get_data_size (rd_hdr);
data = image_get_data (hdr);
len = image_get_data_size (hdr);
if (verify) { if (verify) {
printf (" Verifying Checksum ... "); printf (" Verifying Checksum ... ");
if (!image_check_dcrc (hdr)) { if (!image_check_dcrc (rd_hdr)) {
printf ("Bad Data CRC\n"); printf ("Bad Data CRC\n");
show_boot_progress (-12); show_boot_progress (-12);
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
@ -104,9 +99,9 @@ void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
show_boot_progress (11); show_boot_progress (11);
if (!image_check_os (hdr, IH_OS_LINUX) || if (!image_check_os (rd_hdr, IH_OS_LINUX) ||
!image_check_arch (hdr, IH_ARCH_MIPS) || !image_check_arch (rd_hdr, IH_ARCH_MIPS) ||
!image_check_type (hdr, IH_TYPE_RAMDISK)) { !image_check_type (rd_hdr, IH_TYPE_RAMDISK)) {
printf ("No Linux MIPS Ramdisk Image\n"); printf ("No Linux MIPS Ramdisk Image\n");
show_boot_progress (-13); show_boot_progress (-13);
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
@ -115,43 +110,30 @@ void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
/* /*
* Now check if we have a multifile image * Now check if we have a multifile image
*/ */
} else if (image_check_type (hdr, IH_TYPE_MULTI) && (len_ptr[1])) { } else if (image_check_type (hdr, IH_TYPE_MULTI)) {
ulong tail = image_to_cpu (len_ptr[0]) % 4; /*
int i; * Get second entry data start address and len
*/
show_boot_progress (13); show_boot_progress (13);
image_multi_getimg (hdr, 1, &rd_data, &rd_len);
/* skip kernel length and terminator */
data = (ulong) (&len_ptr[2]);
/* skip any additional image length fields */
for (i = 1; len_ptr[i]; ++i)
data += 4;
/* add kernel length, and align */
data += image_to_cpu (len_ptr[0]);
if (tail) {
data += 4 - tail;
}
len = image_to_cpu (len_ptr[1]);
} else { } else {
/* /*
* no initrd image * no initrd image
*/ */
show_boot_progress (14); show_boot_progress (14);
data = 0; rd_data = rd_len = 0;
} }
#ifdef DEBUG #ifdef DEBUG
if (!data) { if (!rd_data) {
printf ("No initrd\n"); printf ("No initrd\n");
} }
#endif #endif
if (data) { if (rd_data) {
initrd_start = data; initrd_start = rd_data;
initrd_end = initrd_start + len; initrd_end = initrd_start + rd_len;
} else { } else {
initrd_start = 0; initrd_start = 0;
initrd_end = 0; initrd_end = 0;

@ -29,6 +29,6 @@
* *
*/ */
void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
ulong addr, ulong *len_ptr, int verify) image__header_t *hdr, int verify)
{ {
} }

@ -25,12 +25,9 @@
#include <command.h> #include <command.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>
extern image_header_t header; /* common/cmd_bootm.c */
void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
ulong addr, ulong *len_ptr, int verify) image_header_t *hdr, int verify)
{ {
image_header_t *hdr = &header;
void (*kernel)(void) = (void (*)(void))image_get_ep (hdr); void (*kernel)(void) = (void (*)(void))image_get_ep (hdr);
/* For now we assume the Microtronix linux ... which only /* For now we assume the Microtronix linux ... which only

@ -50,9 +50,7 @@
#endif #endif
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
extern image_header_t header;
/*cmd_boot.c*/
extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
#if defined(CONFIG_CMD_BDI) #if defined(CONFIG_CMD_BDI)
@ -60,25 +58,27 @@ extern int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
#endif #endif
void __attribute__((noinline)) void __attribute__((noinline))
do_bootm_linux (cmd_tbl_t *cmdtp, int flag, do_bootm_linux(cmd_tbl_t *cmdtp, int flag,
int argc, char *argv[], int argc, char *argv[],
ulong addr, image_header_t *hdr,
ulong *len_ptr,
int verify) int verify)
{ {
ulong sp;
ulong len;
ulong initrd_start, initrd_end;
ulong cmd_start, cmd_end;
ulong initrd_high; ulong initrd_high;
ulong data;
int initrd_copy_to_ram = 1; int initrd_copy_to_ram = 1;
ulong initrd_start, initrd_end;
ulong rd_data, rd_len;
image_header_t *rd_hdr;
ulong cmd_start, cmd_end;
char *cmdline; char *cmdline;
ulong sp;
char *s; char *s;
bd_t *kbd; bd_t *kbd;
void (*kernel)(bd_t *, ulong, ulong, ulong, ulong); void (*kernel)(bd_t *, ulong, ulong, ulong, ulong);
image_header_t *hdr = &header;
#if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT) #if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT)
image_header_t *fdt_hdr;
char *of_flat_tree = NULL; char *of_flat_tree = NULL;
ulong of_data = 0; ulong of_data = 0;
#endif #endif
@ -177,7 +177,7 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
/* Look for a '-' which indicates to ignore the ramdisk argument */ /* Look for a '-' which indicates to ignore the ramdisk argument */
if (argc >= 3 && strcmp(argv[2], "-") == 0) { if (argc >= 3 && strcmp(argv[2], "-") == 0) {
debug ("Skipping initrd\n"); debug ("Skipping initrd\n");
len = data = 0; rd_len = rd_data = 0;
} }
else else
#endif #endif
@ -185,30 +185,28 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
debug ("Not skipping initrd\n"); debug ("Not skipping initrd\n");
show_boot_progress (9); show_boot_progress (9);
addr = simple_strtoul(argv[2], NULL, 16); rd_hdr = (image_header_t *)simple_strtoul (argv[2], NULL, 16);
printf ("## Loading RAMDisk Image at %08lx ...\n", (ulong)rd_hdr);
printf ("## Loading RAMDisk Image at %08lx ...\n", addr); if (!image_check_magic (rd_hdr)) {
hdr = (image_header_t *)addr;
if (!image_check_magic (hdr)) {
puts ("Bad Magic Number\n"); puts ("Bad Magic Number\n");
show_boot_progress (-10); show_boot_progress (-10);
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
} }
if (!image_check_hcrc (hdr)) { if (!image_check_hcrc (rd_hdr)) {
puts ("Bad Header Checksum\n"); puts ("Bad Header Checksum\n");
show_boot_progress (-11); show_boot_progress (-11);
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
} }
show_boot_progress (10); show_boot_progress (10);
print_image_hdr (hdr); print_image_hdr (rd_hdr);
if (verify) { if (verify) {
puts (" Verifying Checksum ... "); puts (" Verifying Checksum ... ");
if (!image_check_dcrc_wd (hdr, CHUNKSZ)) { if (!image_check_dcrc_wd (rd_hdr, CHUNKSZ)) {
puts ("Bad Data CRC\n"); puts ("Bad Data CRC\n");
show_boot_progress (-12); show_boot_progress (-12);
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
@ -218,52 +216,39 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
show_boot_progress (11); show_boot_progress (11);
if (!image_check_os (hdr, IH_OS_LINUX) || if (!image_check_os (rd_hdr, IH_OS_LINUX) ||
!image_check_arch (hdr, IH_ARCH_PPC) || !image_check_arch (rd_hdr, IH_ARCH_PPC) ||
!image_check_type (hdr, IH_TYPE_RAMDISK)) { !image_check_type (rd_hdr, IH_TYPE_RAMDISK)) {
puts ("No Linux PPC Ramdisk Image\n"); puts ("No Linux PPC Ramdisk Image\n");
show_boot_progress (-13); show_boot_progress (-13);
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
} }
data = image_get_data (hdr); rd_data = image_get_data (rd_hdr);
len = image_get_data_size (hdr); rd_len = image_get_data_size (rd_hdr);
/* /*
* Now check if we have a multifile image * Now check if we have a multifile image
*/ */
} else if (image_check_type (hdr, IH_TYPE_MULTI) && (len_ptr[1])) { } else if (image_check_type (hdr, IH_TYPE_MULTI)) {
u_long tail = image_to_cpu (len_ptr[0]) % 4; /*
int i; * Get second entry data start address and len
*/
image_multi_getimg (hdr, 1, &rd_data, &rd_len);
show_boot_progress (13); show_boot_progress (13);
/* skip kernel length and terminator */
data = (ulong)(&len_ptr[2]);
/* skip any additional image length fields */
for (i=1; len_ptr[i]; ++i)
data += 4;
/* add kernel length, and align */
data += image_to_cpu (len_ptr[0]);
if (tail) {
data += 4 - tail;
}
len = image_to_cpu (len_ptr[1]);
} else { } else {
/* /*
* no initrd image * No initrd image
*/ */
show_boot_progress (14); show_boot_progress (14);
len = data = 0; rd_len = rd_data = 0;
} }
#if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT) #if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT)
if(argc > 3) { if(argc > 3) {
of_flat_tree = (char *) simple_strtoul(argv[3], NULL, 16); of_flat_tree = (char *) simple_strtoul(argv[3], NULL, 16);
hdr = (image_header_t *)of_flat_tree; fdt_hdr = (image_header_t *)of_flat_tree;
#if defined(CONFIG_OF_FLAT_TREE) #if defined(CONFIG_OF_FLAT_TREE)
if (*((ulong *)(of_flat_tree)) == OF_DT_HEADER) { if (*((ulong *)(of_flat_tree)) == OF_DT_HEADER) {
#elif defined(CONFIG_OF_LIBFDT) #elif defined(CONFIG_OF_LIBFDT)
@ -273,37 +258,37 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
if (addr2info((ulong)of_flat_tree) != NULL) if (addr2info((ulong)of_flat_tree) != NULL)
of_data = (ulong)of_flat_tree; of_data = (ulong)of_flat_tree;
#endif #endif
} else if (image_check_magic (hdr)) { } else if (image_check_magic (fdt_hdr)) {
printf("## Flat Device Tree at %08lX\n", hdr); printf ("## Flat Device Tree at %08lX\n", fdt_hdr);
print_image_hdr (hdr); print_image_hdr (fdt_hdr);
if ((image_get_load (hdr) < ((unsigned long)hdr + image_get_image_size (hdr))) && if ((image_get_load (fdt_hdr) < image_get_image_end (fdt_hdr)) &&
((image_get_load (hdr) + image_get_data_size (hdr)) > (unsigned long)hdr)) { ((image_get_load (fdt_hdr) + image_get_data_size (fdt_hdr)) > (unsigned long)fdt_hdr)) {
puts ("ERROR: fdt overwritten - " puts ("ERROR: fdt overwritten - "
"must RESET the board to recover.\n"); "must RESET the board to recover.\n");
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
} }
puts (" Verifying Checksum ... "); puts (" Verifying Checksum ... ");
if (!image_check_hcrc (hdr)) { if (!image_check_hcrc (fdt_hdr)) {
puts ("ERROR: fdt header checksum invalid - " puts ("ERROR: fdt header checksum invalid - "
"must RESET the board to recover.\n"); "must RESET the board to recover.\n");
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
} }
if (!image_check_dcrc (hdr)) { if (!image_check_dcrc (fdt_hdr)) {
puts ("ERROR: fdt checksum invalid - " puts ("ERROR: fdt checksum invalid - "
"must RESET the board to recover.\n"); "must RESET the board to recover.\n");
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
} }
puts ("OK\n"); puts ("OK\n");
if (!image_check_type (hdr, IH_TYPE_FLATDT)) { if (!image_check_type (fdt_hdr, IH_TYPE_FLATDT)) {
puts ("ERROR: uImage is not a fdt - " puts ("ERROR: uImage is not a fdt - "
"must RESET the board to recover.\n"); "must RESET the board to recover.\n");
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
} }
if (image_get_comp (hdr) != IH_COMP_NONE) { if (image_get_comp (fdt_hdr) != IH_COMP_NONE) {
puts ("ERROR: uImage is compressed - " puts ("ERROR: uImage is compressed - "
"must RESET the board to recover.\n"); "must RESET the board to recover.\n");
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
@ -318,11 +303,11 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
} }
memmove ((void *)image_get_load (hdr), memmove ((void *)image_get_load (fdt_hdr),
(void *)(of_flat_tree + image_get_header_size ()), (void *)(of_flat_tree + image_get_header_size ()),
image_get_data_size (hdr)); image_get_data_size (fdt_hdr));
of_flat_tree = (char *)image_get_load (hdr); of_flat_tree = (char *)image_get_load (fdt_hdr);
} else { } else {
puts ("Did not find a flat Flat Device Tree.\n" puts ("Did not find a flat Flat Device Tree.\n"
"Must RESET the board to recover.\n"); "Must RESET the board to recover.\n");
@ -330,68 +315,52 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
} }
printf (" Booting using the fdt at 0x%x\n", printf (" Booting using the fdt at 0x%x\n",
of_flat_tree); of_flat_tree);
} else if (image_check_type (hdr, IH_TYPE_MULTI) && (len_ptr[1]) && (len_ptr[2])) { } else if (image_check_type (hdr, IH_TYPE_MULTI)) {
u_long tail = image_to_cpu (len_ptr[0]) % 4; ulong fdt_data, fdt_len;
int i;
/* skip kernel length, initrd length, and terminator */
of_flat_tree = (char *)(&len_ptr[3]);
/* skip any additional image length fields */
for (i=2; len_ptr[i]; ++i)
of_flat_tree += 4;
/* add kernel length, and align */
of_flat_tree += image_to_cpu (len_ptr[0]);
if (tail) {
of_flat_tree += 4 - tail;
}
/* add initrd length, and align */ image_multi_getimg (hdr, 2, &fdt_data, &fdt_len);
tail = image_to_cpu (len_ptr[1]) % 4; if (fdt_len) {
of_flat_tree += image_to_cpu (len_ptr[1]);
if (tail) { of_flat_tree = (char *)fdt_data;
of_flat_tree += 4 - tail;
}
#ifndef CFG_NO_FLASH #ifndef CFG_NO_FLASH
/* move the blob if it is in flash (set of_data to !null) */ /* move the blob if it is in flash (set of_data to !null) */
if (addr2info ((ulong)of_flat_tree) != NULL) if (addr2info ((ulong)of_flat_tree) != NULL)
of_data = (ulong)of_flat_tree; of_data = (ulong)of_flat_tree;
#endif #endif
#if defined(CONFIG_OF_FLAT_TREE) #if defined(CONFIG_OF_FLAT_TREE)
if (*((ulong *)(of_flat_tree)) != OF_DT_HEADER) { if (*((ulong *)(of_flat_tree)) != OF_DT_HEADER) {
#elif defined(CONFIG_OF_LIBFDT) #elif defined(CONFIG_OF_LIBFDT)
if (fdt_check_header (of_flat_tree) != 0) { if (fdt_check_header (of_flat_tree) != 0) {
#endif #endif
puts ("ERROR: image is not a fdt - " puts ("ERROR: image is not a fdt - "
"must RESET the board to recover.\n"); "must RESET the board to recover.\n");
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
} }
#if defined(CONFIG_OF_FLAT_TREE) #if defined(CONFIG_OF_FLAT_TREE)
if (((struct boot_param_header *)of_flat_tree)->totalsize != if (((struct boot_param_header *)of_flat_tree)->totalsize != fdt_len) {
image_to_cpu (len_ptr[2])) {
#elif defined(CONFIG_OF_LIBFDT) #elif defined(CONFIG_OF_LIBFDT)
if (be32_to_cpu (fdt_totalsize (of_flat_tree)) != if (be32_to_cpu (fdt_totalsize (of_flat_tree)) != fdt_len) {
image_to_cpu (len_ptr[2])) {
#endif #endif
puts ("ERROR: fdt size != image size - " puts ("ERROR: fdt size != image size - "
"must RESET the board to recover.\n"); "must RESET the board to recover.\n");
do_reset (cmdtp, flag, argc, argv); do_reset (cmdtp, flag, argc, argv);
}
} }
} }
#endif #endif
if (!data) { if (!rd_data) {
debug ("No initrd\n"); debug ("No initrd\n");
} }
if (data) { if (rd_data) {
if (!initrd_copy_to_ram) { /* zero-copy ramdisk support */ if (!initrd_copy_to_ram) { /* zero-copy ramdisk support */
initrd_start = data; initrd_start = rd_data;
initrd_end = initrd_start + len; initrd_end = initrd_start + rd_len;
} else { } else {
initrd_start = (ulong)kbd - len; initrd_start = (ulong)kbd - rd_len;
initrd_start &= ~(4096 - 1); /* align on page */ initrd_start &= ~(4096 - 1); /* align on page */
if (initrd_high) { if (initrd_high) {
@ -412,7 +381,7 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
nsp &= ~0xF; nsp &= ~0xF;
if (nsp > initrd_high) /* limit as specified */ if (nsp > initrd_high) /* limit as specified */
nsp = initrd_high; nsp = initrd_high;
nsp -= len; nsp -= rd_len;
nsp &= ~(4096 - 1); /* align on page */ nsp &= ~(4096 - 1); /* align on page */
if (nsp >= sp) if (nsp >= sp)
initrd_start = nsp; initrd_start = nsp;
@ -421,14 +390,14 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
show_boot_progress (12); show_boot_progress (12);
debug ("## initrd at 0x%08lX ... 0x%08lX (len=%ld=0x%lX)\n", debug ("## initrd at 0x%08lX ... 0x%08lX (len=%ld=0x%lX)\n",
data, data + len - 1, len, len); rd_data, rd_data + rd_len - 1, rd_len, rd_len);
initrd_end = initrd_start + len; initrd_end = initrd_start + rd_len;
printf (" Loading Ramdisk to %08lx, end %08lx ... ", printf (" Loading Ramdisk to %08lx, end %08lx ... ",
initrd_start, initrd_end); initrd_start, initrd_end);
memmove_wd((void *)initrd_start, memmove_wd((void *)initrd_start,
(void *)data, len, CHUNKSZ); (void *)rd_data, rd_len, CHUNKSZ);
puts ("OK\n"); puts ("OK\n");
} }

Loading…
Cancel
Save