From: Glauber Costa Date: Fri, 8 May 2009 05:22:12 +0000 (-0300) Subject: register reset handler for option_roms X-Git-Tag: v0.10.4~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b468f27acd45de96026f69397e2a38fcd831a718;p=thirdparty%2Fqemu.git register reset handler for option_roms 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 Signed-off-by: Anthony Liguori --- diff --git a/hw/pc.c b/hw/pc.c index 6e3d03f6c81..c33cd75569c 100644 --- 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) { }