* [Qemu-devel] [PATCH 0/5] register reset handlers to reload image
@ 2012-10-26 8:02 Olivia Yin
2012-10-26 8:02 ` [Qemu-devel] [PATCH 1/5] define image_file_reset and image_blob_reset Olivia Yin
2012-10-26 9:17 ` [Qemu-devel] [PATCH 0/5] register reset handlers to reload image 陳韋任 (Wei-Ren Chen)
0 siblings, 2 replies; 10+ messages in thread
From: Olivia Yin @ 2012-10-26 8:02 UTC (permalink / raw)
To: qemu-ppc, qemu-devel; +Cc: Olivia Yin
Register reset handlers image_blob_reset and image_file_reset
to reload images when virtual machine reset.
This way could optimize footprint of QEMU.
This is the first part of the patches which remove rom related
functions in loader.c
The second part will optimize memory regions which use rom_ptr.
Signed-off-by: Olivia Yin <hong-hua.yin@freescale.com>
0001-define-image_file_reset-and-image_blob_reset.patch
0002-use-reset-handlers-to-reload-kernel-and-initrd.patch
0003-replace-rom_add_file-with-image_file_reset.patch
0004-replaece-rom_add_blob-with-image_blob_reset.patch
0005-remove-rom-related-functions-in-loader.patch
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 1/5] define image_file_reset and image_blob_reset
2012-10-26 8:02 [Qemu-devel] [PATCH 0/5] register reset handlers to reload image Olivia Yin
@ 2012-10-26 8:02 ` Olivia Yin
2012-10-26 8:02 ` [Qemu-devel] [PATCH 2/5] use reset handlers to reload kernel and initrd Olivia Yin
2012-10-26 9:28 ` [Qemu-devel] [PATCH 1/5] define image_file_reset and image_blob_reset 陳韋任 (Wei-Ren Chen)
2012-10-26 9:17 ` [Qemu-devel] [PATCH 0/5] register reset handlers to reload image 陳韋任 (Wei-Ren Chen)
1 sibling, 2 replies; 10+ messages in thread
From: Olivia Yin @ 2012-10-26 8:02 UTC (permalink / raw)
To: qemu-ppc, qemu-devel; +Cc: Olivia Yin
Signed-off-by: Olivia Yin <hong-hua.yin@freescale.com>
---
hw/loader.c | 39 +++++++++++++++++++++++++++++++++++++++
hw/loader.h | 18 ++++++++++++++++++
2 files changed, 57 insertions(+), 0 deletions(-)
diff --git a/hw/loader.c b/hw/loader.c
index 33acc2f..726c0e7 100644
--- a/hw/loader.c
+++ b/hw/loader.c
@@ -86,6 +86,45 @@ int load_image(const char *filename, uint8_t *addr)
return size;
}
+void image_file_reset(void *opaque)
+{
+ ImageFile *image = opaque;
+ GError *err = NULL;
+ gboolean res;
+ gchar *content;
+ gsize size;
+
+ if(image->dir) {
+ const char *basename;
+ char fw_file_name[56];
+
+ basename = strrchr(image->name, '/');
+ if (basename) {
+ basename++;
+ } else {
+ basename = image->name;
+ }
+ snprintf(fw_file_name, sizeof(fw_file_name), "%s/%s", image->dir,
+ basename);
+ image->name = g_strdup(fw_file_name);
+ }
+
+ 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);
+ }
+}
+
+void image_blob_reset(void *opaque)
+{
+ ImageBlob *blob = opaque;
+ cpu_physical_memory_rw(blob->addr, blob->data, blob->size, 1);
+}
+
/* read()-like version */
ssize_t read_targphys(const char *name,
int fd, target_phys_addr_t dst_addr, size_t nbytes)
diff --git a/hw/loader.h b/hw/loader.h
index 6da291e..e9dc4df 100644
--- a/hw/loader.h
+++ b/hw/loader.h
@@ -46,4 +46,22 @@ void do_info_roms(Monitor *mon);
int rom_add_vga(const char *file);
int rom_add_option(const char *file, int32_t bootindex);
+typedef struct ImageFile ImageFile;
+struct ImageFile {
+ char *name;
+ char *dir;
+ target_phys_addr_t addr;
+};
+
+typedef struct ImageBlob ImageBlob;
+struct ImageBlob {
+ char *name;
+ target_phys_addr_t addr;
+ ssize_t size;
+ uint8_t *data;
+};
+
+void image_blob_reset(void *opaque);
+void image_file_reset(void *opaque);
+
#endif
--
1.7.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 2/5] use reset handlers to reload kernel and initrd
2012-10-26 8:02 ` [Qemu-devel] [PATCH 1/5] define image_file_reset and image_blob_reset Olivia Yin
@ 2012-10-26 8:02 ` Olivia Yin
2012-10-26 8:02 ` [Qemu-devel] [PATCH 3/5] replace rom_add_file* with image_file_reset Olivia Yin
2012-10-26 9:32 ` [Qemu-devel] [PATCH 2/5] use reset handlers to reload kernel and initrd 陳韋任 (Wei-Ren Chen)
2012-10-26 9:28 ` [Qemu-devel] [PATCH 1/5] define image_file_reset and image_blob_reset 陳韋任 (Wei-Ren Chen)
1 sibling, 2 replies; 10+ messages in thread
From: Olivia Yin @ 2012-10-26 8:02 UTC (permalink / raw)
To: qemu-ppc, qemu-devel; +Cc: Olivia Yin
Signed-off-by: Olivia Yin <hong-hua.yin@freescale.com>
---
hw/loader.c | 64 ++++++++++++++++++++++++++++++++++++++--------------------
1 files changed, 42 insertions(+), 22 deletions(-)
diff --git a/hw/loader.c b/hw/loader.c
index 726c0e7..4a20ed2 100644
--- a/hw/loader.c
+++ b/hw/loader.c
@@ -151,7 +151,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;
}
@@ -472,15 +477,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);
@@ -513,18 +517,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;
}
@@ -534,11 +529,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");
@@ -547,7 +542,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;
@@ -555,12 +549,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
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 3/5] replace rom_add_file* with image_file_reset
2012-10-26 8:02 ` [Qemu-devel] [PATCH 2/5] use reset handlers to reload kernel and initrd Olivia Yin
@ 2012-10-26 8:02 ` Olivia Yin
2012-10-26 8:02 ` [Qemu-devel] [PATCH 4/5] replaece rom_add_blob* with image_blob_reset Olivia Yin
2012-10-26 9:32 ` [Qemu-devel] [PATCH 2/5] use reset handlers to reload kernel and initrd 陳韋任 (Wei-Ren Chen)
1 sibling, 1 reply; 10+ messages in thread
From: Olivia Yin @ 2012-10-26 8:02 UTC (permalink / raw)
To: qemu-ppc, qemu-devel; +Cc: Olivia Yin
Signed-off-by: Olivia Yin <hong-hua.yin@freescale.com>
---
hw/cirrus_vga.c | 6 +++++-
hw/pc.c | 6 +++++-
hw/pc_sysfw.c | 14 +++++++-------
hw/pci.c | 10 ++++++++--
hw/sga.c | 6 +++++-
hw/vga-isa.c | 6 +++++-
6 files changed, 35 insertions(+), 13 deletions(-)
diff --git a/hw/cirrus_vga.c b/hw/cirrus_vga.c
index a101329..b98662d 100644
--- a/hw/cirrus_vga.c
+++ b/hw/cirrus_vga.c
@@ -2906,7 +2906,11 @@ static int vga_initfn(ISADevice *dev)
s->ds = graphic_console_init(s->update, s->invalidate,
s->screen_dump, s->text_update,
s);
- rom_add_vga(VGABIOS_CIRRUS_FILENAME);
+ ImageFile *image;
+ image = g_malloc(sizeof(*image));
+ image->name = g_strdup(VGABIOS_CIRRUS_FILENAME);
+ image->addr = 0;
+ qemu_register_reset(image_file_reset, image);
/* XXX ISA-LFB support */
/* FIXME not qdev yet */
return 0;
diff --git a/hw/pc.c b/hw/pc.c
index c5f14e1..a620905 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -979,7 +979,11 @@ void *pc_memory_init(MemoryRegion *system_memory,
}
for (i = 0; i < nb_option_roms; i++) {
- rom_add_option(option_rom[i].name, option_rom[i].bootindex);
+ ImageFile *image;
+ image = g_malloc(sizeof(*image));
+ image->name = g_strdup(option_rom[i].name);
+ image->addr = 0;
+ qemu_register_reset(image_file_reset, image);
}
return fw_cfg;
}
diff --git a/hw/pc_sysfw.c b/hw/pc_sysfw.c
index b45f0ac..4e9b999 100644
--- a/hw/pc_sysfw.c
+++ b/hw/pc_sysfw.c
@@ -151,18 +151,18 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory)
}
if (bios_size <= 0 ||
(bios_size % 65536) != 0) {
- goto bios_error;
+ fprintf(stderr, "qemu: could not load PC BIOS '%s'\n", bios_name);
+ exit(1);
}
bios = g_malloc(sizeof(*bios));
memory_region_init_ram(bios, "pc.bios", bios_size);
vmstate_register_ram_global(bios);
memory_region_set_readonly(bios, true);
- ret = rom_add_file_fixed(bios_name, (uint32_t)(-bios_size), -1);
- if (ret != 0) {
- bios_error:
- fprintf(stderr, "qemu: could not load PC BIOS '%s'\n", bios_name);
- exit(1);
- }
+ ImageFile *image;
+ image = g_malloc(sizeof(*image));
+ image->name = g_strdup(filename);
+ image->addr = (uint32_t)(-bios_size);
+ qemu_register_reset(image_file_reset, image);
if (filename) {
g_free(filename);
}
diff --git a/hw/pci.c b/hw/pci.c
index 2ca6ff6..0c7cfe9 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -33,6 +33,7 @@
#include "qmp-commands.h"
#include "msi.h"
#include "msix.h"
+#include "loader.h"
//#define DEBUG_PCI
#ifdef DEBUG_PCI
@@ -1769,12 +1770,17 @@ static int pci_add_option_rom(PCIDevice *pdev, bool is_default_rom)
* Load rom via fw_cfg instead of creating a rom bar,
* for 0.11 compatibility.
*/
+ ImageFile *image;
+ image = g_malloc(sizeof(*image));
+ image->name = g_strdup(pdev->romfile);
+ image->addr = 0;
int class = pci_get_word(pdev->config + PCI_CLASS_DEVICE);
if (class == 0x0300) {
- rom_add_vga(pdev->romfile);
+ image->dir = g_strdup("vgaroms");
} else {
- rom_add_option(pdev->romfile, -1);
+ image->dir = g_strdup("genroms");
}
+ qemu_register_reset(image_file_reset, image);
return 0;
}
diff --git a/hw/sga.c b/hw/sga.c
index a666349..25c002a 100644
--- a/hw/sga.c
+++ b/hw/sga.c
@@ -37,7 +37,11 @@ typedef struct ISAGAState {
static int sga_initfn(ISADevice *dev)
{
- rom_add_vga(SGABIOS_FILENAME);
+ ImageFile *image;
+ image = g_malloc(sizeof(*image));
+ image->name = g_strdup(SGABIOS_FILENAME);
+ image->addr = 0;
+ qemu_register_reset(image_file_reset, image);
return 0;
}
static void sga_class_initfn(ObjectClass *klass, void *data)
diff --git a/hw/vga-isa.c b/hw/vga-isa.c
index d290473..5fe9f46 100644
--- a/hw/vga-isa.c
+++ b/hw/vga-isa.c
@@ -65,7 +65,11 @@ static int vga_initfn(ISADevice *dev)
vga_init_vbe(s, isa_address_space(dev));
/* ROM BIOS */
- rom_add_vga(VGABIOS_FILENAME);
+ ImageFile *image;
+ image = g_malloc(sizeof(*image));
+ image->name = g_strdup(VGABIOS_FILENAME);
+ image->addr = 0;
+ qemu_register_reset(image_file_reset, image);
return 0;
}
--
1.7.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 4/5] replaece rom_add_blob* with image_blob_reset
2012-10-26 8:02 ` [Qemu-devel] [PATCH 3/5] replace rom_add_file* with image_file_reset Olivia Yin
@ 2012-10-26 8:02 ` Olivia Yin
2012-10-26 8:02 ` [Qemu-devel] [PATCH 5/5] remove rom related functions in loader Olivia Yin
0 siblings, 1 reply; 10+ messages in thread
From: Olivia Yin @ 2012-10-26 8:02 UTC (permalink / raw)
To: qemu-ppc, qemu-devel; +Cc: Olivia Yin
Signed-off-by: Olivia Yin <hong-hua.yin@freescale.com>
---
hw/arm_boot.c | 20 ++++++++++++++++----
hw/elf_ops.h | 9 ++++++++-
hw/exynos4210.c | 10 ++++++++--
hw/highbank.c | 9 ++++++++-
hw/lm32_hwsetup.h | 9 ++++++++-
hw/loader.c | 23 +++++++++++++++++++----
hw/mips_fulong2e.c | 10 ++++++++--
hw/mips_malta.c | 10 ++++++++--
hw/mips_r4k.c | 10 ++++++++--
hw/ppc/e500.c | 21 +++++++++++----------
hw/ppc440_bamboo.c | 9 ++++++++-
hw/r2d.c | 10 ++++++++--
12 files changed, 118 insertions(+), 32 deletions(-)
diff --git a/hw/arm_boot.c b/hw/arm_boot.c
index a6e9143..53c8861 100644
--- a/hw/arm_boot.c
+++ b/hw/arm_boot.c
@@ -68,8 +68,14 @@ static void default_write_secondary(ARMCPU *cpu,
for (n = 0; n < ARRAY_SIZE(smpboot); n++) {
smpboot[n] = tswap32(smpboot[n]);
}
- rom_add_blob_fixed("smpboot", smpboot, sizeof(smpboot),
- info->smp_loader_start);
+ ImageBlob *blob;
+ blob = g_malloc0(sizeof(*blob));
+ blob->name = g_strdup("smpboot");
+ blob->addr = info->smp_loader_start;
+ blob->size = sizeof(smpboot);
+ blob->data = g_malloc0(blob->size);
+ memcpy(blob->data, smpboot, blob->size);
+ qemu_register_reset(image_blob_reset, blob);
}
static void default_reset_secondary(ARMCPU *cpu,
@@ -439,8 +445,14 @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
for (n = 0; n < sizeof(bootloader) / 4; n++) {
bootloader[n] = tswap32(bootloader[n]);
}
- rom_add_blob_fixed("bootloader", bootloader, sizeof(bootloader),
- info->loader_start);
+ ImageBlob *blob;
+ blob = g_malloc0(sizeof(*blob));
+ blob->name = g_strdup("bootloader");
+ blob->addr = dst_addr;
+ blob->size = sizeof(bootloader);
+ blob->data = g_malloc0(blob->size);
+ memcpy(blob->data, bootloader, blob->size);
+ qemu_register_reset(image_blob_reset, blob);
if (info->nb_cpus > 1) {
info->write_secondary_boot(cpu, info);
}
diff --git a/hw/elf_ops.h b/hw/elf_ops.h
index 731a983..cf219c7 100644
--- a/hw/elf_ops.h
+++ b/hw/elf_ops.h
@@ -281,7 +281,14 @@ static int glue(load_elf, SZ)(const char *name, int fd,
}
snprintf(label, sizeof(label), "phdr #%d: %s", i, name);
- rom_add_blob_fixed(label, data, mem_size, addr);
+ ImageBlob *blob;
+ blob = g_malloc0(sizeof(*blob));
+ blob->name = g_strdup(label);
+ blob->addr = addr;
+ blob->size = mem_size;
+ blob->data = g_malloc0(blob->size);
+ memcpy(blob->data, data, blob->size);
+ qemu_register_reset(image_blob_reset, blob);
total_size += mem_size;
if (addr < low)
diff --git a/hw/exynos4210.c b/hw/exynos4210.c
index 00d4db8..9191fdb 100644
--- a/hw/exynos4210.c
+++ b/hw/exynos4210.c
@@ -100,8 +100,14 @@ void exynos4210_write_secondary(ARMCPU *cpu,
for (n = 0; n < ARRAY_SIZE(smpboot); n++) {
smpboot[n] = tswap32(smpboot[n]);
}
- rom_add_blob_fixed("smpboot", smpboot, sizeof(smpboot),
- info->smp_loader_start);
+ ImageBlob *blob;
+ blob = g_malloc0(sizeof(*blob));
+ blob->name = g_strdup("smpboot");
+ blob->addr = info->smp_loader_start;
+ blob->size = sizeof(smpboot);
+ blob->data = g_malloc0(blob->size);
+ memcpy(blob->data, smpboot, blob->size);
+ qemu_register_reset(image_blob_reset, blob);
}
Exynos4210State *exynos4210_init(MemoryRegion *system_mem,
diff --git a/hw/highbank.c b/hw/highbank.c
index 11aa131..ff29221 100644
--- a/hw/highbank.c
+++ b/hw/highbank.c
@@ -57,7 +57,14 @@ static void hb_write_secondary(ARMCPU *cpu, const struct arm_boot_info *info)
for (n = 0; n < ARRAY_SIZE(smpboot); n++) {
smpboot[n] = tswap32(smpboot[n]);
}
- rom_add_blob_fixed("smpboot", smpboot, sizeof(smpboot), SMP_BOOT_ADDR);
+ ImageBlob *blob;
+ blob = g_malloc0(sizeof(*blob));
+ blob->name = g_strdup("smpboot");
+ blob->addr = SMP_BOOT_ADDR;
+ blob->size = sizeof(smpboot);
+ blob->data = g_malloc0(blob->size);
+ memcpy(blob->data, smpboot, blob->size);
+ qemu_register_reset(image_blob_reset, blob);
}
static void hb_reset_secondary(ARMCPU *cpu, const struct arm_boot_info *info)
diff --git a/hw/lm32_hwsetup.h b/hw/lm32_hwsetup.h
index 70dc61f..8db1a36 100644
--- a/hw/lm32_hwsetup.h
+++ b/hw/lm32_hwsetup.h
@@ -73,7 +73,14 @@ static inline void hwsetup_free(HWSetup *hw)
static inline void hwsetup_create_rom(HWSetup *hw,
target_phys_addr_t base)
{
- rom_add_blob("hwsetup", hw->data, TARGET_PAGE_SIZE, base);
+ ImageBlob *blob;
+ blob = g_malloc0(sizeof(*blob));
+ blob->name = g_strdup("hwsetup");
+ blob->addr = base;
+ blob->size = TARGET_PAGE_SIZE;
+ blob->data = g_malloc0(blob->size);
+ memcpy(blob->data, hw->data, blob->size);
+ qemu_register_reset(image_blob_reset, blob);
}
static inline void hwsetup_add_u8(HWSetup *hw, uint8_t u)
diff --git a/hw/loader.c b/hw/loader.c
index 4a20ed2..5cf776a 100644
--- a/hw/loader.c
+++ b/hw/loader.c
@@ -134,8 +134,16 @@ ssize_t read_targphys(const char *name,
buf = g_malloc(nbytes);
did = read(fd, buf, nbytes);
- if (did > 0)
- rom_add_blob_fixed("read", buf, did, dst_addr);
+ if (did > 0) {
+ ImageBlob *blob;
+ blob = g_malloc0(sizeof(*blob));
+ blob->name = g_strdup("read");
+ blob->addr = dst_addr;
+ blob->size = nbytes;
+ blob->data = g_malloc0(blob->size);
+ memcpy(blob->data, buf, blob->size);
+ qemu_register_reset(image_blob_reset, blob);
+ }
g_free(buf);
return did;
}
@@ -169,13 +177,20 @@ void pstrcpy_targphys(const char *name, target_phys_addr_t dest, int buf_size,
if (buf_size <= 0) return;
nulp = memchr(source, 0, buf_size);
+ ImageBlob *blob;
+ blob = g_malloc0(sizeof(*blob));
+ blob->name = g_strdup(name);
+ blob->addr = dest;
if (nulp) {
- rom_add_blob_fixed(name, source, (nulp - source) + 1, dest);
+ blob->size = (nulp - source) + 1;
} else {
- rom_add_blob_fixed(name, source, buf_size, dest);
+ blob->size = buf_size;
ptr = rom_ptr(dest + buf_size - 1);
*ptr = 0;
}
+ blob->data = g_malloc0(blob->size);
+ memcpy(blob->data, source, blob->size);
+ qemu_register_reset(image_blob_reset, blob);
}
/* A.OUT loader */
diff --git a/hw/mips_fulong2e.c b/hw/mips_fulong2e.c
index d4a8672..87f560e 100644
--- a/hw/mips_fulong2e.c
+++ b/hw/mips_fulong2e.c
@@ -162,8 +162,14 @@ static int64_t load_kernel (CPUMIPSState *env)
prom_set(prom_buf, index++, "modetty0=38400n8r");
prom_set(prom_buf, index++, NULL);
- rom_add_blob_fixed("prom", prom_buf, prom_size,
- cpu_mips_kseg0_to_phys(NULL, ENVP_ADDR));
+ ImageBlob *blob;
+ blob = g_malloc0(sizeof(*blob));
+ blob->name = g_strdup("prom");
+ blob->addr = cpu_mips_kseg0_to_phys(NULL, ENVP_ADDR);
+ blob->size = prom_size;
+ blob->data = g_malloc0(blob->size);
+ memcpy(blob->data, prom_buf, blob->size);
+ qemu_register_reset(image_blob_reset, blob);
return kernel_entry;
}
diff --git a/hw/mips_malta.c b/hw/mips_malta.c
index 632b466..6f0fb13 100644
--- a/hw/mips_malta.c
+++ b/hw/mips_malta.c
@@ -736,8 +736,14 @@ static int64_t load_kernel (void)
prom_set(prom_buf, prom_index++, "38400n8r");
prom_set(prom_buf, prom_index++, NULL);
- rom_add_blob_fixed("prom", prom_buf, prom_size,
- cpu_mips_kseg0_to_phys(NULL, ENVP_ADDR));
+ ImageBlob *blob;
+ blob = g_malloc0(sizeof(*blob));
+ blob->name = g_strdup("prom");
+ blob->addr = cpu_mips_kseg0_to_phys(NULL, ENVP_ADDR);
+ blob->size = prom_size;
+ blob->data = g_malloc0(blob->size);
+ memcpy(blob->data, prom_buf, blob->size);
+ qemu_register_reset(image_blob_reset, blob);
return kernel_entry;
}
diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c
index 967a76e..401917b 100644
--- a/hw/mips_r4k.c
+++ b/hw/mips_r4k.c
@@ -134,8 +134,14 @@ static int64_t load_kernel(void)
snprintf((char *)params_buf + 8, 256, "%s", loaderparams.kernel_cmdline);
}
- rom_add_blob_fixed("params", params_buf, params_size,
- (16 << 20) - 264);
+ ImageBlob *blob;
+ blob = g_malloc0(sizeof(*blob));
+ blob->name = g_strdup("params");
+ blob->addr = (16 << 20) - 264;
+ blob->size = params_size;
+ blob->data = g_malloc0(blob->size);
+ memcpy(blob->data, params_buf, blob->size);
+ qemu_register_reset(image_blob_reset, blob);
return entry;
}
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index c3fb618..c4cc6cc 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -150,19 +150,19 @@ static int ppce500_load_device_tree(CPUPPCState *env,
char *filename;
filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, dtb_file);
if (!filename) {
- goto out;
+ return ret;
}
fdt = load_device_tree(filename, &fdt_size);
if (!fdt) {
- goto out;
+ return ret;
}
goto done;
}
fdt = create_device_tree(&fdt_size);
if (fdt == NULL) {
- goto out;
+ return ret;
}
/* Manipulate device tree in memory. */
@@ -332,15 +332,16 @@ static int ppce500_load_device_tree(CPUPPCState *env,
done:
qemu_devtree_dumpdtb(fdt, fdt_size);
- ret = rom_add_blob_fixed(BINARY_DEVICE_TREE_FILE, fdt, fdt_size, addr);
- if (ret < 0) {
- goto out;
- }
+ ImageBlob *blob;
+ blob = g_malloc0(sizeof(*blob));
+ blob->name = g_strdup(BINARY_DEVICE_TREE_FILE);
+ blob->addr = addr;
+ blob->size = fdt_size;
+ blob->data = g_malloc0(blob->size);
+ memcpy(blob->data, fdt, blob->size);
+ qemu_register_reset(image_blob_reset, blob);
g_free(fdt);
ret = fdt_size;
-
-out:
-
return ret;
}
diff --git a/hw/ppc440_bamboo.c b/hw/ppc440_bamboo.c
index 9286438..e3e49dd 100644
--- a/hw/ppc440_bamboo.c
+++ b/hw/ppc440_bamboo.c
@@ -111,7 +111,14 @@ static int bamboo_load_device_tree(target_phys_addr_t addr,
qemu_devtree_setprop_cell(fdt, "/cpus/cpu@0", "timebase-frequency",
tb_freq);
- ret = rom_add_blob_fixed(BINARY_DEVICE_TREE_FILE, fdt, fdt_size, addr);
+ ImageBlob *blob;
+ blob = g_malloc0(sizeof(*blob));
+ blob->name = g_strdup(BINARY_DEVICE_TREE_FILE);
+ blob->addr = addr;
+ blob->size = fdt_size;
+ blob->data = g_malloc0(blob->size);
+ memcpy(blob->data, fdt, blob->size);
+ qemu_register_reset(image_blob_reset, blob);
g_free(fdt);
out:
diff --git a/hw/r2d.c b/hw/r2d.c
index 1bc191f..15e1be4 100644
--- a/hw/r2d.c
+++ b/hw/r2d.c
@@ -338,8 +338,14 @@ static void r2d_init(ram_addr_t ram_size,
sizeof(boot_params.kernel_cmdline));
}
- rom_add_blob_fixed("boot_params", &boot_params, sizeof(boot_params),
- SDRAM_BASE + BOOT_PARAMS_OFFSET);
+ ImageBlob *blob;
+ blob = g_malloc0(sizeof(*blob));
+ blob->name = g_strdup("boot_params");
+ blob->addr = SDRAM_BASE + BOOT_PARAMS_OFFSET;
+ blob->size = sizeof(boot_params);
+ blob->data = g_malloc0(blob->size);
+ memcpy(blob->data, &boot_params, blob->size);
+ qemu_register_reset(image_blob_reset, blob);
}
static QEMUMachine r2d_machine = {
--
1.7.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 5/5] remove rom related functions in loader
2012-10-26 8:02 ` [Qemu-devel] [PATCH 4/5] replaece rom_add_blob* with image_blob_reset Olivia Yin
@ 2012-10-26 8:02 ` Olivia Yin
0 siblings, 0 replies; 10+ messages in thread
From: Olivia Yin @ 2012-10-26 8:02 UTC (permalink / raw)
To: qemu-ppc, qemu-devel; +Cc: Olivia Yin
Signed-off-by: Olivia Yin <hong-hua.yin@freescale.com>
---
hw/loader.c | 166 -----------------------------------------------------------
hw/loader.h | 14 -----
vl.c | 5 --
3 files changed, 0 insertions(+), 185 deletions(-)
diff --git a/hw/loader.c b/hw/loader.c
index 5cf776a..5549568 100644
--- a/hw/loader.c
+++ b/hw/loader.c
@@ -54,8 +54,6 @@
#include <zlib.h>
-static int roms_loaded;
-
/* return the size or -1 if error */
int get_image_size(const char *filename)
{
@@ -617,172 +615,8 @@ struct Rom {
QTAILQ_ENTRY(Rom) next;
};
-static FWCfgState *fw_cfg;
static QTAILQ_HEAD(, Rom) roms = QTAILQ_HEAD_INITIALIZER(roms);
-static void rom_insert(Rom *rom)
-{
- Rom *item;
-
- if (roms_loaded) {
- hw_error ("ROM images must be loaded at startup\n");
- }
-
- /* list is ordered by load address */
- QTAILQ_FOREACH(item, &roms, next) {
- if (rom->addr >= item->addr)
- continue;
- QTAILQ_INSERT_BEFORE(item, rom, next);
- return;
- }
- QTAILQ_INSERT_TAIL(&roms, rom, next);
-}
-
-int rom_add_file(const char *file, const char *fw_dir,
- target_phys_addr_t addr, int32_t bootindex)
-{
- Rom *rom;
- int rc, fd = -1;
- char devpath[100];
-
- rom = g_malloc0(sizeof(*rom));
- rom->name = g_strdup(file);
- rom->path = qemu_find_file(QEMU_FILE_TYPE_BIOS, rom->name);
- if (rom->path == NULL) {
- rom->path = g_strdup(file);
- }
-
- fd = open(rom->path, O_RDONLY | O_BINARY);
- if (fd == -1) {
- fprintf(stderr, "Could not open option rom '%s': %s\n",
- rom->path, strerror(errno));
- goto err;
- }
-
- if (fw_dir) {
- rom->fw_dir = g_strdup(fw_dir);
- rom->fw_file = g_strdup(file);
- }
- rom->addr = addr;
- rom->romsize = lseek(fd, 0, SEEK_END);
- rom->data = g_malloc0(rom->romsize);
- lseek(fd, 0, SEEK_SET);
- rc = read(fd, rom->data, rom->romsize);
- if (rc != rom->romsize) {
- fprintf(stderr, "rom: file %-20s: read error: rc=%d (expected %zd)\n",
- rom->name, rc, rom->romsize);
- goto err;
- }
- close(fd);
- rom_insert(rom);
- if (rom->fw_file && fw_cfg) {
- const char *basename;
- char fw_file_name[56];
-
- basename = strrchr(rom->fw_file, '/');
- if (basename) {
- basename++;
- } else {
- basename = rom->fw_file;
- }
- snprintf(fw_file_name, sizeof(fw_file_name), "%s/%s", rom->fw_dir,
- basename);
- fw_cfg_add_file(fw_cfg, fw_file_name, rom->data, rom->romsize);
- snprintf(devpath, sizeof(devpath), "/rom@%s", fw_file_name);
- } else {
- snprintf(devpath, sizeof(devpath), "/rom@" TARGET_FMT_plx, addr);
- }
-
- add_boot_device_path(bootindex, NULL, devpath);
- return 0;
-
-err:
- if (fd != -1)
- close(fd);
- g_free(rom->data);
- g_free(rom->path);
- g_free(rom->name);
- g_free(rom);
- return -1;
-}
-
-int rom_add_blob(const char *name, const void *blob, size_t len,
- target_phys_addr_t addr)
-{
- Rom *rom;
-
- rom = g_malloc0(sizeof(*rom));
- rom->name = g_strdup(name);
- rom->addr = addr;
- rom->romsize = len;
- rom->data = g_malloc0(rom->romsize);
- memcpy(rom->data, blob, len);
- rom_insert(rom);
- return 0;
-}
-
-int rom_add_vga(const char *file)
-{
- return rom_add_file(file, "vgaroms", 0, -1);
-}
-
-int rom_add_option(const char *file, int32_t bootindex)
-{
- return rom_add_file(file, "genroms", 0, bootindex);
-}
-
-static void rom_reset(void *unused)
-{
- Rom *rom;
-
- QTAILQ_FOREACH(rom, &roms, next) {
- if (rom->fw_file) {
- continue;
- }
- if (rom->data == NULL) {
- continue;
- }
- cpu_physical_memory_write_rom(rom->addr, rom->data, rom->romsize);
- if (rom->isrom) {
- /* rom needs to be written only once */
- g_free(rom->data);
- rom->data = NULL;
- }
- }
-}
-
-int rom_load_all(void)
-{
- target_phys_addr_t addr = 0;
- MemoryRegionSection section;
- Rom *rom;
-
- QTAILQ_FOREACH(rom, &roms, next) {
- if (rom->fw_file) {
- continue;
- }
- if (addr > rom->addr) {
- fprintf(stderr, "rom: requested regions overlap "
- "(rom %s. free=0x" TARGET_FMT_plx
- ", addr=0x" TARGET_FMT_plx ")\n",
- rom->name, addr, rom->addr);
- return -1;
- }
- addr = rom->addr;
- addr += rom->romsize;
- section = memory_region_find(get_system_memory(), rom->addr, 1);
- rom->isrom = section.size && memory_region_is_rom(section.mr);
- }
- qemu_register_reset(rom_reset, NULL);
- roms_loaded = 1;
- return 0;
-}
-
-void rom_set_fw(void *f)
-{
- fw_cfg = f;
-}
-
static Rom *find_rom(target_phys_addr_t addr)
{
Rom *rom;
diff --git a/hw/loader.h b/hw/loader.h
index e9dc4df..a2b537d 100644
--- a/hw/loader.h
+++ b/hw/loader.h
@@ -21,31 +21,17 @@ void pstrcpy_targphys(const char *name,
target_phys_addr_t dest, int buf_size,
const char *source);
-
-int rom_add_file(const char *file, const char *fw_dir,
- target_phys_addr_t addr, int32_t bootindex);
-int rom_add_blob(const char *name, const void *blob, size_t len,
- target_phys_addr_t addr);
-int rom_load_all(void);
void rom_set_fw(void *f);
int rom_copy(uint8_t *dest, target_phys_addr_t addr, size_t size);
void *rom_ptr(target_phys_addr_t addr);
void do_info_roms(Monitor *mon);
-#define rom_add_file_fixed(_f, _a, _i) \
- rom_add_file(_f, NULL, _a, _i)
-#define rom_add_blob_fixed(_f, _b, _l, _a) \
- rom_add_blob(_f, _b, _l, _a)
-
#define PC_ROM_MIN_VGA 0xc0000
#define PC_ROM_MIN_OPTION 0xc8000
#define PC_ROM_MAX 0xe0000
#define PC_ROM_ALIGN 0x800
#define PC_ROM_SIZE (PC_ROM_MAX - PC_ROM_MIN_VGA)
-int rom_add_vga(const char *file);
-int rom_add_option(const char *file, int32_t bootindex);
-
typedef struct ImageFile ImageFile;
struct ImageFile {
char *name;
diff --git a/vl.c b/vl.c
index 4bd1623..752162f 100644
--- a/vl.c
+++ b/vl.c
@@ -3761,11 +3761,6 @@ int main(int argc, char **argv, char **envp)
qdev_machine_creation_done();
- if (rom_load_all() != 0) {
- fprintf(stderr, "rom loading failed\n");
- exit(1);
- }
-
/* TODO: once all bus devices are qdevified, this should be done
* when bus is created by qdev.c */
qemu_register_reset(qbus_reset_all_fn, sysbus_get_default());
--
1.7.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 0/5] register reset handlers to reload image
2012-10-26 8:02 [Qemu-devel] [PATCH 0/5] register reset handlers to reload image Olivia Yin
2012-10-26 8:02 ` [Qemu-devel] [PATCH 1/5] define image_file_reset and image_blob_reset Olivia Yin
@ 2012-10-26 9:17 ` 陳韋任 (Wei-Ren Chen)
1 sibling, 0 replies; 10+ messages in thread
From: 陳韋任 (Wei-Ren Chen) @ 2012-10-26 9:17 UTC (permalink / raw)
To: Olivia Yin; +Cc: qemu-ppc, qemu-devel
On Fri, Oct 26, 2012 at 04:02:01PM +0800, Olivia Yin wrote:
> Register reset handlers image_blob_reset and image_file_reset
> to reload images when virtual machine reset.
>
> This way could optimize footprint of QEMU.
>
> This is the first part of the patches which remove rom related
> functions in loader.c
> The second part will optimize memory regions which use rom_ptr.
>
> Signed-off-by: Olivia Yin <hong-hua.yin@freescale.com>
>
> 0001-define-image_file_reset-and-image_blob_reset.patch
> 0002-use-reset-handlers-to-reload-kernel-and-initrd.patch
> 0003-replace-rom_add_file-with-image_file_reset.patch
> 0004-replaece-rom_add_blob-with-image_blob_reset.patch
> 0005-remove-rom-related-functions-in-loader.patch
The patch format looks weird to me. Please refer to [1] to
see how to send patch to QEMU ML. You should use `git format-patch`
then `git send-email` to send your patchset. By deafult, `git send-mail`
should thread your patch together, which means every patch in the series
will be threaded to reply the first (cover) letter.
Regards,
chenwj
[1] http://wiki.qemu.org/Contribute/SubmitAPatch
--
Wei-Ren Chen (陳韋任)
Computer Systems Lab, Institute of Information Science,
Academia Sinica, Taiwan (R.O.C.)
Tel:886-2-2788-3799 #1667
Homepage: http://people.cs.nctu.edu.tw/~chenwj
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 1/5] define image_file_reset and image_blob_reset
2012-10-26 8:02 ` [Qemu-devel] [PATCH 1/5] define image_file_reset and image_blob_reset Olivia Yin
2012-10-26 8:02 ` [Qemu-devel] [PATCH 2/5] use reset handlers to reload kernel and initrd Olivia Yin
@ 2012-10-26 9:28 ` 陳韋任 (Wei-Ren Chen)
1 sibling, 0 replies; 10+ messages in thread
From: 陳韋任 (Wei-Ren Chen) @ 2012-10-26 9:28 UTC (permalink / raw)
To: Olivia Yin; +Cc: qemu-ppc, qemu-devel
> +typedef struct ImageFile ImageFile;
> +struct ImageFile {
> + char *name;
> + char *dir;
> + target_phys_addr_t addr;
target_phys_addr_t has been replaced with hwaddr,
see [1].
> +};
> +
> +typedef struct ImageBlob ImageBlob;
> +struct ImageBlob {
> + char *name;
> + target_phys_addr_t addr;
ditto.
Regards,
chenwj
[1]
http://git.qemu.org/qemu.git/commit/?id=51ef67270b1d10e1fcf3de7368dccad1ba0bf9d1
--
Wei-Ren Chen (陳韋任)
Computer Systems Lab, Institute of Information Science,
Academia Sinica, Taiwan (R.O.C.)
Tel:886-2-2788-3799 #1667
Homepage: http://people.cs.nctu.edu.tw/~chenwj
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 2/5] use reset handlers to reload kernel and initrd
2012-10-26 8:02 ` [Qemu-devel] [PATCH 2/5] use reset handlers to reload kernel and initrd Olivia Yin
2012-10-26 8:02 ` [Qemu-devel] [PATCH 3/5] replace rom_add_file* with image_file_reset Olivia Yin
@ 2012-10-26 9:32 ` 陳韋任 (Wei-Ren Chen)
2012-10-29 5:12 ` Yin Olivia-R63875
1 sibling, 1 reply; 10+ messages in thread
From: 陳韋任 (Wei-Ren Chen) @ 2012-10-26 9:32 UTC (permalink / raw)
To: Olivia Yin; +Cc: qemu-ppc, qemu-devel
> -/* 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)
^^^^^^^^^^^^^^^^^^
Use hwaddr instead. I guess you need rebase to the trunk which
replace target_phys_addr_t with hwaddr everywhere.
Regards,
chenwj
--
Wei-Ren Chen (陳韋任)
Computer Systems Lab, Institute of Information Science,
Academia Sinica, Taiwan (R.O.C.)
Tel:886-2-2788-3799 #1667
Homepage: http://people.cs.nctu.edu.tw/~chenwj
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 2/5] use reset handlers to reload kernel and initrd
2012-10-26 9:32 ` [Qemu-devel] [PATCH 2/5] use reset handlers to reload kernel and initrd 陳韋任 (Wei-Ren Chen)
@ 2012-10-29 5:12 ` Yin Olivia-R63875
0 siblings, 0 replies; 10+ messages in thread
From: Yin Olivia-R63875 @ 2012-10-29 5:12 UTC (permalink / raw)
To: 陳韋任 (Wei-Ren Chen)
Cc: qemu-ppc@nongnu.org, qemu-devel@nongnu.org
Hi Wei-Ren,
Thanks for the reminder. I'll update the patches and submit again.
Best Regards,
Olivia
> -----Original Message-----
> From: 陳韋任 (Wei-Ren Chen) [mailto:chenwj@iis.sinica.edu.tw]
> Sent: Friday, October 26, 2012 5:32 PM
> To: Yin Olivia-R63875
> Cc: qemu-ppc@nongnu.org; qemu-devel@nongnu.org
> Subject: Re: [Qemu-devel] [PATCH 2/5] use reset handlers to reload kernel
> and initrd
>
> > -/* 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)
> ^^^^^^^^^^^^^^^^^^
> Use hwaddr instead. I guess you need rebase to the trunk which replace
> target_phys_addr_t with hwaddr everywhere.
>
> Regards,
> chenwj
>
> --
> Wei-Ren Chen (陳韋任)
> Computer Systems Lab, Institute of Information Science, Academia Sinica,
> Taiwan (R.O.C.)
> Tel:886-2-2788-3799 #1667
> Homepage: http://people.cs.nctu.edu.tw/~chenwj
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2012-10-29 5:13 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-10-26 8:02 [Qemu-devel] [PATCH 0/5] register reset handlers to reload image Olivia Yin
2012-10-26 8:02 ` [Qemu-devel] [PATCH 1/5] define image_file_reset and image_blob_reset Olivia Yin
2012-10-26 8:02 ` [Qemu-devel] [PATCH 2/5] use reset handlers to reload kernel and initrd Olivia Yin
2012-10-26 8:02 ` [Qemu-devel] [PATCH 3/5] replace rom_add_file* with image_file_reset Olivia Yin
2012-10-26 8:02 ` [Qemu-devel] [PATCH 4/5] replaece rom_add_blob* with image_blob_reset Olivia Yin
2012-10-26 8:02 ` [Qemu-devel] [PATCH 5/5] remove rom related functions in loader Olivia Yin
2012-10-26 9:32 ` [Qemu-devel] [PATCH 2/5] use reset handlers to reload kernel and initrd 陳韋任 (Wei-Ren Chen)
2012-10-29 5:12 ` Yin Olivia-R63875
2012-10-26 9:28 ` [Qemu-devel] [PATCH 1/5] define image_file_reset and image_blob_reset 陳韋任 (Wei-Ren Chen)
2012-10-26 9:17 ` [Qemu-devel] [PATCH 0/5] register reset handlers to reload image 陳韋任 (Wei-Ren Chen)
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).