From: Jan Kiszka <jan.kiszka@siemens.com>
To: qemu-devel <qemu-devel@nongnu.org>
Cc: Jordan Justen <jljusten@gmail.com>
Subject: [Qemu-devel] [PATCH v2] pc_sysfw: Always use alias for ISA BIOS region
Date: Fri, 02 Nov 2012 19:55:41 +0100 [thread overview]
Message-ID: <5094172D.8010303@siemens.com> (raw)
In-Reply-To: <5092A406.6030402@web.de>
This is no technical reason (anymore) for copying the ISA BIOS from the
original region. Instead, refactor pc_isa_bios_init to serve both pflash
and old-style BIOS setup.
Unfortunately, the previous RAM-backed version created an additional
vmstate section, content-wise redundant to the BIOS, but we still need
to process it when working in compat mode.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
Changes in v2:
- create dummy vmstate section to enable migration from 1.1/1.2
hw/pc_piix.c | 4 ++++
hw/pc_sysfw.c | 55 +++++++++++++++++++++----------------------------------
2 files changed, 25 insertions(+), 34 deletions(-)
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index cfa839c..0051b2a 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -386,6 +386,10 @@ static QEMUMachine pc_machine_v1_3 = {
.driver = "VGA",\
.property = "mmio",\
.value = "off",\
+ },{\
+ .driver = "pc-sysfw",\
+ .property = "compat_vmsection",\
+ .value = "on",\
}
static QEMUMachine pc_machine_v1_2 = {
diff --git a/hw/pc_sysfw.c b/hw/pc_sysfw.c
index 9d7c5f4..a60f453 100644
--- a/hw/pc_sysfw.c
+++ b/hw/pc_sysfw.c
@@ -38,40 +38,36 @@
typedef struct PcSysFwDevice {
SysBusDevice busdev;
uint8_t rom_only;
+ uint32_t compat_vmsection;
} PcSysFwDevice;
static void pc_isa_bios_init(MemoryRegion *rom_memory,
- MemoryRegion *flash_mem,
- int ram_size)
+ MemoryRegion *bios, bool compat_vmsection)
{
+ uint64_t bios_size = memory_region_size(bios);
int isa_bios_size;
MemoryRegion *isa_bios;
- uint64_t flash_size;
- void *flash_ptr, *isa_bios_ptr;
-
- flash_size = memory_region_size(flash_mem);
/* map the last 128KB of the BIOS in ISA space */
- isa_bios_size = flash_size;
+ isa_bios_size = bios_size;
if (isa_bios_size > (128 * 1024)) {
isa_bios_size = 128 * 1024;
}
isa_bios = g_malloc(sizeof(*isa_bios));
- memory_region_init_ram(isa_bios, "isa-bios", isa_bios_size);
- vmstate_register_ram_global(isa_bios);
+ memory_region_init_alias(isa_bios, "isa-bios", bios,
+ bios_size - isa_bios_size, isa_bios_size);
memory_region_add_subregion_overlap(rom_memory,
0x100000 - isa_bios_size,
isa_bios,
1);
+ memory_region_set_readonly(isa_bios, true);
- /* copy ISA rom image from top of flash memory */
- flash_ptr = memory_region_get_ram_ptr(flash_mem);
- isa_bios_ptr = memory_region_get_ram_ptr(isa_bios);
- memcpy(isa_bios_ptr,
- ((uint8_t*)flash_ptr) + (flash_size - isa_bios_size),
- isa_bios_size);
+ if (compat_vmsection) {
+ MemoryRegion *dummy_region = g_new(MemoryRegion, 1);
- memory_region_set_readonly(isa_bios, true);
+ memory_region_init_ram(dummy_region, "isa-bios", isa_bios_size);
+ vmstate_register_ram_global(dummy_region);
+ }
}
static void pc_fw_add_pflash_drv(void)
@@ -102,7 +98,7 @@ static void pc_fw_add_pflash_drv(void)
}
static void pc_system_flash_init(MemoryRegion *rom_memory,
- DriveInfo *pflash_drv)
+ DriveInfo *pflash_drv, bool compat_vmsection)
{
BlockDriverState *bdrv;
int64_t size;
@@ -129,14 +125,14 @@ static void pc_system_flash_init(MemoryRegion *rom_memory,
1, 0x0000, 0x0000, 0x0000, 0x0000, 0);
flash_mem = pflash_cfi01_get_memory(system_flash);
- pc_isa_bios_init(rom_memory, flash_mem, size);
+ pc_isa_bios_init(rom_memory, flash_mem, compat_vmsection);
}
static void old_pc_system_rom_init(MemoryRegion *rom_memory)
{
char *filename;
- MemoryRegion *bios, *isa_bios;
- int bios_size, isa_bios_size;
+ MemoryRegion *bios;
+ int bios_size;
int ret;
/* BIOS load */
@@ -167,19 +163,7 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory)
g_free(filename);
}
- /* map the last 128KB of the BIOS in ISA space */
- isa_bios_size = bios_size;
- if (isa_bios_size > (128 * 1024)) {
- isa_bios_size = 128 * 1024;
- }
- isa_bios = g_malloc(sizeof(*isa_bios));
- memory_region_init_alias(isa_bios, "isa-bios", bios,
- bios_size - isa_bios_size, isa_bios_size);
- memory_region_add_subregion_overlap(rom_memory,
- 0x100000 - isa_bios_size,
- isa_bios,
- 1);
- memory_region_set_readonly(isa_bios, true);
+ pc_isa_bios_init(rom_memory, bios, false);
/* map all the bios at the top of memory */
memory_region_add_subregion(rom_memory,
@@ -224,7 +208,8 @@ void pc_system_firmware_init(MemoryRegion *rom_memory)
}
if (pflash_drv != NULL) {
- pc_system_flash_init(rom_memory, pflash_drv);
+ pc_system_flash_init(rom_memory, pflash_drv,
+ sysfw_dev->compat_vmsection);
} else {
fprintf(stderr, "qemu: PC system firmware (pflash) not available\n");
exit(1);
@@ -233,6 +218,8 @@ void pc_system_firmware_init(MemoryRegion *rom_memory)
static Property pcsysfw_properties[] = {
DEFINE_PROP_UINT8("rom_only", PcSysFwDevice, rom_only, 0),
+ DEFINE_PROP_BIT("compat_vmsection", PcSysFwDevice, compat_vmsection, 0,
+ false),
DEFINE_PROP_END_OF_LIST(),
};
--
1.7.3.4
next prev parent reply other threads:[~2012-11-02 18:55 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-01 16:32 [Qemu-devel] [PATCH] pc_sysfw: Always use alias for ISA BIOS region Jan Kiszka
2012-11-01 17:15 ` Jordan Justen
2012-11-01 17:17 ` Jan Kiszka
2012-11-01 17:21 ` Jan Kiszka
2012-11-01 18:03 ` Jordan Justen
2012-11-01 18:23 ` Jan Kiszka
2012-11-02 18:55 ` Jan Kiszka [this message]
2012-11-02 21:17 ` [Qemu-devel] [PATCH v2] " Jordan Justen
2012-11-03 7:48 ` Jan Kiszka
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=5094172D.8010303@siemens.com \
--to=jan.kiszka@siemens.com \
--cc=jljusten@gmail.com \
--cc=qemu-devel@nongnu.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.