From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1L2CKP-0001nQ-ND for qemu-devel@nongnu.org; Mon, 17 Nov 2008 17:12:17 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1L2CKN-0001mo-PM for qemu-devel@nongnu.org; Mon, 17 Nov 2008 17:12:17 -0500 Received: from [199.232.76.173] (port=33076 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1L2CKN-0001mk-MM for qemu-devel@nongnu.org; Mon, 17 Nov 2008 17:12:15 -0500 Received: from 42.mail-out.ovh.net ([213.251.189.42]:52190) by monty-python.gnu.org with smtp (Exim 4.60) (envelope-from ) id 1L2CKN-0005SQ-8p for qemu-devel@nongnu.org; Mon, 17 Nov 2008 17:12:15 -0500 Date: Mon, 17 Nov 2008 23:07:09 +0100 From: Jean-Christophe PLAGNIOL-VILLARD Subject: Re: [Qemu-devel] [PATCH 2/4] uImage: implement gzip support Message-ID: <20081117220709.GA20874@game.jcrosoft.org> References: <09739678475eecbf3d9de512bf1dd13d07bd6642.1226955410.git.hollisb@us.ibm.com> <9d5d305c23980946944437d1116f3f83430b40e2.1226955410.git.hollisb@us.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <9d5d305c23980946944437d1116f3f83430b40e2.1226955410.git.hollisb@us.ibm.com> Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org On 15:18 Mon 17 Nov , Hollis Blanchard wrote: > Based on gzip uImage loading code from u-boot. > > Signed-off-by: Jerone Young > Signed-off-by: Hollis Blanchard > --- > loader.c | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- > 1 files changed, 106 insertions(+), 4 deletions(-) > > diff --git a/loader.c b/loader.c > index 7f4e69c..c9cb906 100644 > --- a/loader.c > +++ b/loader.c > @@ -26,6 +26,8 @@ > #include "sysemu.h" > #include "uboot_image.h" > > +#include > + > /* return the size or -1 if error */ > int get_image_size(const char *filename) > { > @@ -345,10 +347,93 @@ static void bswap_uboot_header(uboot_image_header_t *hdr) > #endif > } > > +/* gunzip functionality is derived from gunzip function > + * in uboot source code > + */ > + > +#define ZALLOC_ALIGNMENT 16 > + > +static void *zalloc(void *x, unsigned items, unsigned size) > +{ > + void *p; > + > + size *= items; > + size = (size + ZALLOC_ALIGNMENT - 1) & ~(ZALLOC_ALIGNMENT - 1); > + > + p = qemu_malloc(size); > + > + return (p); > +} > + > +static void zfree(void *x, void *addr, unsigned nb) > +{ > + qemu_free(addr); > +} > + > + > +#define HEAD_CRC 2 > +#define EXTRA_FIELD 4 > +#define ORIG_NAME 8 > +#define COMMENT 0x10 > +#define RESERVED 0xe0 > + > +#define DEFLATED 8 > + > +static ssize_t gunzip(void *dst, size_t dstlen, uint8_t *src, > + size_t srclen) > +{ > + z_stream s; > + ssize_t dstbytes; > + int r, i, flags; > + > + /* skip header */ > + i = 10; > + flags = src[3]; > + if (src[2] != DEFLATED || (flags & RESERVED) != 0) { > + puts ("Error: Bad gzipped data\n"); > + return -1; > + } > + if ((flags & EXTRA_FIELD) != 0) > + i = 12 + src[10] + (src[11] << 8); > + if ((flags & ORIG_NAME) != 0) > + while (src[i++] != 0) > + ; > + if ((flags & COMMENT) != 0) > + while (src[i++] != 0) > + ; > + if ((flags & HEAD_CRC) != 0) > + i += 2; > + if (i >= srclen) { > + puts ("Error: gunzip out of data in header\n"); > + return -1; > + } > + > + s.zalloc = zalloc; > + s.zfree = (free_func)zfree; > + > + r = inflateInit2(&s, -MAX_WBITS); > + if (r != Z_OK) { > + printf ("Error: inflateInit2() returned %d\n", r); > + return (-1); > + } > + s.next_in = src + i; > + s.avail_in = srclen - i; > + s.next_out = dst; > + s.avail_out = dstlen; > + r = inflate(&s, Z_FINISH); > + if (r != Z_OK && r != Z_STREAM_END) { > + printf ("Error: inflate() returned %d\n", r); > + return -1; > + } > + dstbytes = s.next_out - (unsigned char *) dst; > + inflateEnd(&s); > + > + return dstbytes; > +} > + > /* Load a U-Boot image. */ > int load_uboot(const char *filename, target_ulong *ep, int *is_linux) > { > - > int fd; > int size; > uboot_image_header_t h; > @@ -374,9 +459,9 @@ int load_uboot(const char *filename, target_ulong *ep, int *is_linux) > goto fail; > } > > - /* TODO: Implement compressed images. */ > - if (hdr->ih_comp != IH_COMP_NONE) { > - fprintf(stderr, "Unable to load compressed u-boot images\n"); > + /* TODO bzip2 support */ > + if (hdr->ih_comp == IH_COMP_BZIP2) { > + fprintf(stderr, "Unable to load bzip2 compressed u-boot images\n"); > goto fail; > } why do you remove the non compress mode? BTW Please note 2 thinks First this format of uImage is deprecated we have switch to a fdt uImage format Secondly we aslo support now LZMA compression Best Regards, J.