register reset handler for option_roms
authorGlauber Costa <glommer@redhat.com>
Fri, 8 May 2009 05:22:12 +0000 (02:22 -0300)
committerAnthony Liguori <aliguori@us.ibm.com>
Fri, 8 May 2009 20:24:10 +0000 (15:24 -0500)
Currently, boot options are not preserved across a system reset.
option roms can modify themselves, or can for instance restore the real
int 0x19 vector after they tried to boot from it.

To properly do that, we need a reset handler registered to deal with option
roms. This patch is based on current version on qemu-kvm.git

Signed-off-by: Glauber Costa <glommer@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>

hw/pc.c

diff --git a/hw/pc.c b/hw/pc.c
index 61f6e7b..0025474 100644 (file)
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -63,6 +63,30 @@ static PITState *pit;
 static IOAPICState *ioapic;
 static PCIDevice *i440fx_state;
 
+typedef struct rom_reset_data {
+    uint8_t *data;
+    target_phys_addr_t addr;
+    unsigned size;
+} RomResetData;
+
+static void option_rom_reset(void *_rrd)
+{
+    RomResetData *rrd = _rrd;
+
+    cpu_physical_memory_write_rom(rrd->addr, rrd->data, rrd->size);
+}
+
+static void option_rom_setup_reset(target_phys_addr_t addr, unsigned size)
+{
+    RomResetData *rrd = qemu_malloc(sizeof *rrd);
+
+    rrd->data = qemu_malloc(size);
+    cpu_physical_memory_read(addr, rrd->data, size);
+    rrd->addr = addr;
+    rrd->size = size;
+    qemu_register_reset(option_rom_reset, rrd);
+}
+
 static void ioport80_write(void *opaque, uint32_t addr, uint32_t data)
 {
 }
@@ -806,6 +830,7 @@ static int load_option_rom(const char *oprom, target_phys_addr_t start,
         }
         /* Round up optiom rom size to the next 2k boundary */
         size = (size + 2047) & ~2047;
+        option_rom_setup_reset(start, size);
         return size;
 }