[U-Boot-Users] Question on do_bootm in cmd_bootm.c
Nick Barendt
nbarendt at vxitech.com
Fri Oct 22 02:08:25 CEST 2004
Can someone, maybe Wolfgang, comment on the maximum 4MB uncompressed size
of gunzip (and, possibly, bzip2) images?
I've been working on a Coldfire 5272 system for quite some time with
u-boot and uClinux. Both have been remarkably stable. We use the uClinux
default build wherein the root filesystem (romfs) is appended to the end of
the kernel image, starting where the bss would normally be. The kernel
startup code relocates the romfs image to just beyond the bss, then, and
everything runs smoothly. I know that many folks in the PPC world use
separate kernel and root filesystem images, for many good reasons, but many
(most?) of the uClinux platforms use this concatenated kernel+romfs image.
Recently, we've been adding more content to the root filesystem. As our
root filesystem grew larger (say about 3MB), however, we started seeing
boot problems where the kernel would boot fine but the root filesystem was
clearly corrupt. I've spent the better part of two days trying to track
down where things go wrong, from the kernel to u-boot. Of course, I used a
hardware debugger, looked at u-boot's memory assignments, image load
addresses, entry points, malloc areas, etc.
I just located the source of my trouble, a hard-coded 4MB maximum
uncompressed size in do_bootm:
int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
ulong iflag;
ulong addr;
ulong data, len, checksum;
ulong *len_ptr;
uint unc_len = 0x400000;
^^^^^^^^^
int i, verify;
SNIP
case IH_COMP_GZIP:
printf (" Uncompressing %s ... ", name);
if (gunzip ((void *)ntohl(hdr->ih_load), unc_len,
^^^^^^^^
(uchar *)data, (int *)&len) != 0) {
printf ("GUNZIP ERROR - must RESET board to recover\n");
SHOW_BOOT_PROGRESS (-6);
do_reset (cmdtp, flag, argc, argv);
}
break;
SNIP
Increasing unc_len to larger values (like 6MB) seems to solve my problem.
With an uncompressed image larger than 4MB, gunzip doesn't seem to
generate any errors (granted, I haven't stepped through gunzip and zlib),
but merrily runs along, although the data beyond the 4MB boundary seems to
be missing or corrupt. It looks like there's a truncation (about line 1875
in zlib.c) to z.avail_out in zlib that prevents data from being copied
beyond unc_len - maybe that should be an error instead of silently
truncating data? Just a thought. I'll into submitting a patch for that.
I was wondering if there was some reason for the 0x400000 magic number for
unc_len. Is that just a magic number? Is that larger than anyone uses for
images? I guess I'm a little surprised that this hasn't bitten anyone else
so far (nothing I could see on the mailing list archive, at least). Our
1MB kernel and 3MB romfs root filesystem might be exceptionally large, I
don't know.
Would there be any issues with making unc_len a CFG_ macro, if I submitted
a patch?
Nick Barendt
More information about the U-Boot
mailing list