From: Olivia Yin <hong-hua.yin@freescale.com> To: <kvm-ppc@vger.kernel.org>, <kvm@vger.kernel.org> Cc: Olivia Yin <hong-hua.yin@freescale.com> Subject: [PATCH 2/2] QEMU: register reset handlers to write images into memory Date: Mon, 13 Aug 2012 13:21:05 +0800 [thread overview] Message-ID: <1344835265-23499-2-git-send-email-hong-hua.yin@freescale.com> (raw) In-Reply-To: <1344835265-23499-1-git-send-email-hong-hua.yin@freescale.com> Instead of add rom blobs, this patch just write them directly to memory. This patch registers reset handler uimage_reset() and image_file_reset() which load images into RAM during initial bootup and VM reset. v3: Use file_load() to sanity check image file. Move cpu_physical_memory_rw() out from uimage_physical_loader() so as not to write uimage twice. v2: Clean initrd_physical_loader(). Use cpu_physical_memory_rw() to write images into physical memory. Signed-off-by: Olivia Yin <hong-hua.yin@freescale.com> --- This patch is based on branch 'ppc-next' of Alex's upstream QEMU repo: http://repo.or.cz/r/qemu/agraf.git hw/loader.c | 81 +++++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 59 insertions(+), 22 deletions(-) diff --git a/hw/loader.c b/hw/loader.c index 8475850..58fc902 100644 --- a/hw/loader.c +++ b/hw/loader.c @@ -56,6 +56,12 @@ static int roms_loaded; +typedef struct ImageFile ImageFile; +struct ImageFile { + char *name; + target_phys_addr_t addr; +}; + /* return the size or -1 if error */ int get_image_size(const char *filename) { @@ -115,6 +121,17 @@ err: g_free(*data); return -1; } + +static void image_file_reset(void *opaque) +{ + ImageFile *image = opaque; + int size; + uint8_t *data = NULL; + + size = file_load(image->name, &data); + cpu_physical_memory_rw(image->addr, data, size, 1); + g_free(data); +} /* read()-like version */ ssize_t read_targphys(const char *name, @@ -142,7 +159,12 @@ int load_image_targphys(const char *filename, return -1; } if (size > 0) { - rom_add_file_fixed(filename, addr, -1); + ImageFile *image; + image = g_malloc0(sizeof(*image)); + image->name = g_strdup(filename); + image->addr = addr; + + qemu_register_reset(image_file_reset, image); } return size; } @@ -463,15 +485,14 @@ static ssize_t gunzip(void *dst, size_t dstlen, uint8_t *src, return dstbytes; } -/* Load a U-Boot image. */ -int load_uimage(const char *filename, target_phys_addr_t *ep, - target_phys_addr_t *loadaddr, int *is_linux) +/* write uimage into memory */ +static int uimage_physical_loader(const char *filename, uint8_t **data, + target_phys_addr_t *loadaddr) { int fd; int size; uboot_image_header_t h; uboot_image_header_t *hdr = &h; - uint8_t *data = NULL; int ret = -1; fd = open(filename, O_RDONLY | O_BINARY); @@ -504,18 +525,9 @@ int load_uimage(const char *filename, target_phys_addr_t *ep, goto out; } - /* TODO: Check CPU type. */ - if (is_linux) { - if (hdr->ih_os == IH_OS_LINUX) - *is_linux = 1; - else - *is_linux = 0; - } - - *ep = hdr->ih_ep; - data = g_malloc(hdr->ih_size); + *data = g_malloc(hdr->ih_size); - if (read(fd, data, hdr->ih_size) != hdr->ih_size) { + if (read(fd, *data, hdr->ih_size) != hdr->ih_size) { fprintf(stderr, "Error reading file\n"); goto out; } @@ -525,11 +537,11 @@ int load_uimage(const char *filename, target_phys_addr_t *ep, size_t max_bytes; ssize_t bytes; - compressed_data = data; + compressed_data = *data; max_bytes = UBOOT_MAX_GUNZIP_BYTES; - data = g_malloc(max_bytes); + *data = g_malloc(max_bytes); - bytes = gunzip(data, max_bytes, compressed_data, hdr->ih_size); + bytes = gunzip(*data, max_bytes, compressed_data, hdr->ih_size); g_free(compressed_data); if (bytes < 0) { fprintf(stderr, "Unable to decompress gzipped image!\n"); @@ -538,7 +550,6 @@ int load_uimage(const char *filename, target_phys_addr_t *ep, hdr->ih_size = bytes; } - rom_add_blob_fixed(filename, data, hdr->ih_size, hdr->ih_load); if (loadaddr) *loadaddr = hdr->ih_load; @@ -546,12 +557,38 @@ int load_uimage(const char *filename, target_phys_addr_t *ep, ret = hdr->ih_size; out: - if (data) - g_free(data); close(fd); return ret; } +static void uimage_reset(void *opaque) +{ + ImageFile *image = opaque; + uint8_t *data = NULL; + int size; + + size = uimage_physical_loader(image->name, &data, &image->addr); + cpu_physical_memory_rw(image->addr, data, size, 1); + g_free(data); +} + +/* Load a U-Boot image. */ +int load_uimage(const char *filename, target_phys_addr_t *ep, + target_phys_addr_t *loadaddr, int *is_linux) +{ + int size; + ImageFile *image; + uint8_t *data = NULL; + + size= uimage_physical_loader(filename, &data, loadaddr); + g_free(data); + image = g_malloc0(sizeof(*image)); + image->name = g_strdup(filename); + image->addr = *loadaddr; + qemu_register_reset(uimage_reset, image); + return size; +} + /* * Functions for reboot-persistent memory regions. * - used for vga bios and option roms. -- 1.7.1
WARNING: multiple messages have this Message-ID (diff)
From: Olivia Yin <hong-hua.yin@freescale.com> To: kvm-ppc@vger.kernel.org, kvm@vger.kernel.org Cc: Olivia Yin <hong-hua.yin@freescale.com> Subject: [PATCH 2/2] QEMU: register reset handlers to write images into memory Date: Mon, 13 Aug 2012 05:21:05 +0000 [thread overview] Message-ID: <1344835265-23499-2-git-send-email-hong-hua.yin@freescale.com> (raw) In-Reply-To: <1344835265-23499-1-git-send-email-hong-hua.yin@freescale.com> Instead of add rom blobs, this patch just write them directly to memory. This patch registers reset handler uimage_reset() and image_file_reset() which load images into RAM during initial bootup and VM reset. v3: Use file_load() to sanity check image file. Move cpu_physical_memory_rw() out from uimage_physical_loader() so as not to write uimage twice. v2: Clean initrd_physical_loader(). Use cpu_physical_memory_rw() to write images into physical memory. Signed-off-by: Olivia Yin <hong-hua.yin@freescale.com> --- This patch is based on branch 'ppc-next' of Alex's upstream QEMU repo: http://repo.or.cz/r/qemu/agraf.git hw/loader.c | 81 +++++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 59 insertions(+), 22 deletions(-) diff --git a/hw/loader.c b/hw/loader.c index 8475850..58fc902 100644 --- a/hw/loader.c +++ b/hw/loader.c @@ -56,6 +56,12 @@ static int roms_loaded; +typedef struct ImageFile ImageFile; +struct ImageFile { + char *name; + target_phys_addr_t addr; +}; + /* return the size or -1 if error */ int get_image_size(const char *filename) { @@ -115,6 +121,17 @@ err: g_free(*data); return -1; } + +static void image_file_reset(void *opaque) +{ + ImageFile *image = opaque; + int size; + uint8_t *data = NULL; + + size = file_load(image->name, &data); + cpu_physical_memory_rw(image->addr, data, size, 1); + g_free(data); +} /* read()-like version */ ssize_t read_targphys(const char *name, @@ -142,7 +159,12 @@ int load_image_targphys(const char *filename, return -1; } if (size > 0) { - rom_add_file_fixed(filename, addr, -1); + ImageFile *image; + image = g_malloc0(sizeof(*image)); + image->name = g_strdup(filename); + image->addr = addr; + + qemu_register_reset(image_file_reset, image); } return size; } @@ -463,15 +485,14 @@ static ssize_t gunzip(void *dst, size_t dstlen, uint8_t *src, return dstbytes; } -/* Load a U-Boot image. */ -int load_uimage(const char *filename, target_phys_addr_t *ep, - target_phys_addr_t *loadaddr, int *is_linux) +/* write uimage into memory */ +static int uimage_physical_loader(const char *filename, uint8_t **data, + target_phys_addr_t *loadaddr) { int fd; int size; uboot_image_header_t h; uboot_image_header_t *hdr = &h; - uint8_t *data = NULL; int ret = -1; fd = open(filename, O_RDONLY | O_BINARY); @@ -504,18 +525,9 @@ int load_uimage(const char *filename, target_phys_addr_t *ep, goto out; } - /* TODO: Check CPU type. */ - if (is_linux) { - if (hdr->ih_os = IH_OS_LINUX) - *is_linux = 1; - else - *is_linux = 0; - } - - *ep = hdr->ih_ep; - data = g_malloc(hdr->ih_size); + *data = g_malloc(hdr->ih_size); - if (read(fd, data, hdr->ih_size) != hdr->ih_size) { + if (read(fd, *data, hdr->ih_size) != hdr->ih_size) { fprintf(stderr, "Error reading file\n"); goto out; } @@ -525,11 +537,11 @@ int load_uimage(const char *filename, target_phys_addr_t *ep, size_t max_bytes; ssize_t bytes; - compressed_data = data; + compressed_data = *data; max_bytes = UBOOT_MAX_GUNZIP_BYTES; - data = g_malloc(max_bytes); + *data = g_malloc(max_bytes); - bytes = gunzip(data, max_bytes, compressed_data, hdr->ih_size); + bytes = gunzip(*data, max_bytes, compressed_data, hdr->ih_size); g_free(compressed_data); if (bytes < 0) { fprintf(stderr, "Unable to decompress gzipped image!\n"); @@ -538,7 +550,6 @@ int load_uimage(const char *filename, target_phys_addr_t *ep, hdr->ih_size = bytes; } - rom_add_blob_fixed(filename, data, hdr->ih_size, hdr->ih_load); if (loadaddr) *loadaddr = hdr->ih_load; @@ -546,12 +557,38 @@ int load_uimage(const char *filename, target_phys_addr_t *ep, ret = hdr->ih_size; out: - if (data) - g_free(data); close(fd); return ret; } +static void uimage_reset(void *opaque) +{ + ImageFile *image = opaque; + uint8_t *data = NULL; + int size; + + size = uimage_physical_loader(image->name, &data, &image->addr); + cpu_physical_memory_rw(image->addr, data, size, 1); + g_free(data); +} + +/* Load a U-Boot image. */ +int load_uimage(const char *filename, target_phys_addr_t *ep, + target_phys_addr_t *loadaddr, int *is_linux) +{ + int size; + ImageFile *image; + uint8_t *data = NULL; + + size= uimage_physical_loader(filename, &data, loadaddr); + g_free(data); + image = g_malloc0(sizeof(*image)); + image->name = g_strdup(filename); + image->addr = *loadaddr; + qemu_register_reset(uimage_reset, image); + return size; +} + /* * Functions for reboot-persistent memory regions. * - used for vga bios and option roms. -- 1.7.1
next prev parent reply other threads:[~2012-08-13 5:48 UTC|newest] Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top 2012-08-13 5:21 [PATCH 1/2] QEMU: extract file_load() function from rom_add_file() for reusing Olivia Yin 2012-08-13 5:21 ` Olivia Yin 2012-08-13 5:21 ` Olivia Yin [this message] 2012-08-13 5:21 ` [PATCH 2/2] QEMU: register reset handlers to write images into memory Olivia Yin 2012-08-13 8:41 ` [PATCH 1/2] QEMU: extract file_load() function from rom_add_file() for reusing Alexander Graf 2012-08-13 8:41 ` Alexander Graf
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1344835265-23499-2-git-send-email-hong-hua.yin@freescale.com \ --to=hong-hua.yin@freescale.com \ --cc=kvm-ppc@vger.kernel.org \ --cc=kvm@vger.kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.