All of lore.kernel.org
 help / color / mirror / Atom feed
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



  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: link
Be 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.