[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 2/4] uImage: implement gzip support
From: |
Hollis Blanchard |
Subject: |
[Qemu-devel] [PATCH 2/4] uImage: implement gzip support |
Date: |
Mon, 17 Nov 2008 15:18:10 -0600 |
Based on gzip uImage loading code from u-boot.
Signed-off-by: Jerone Young <address@hidden>
Signed-off-by: Hollis Blanchard <address@hidden>
---
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 <zlib.h>
+
/* 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;
}
@@ -398,6 +483,23 @@ int load_uboot(const char *filename, target_ulong *ep, int
*is_linux)
goto fail;
}
+ if (hdr->ih_comp == IH_COMP_GZIP) {
+ uint8_t *compressed_data;
+ size_t max_bytes = 2 * hdr->ih_size;
+ ssize_t bytes;
+
+ compressed_data = data;
+ data = qemu_malloc(max_bytes);
+
+ bytes = gunzip(data, max_bytes, compressed_data, hdr->ih_size);
+ qemu_free(compressed_data);
+ if (bytes < 0) {
+ fprintf(stderr, "Unable to decompress gzipped image!\n");
+ goto fail;
+ }
+ hdr->ih_size = bytes;
+ }
+
cpu_physical_memory_write_rom(hdr->ih_load, data, hdr->ih_size);
qemu_free(data);
--
1.5.6.5
- [Qemu-devel] improvements in uImage loading, Hollis Blanchard, 2008/11/17
- [Qemu-devel] [PATCH 1/4] uImage: free file data after copying into guest memory, Hollis Blanchard, 2008/11/17
- Re: [Qemu-devel] [PATCH 2/4] uImage: implement gzip support, Jean-Christophe PLAGNIOL-VILLARD, 2008/11/17
- Re: [Qemu-devel] [PATCH 2/4] uImage: implement gzip support, François Revol, 2008/11/17
- Re: [Qemu-devel] [PATCH 2/4] uImage: implement gzip support, Jean-Christophe PLAGNIOL-VILLARD, 2008/11/17
- Re: [Qemu-devel] [PATCH 2/4] uImage: implement gzip support, François Revol, 2008/11/17
- Re: [Qemu-devel] [PATCH 2/4] uImage: implement gzip support, Hollis Blanchard, 2008/11/17
- Re: [Qemu-devel] [PATCH 2/4] uImage: implement gzip support, Jean-Christophe PLAGNIOL-VILLARD, 2008/11/17