[U-Boot-Users] gunzip question about large uImages
Robin Getz
rgetz at blackfin.uclinux.org
Tue May 24 16:53:08 CEST 2005
Quick Question:
It looks to me that the max uncompressed image size is hard coded to 4Meg
(0x400000 bytes). Any thoughts why?
Long question:
We were having some problems booting large uImages (reported here ~ month
ago). It seemed as if the were not being decompressed properly. When we had
someone (Aubrey Li) dig into it he found/pointed out that in the latest
cvs, u-boot/common/cmd_bootm.c the function do_bootm defines what looks to
be a uncompressed max length as:
uint unc_len = 0x400000;
This is passed to gunzip if the image needs to be uncompressed.
--snip--
case IH_COMP_GZIP:
printf (" Uncompressing %s ... ", name);
if (gunzip ((void *)ntohl(hdr->ih_load), unc_len,
(uchar *)data, &len) != 0) {
puts ("GUNZIP ERROR - must RESET board to recover\n");
SHOW_BOOT_PROGRESS (-6);
do_reset (cmdtp, flag, argc, argv);
}
break;
--snip--
gunzip takes this as the second parameter and sets it to dstlen.
int gunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp)
This is passed to the inflation routine as
s.avail_out = dstlen;
where inflate from u-boot/lib_generic/zlib.c uses this to halt
decompression if the image size can not fit.
-- snip -- from int inflate(z, f) --
if (f == Z_PACKET_FLUSH && z->avail_in == 0 && z->avail_out != 0)
r = inflate_packet_flush(z->state->blocks);
--snip -- from local int inflate_flush(s, z, r)--
/* compute number of bytes to copy as far as end of window */
n = (uInt)((q <= s->write ? s->write : s->end) - q);
if (n > z->avail_out) n = z->avail_out;
if (n && r == Z_BUF_ERROR) r = Z_OK;
/* update counters */
z->avail_out -= n;
z->total_out += n;
--
When unc_len is increased - our problem goes away...
So: two questions:
- what is the best way to manage the size of unc_len? in
include/configs/platform.h? Or just make it really_really big?
- do you want a patch in u-boot/common/cmd_bootm.c/gunzip to check to see
if the image was completely decompressed? OR
- do you want a patch in u-boot/lib_generic/zlib.c to return an error if
it runs out of room?
Thanks
-Robin
More information about the U-Boot
mailing list