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 <glommer@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
d4d698f020
commit
e28f988427
25
hw/pc.c
25
hw/pc.c
@ -63,6 +63,30 @@ static PITState *pit;
|
|||||||
static IOAPICState *ioapic;
|
static IOAPICState *ioapic;
|
||||||
static PCIDevice *i440fx_state;
|
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)
|
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 */
|
/* Round up optiom rom size to the next 2k boundary */
|
||||||
size = (size + 2047) & ~2047;
|
size = (size + 2047) & ~2047;
|
||||||
|
option_rom_setup_reset(start, size);
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user