qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-ppc] [PATCH v2] register reset handler to write image into mem


From: Yin Olivia-R63875
Subject: Re: [Qemu-ppc] [PATCH v2] register reset handler to write image into memory
Date: Thu, 23 Aug 2012 09:45:28 +0000

Dear All,

I can't find MAINTAINER of hw/loader.c.
Who can help review and apply this patch?

Best Regards,
Olivia Yin

> -----Original Message-----
> From: Yin Olivia-R63875
> Sent: Friday, August 17, 2012 5:08 PM
> To: address@hidden; address@hidden
> Cc: Yin Olivia-R63875
> Subject: [PATCH v2] register reset handler to write image into memory
> 
> 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.
> 
> v2: use g_file_get_content() to load load image file.
> 
> Signed-off-by: Olivia Yin <address@hidden>
> ---
> 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 |   88 ++++++++++++++++++++++++++++++++++++++++++++---------
> ------
>  1 files changed, 66 insertions(+), 22 deletions(-)
> 
> diff --git a/hw/loader.c b/hw/loader.c
> index 33acc2f..0be8bf7 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)  { @@ -86,6 +92,24 @@ int
> load_image(const char *filename, uint8_t *addr)
>      return size;
>  }
> 
> +static void image_file_reset(void *opaque) {
> +    ImageFile *image = opaque;
> +    GError *err = NULL;
> +    gboolean res;
> +    gchar *content;
> +    gsize size;
> +
> +    res = g_file_get_contents(image->name, &content, &size, &err);
> +    if (res == FALSE) {
> +       error_report("failed to read image file: %s\n", image->name);
> +       g_error_free(err);
> +    } else {
> +       cpu_physical_memory_rw(image->addr, (uint8_t *)content, size, 1);
> +       g_free(content);
> +    }
> +}
> +
>  /* read()-like version */
>  ssize_t read_targphys(const char *name,
>                        int fd, target_phys_addr_t dst_addr, size_t nbytes)
> @@ -112,7 +136,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;
>  }
> @@ -433,15 +462,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); @@ -474,18 +502,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;
>      }
> @@ -495,11 +514,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"); @@
> -508,7 +527,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;
> @@ -516,12 +534,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 via email to

[Prev in Thread] Current Thread [Next in Thread]