Commit e28f988427c3a27cf42ef2229f12f0a7e67cb00c

Authored by Glauber Costa
Committed by Anthony Liguori
1 parent d4d698f0

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>
Showing 1 changed file with 25 additions and 0 deletions
... ... @@ -63,6 +63,30 @@ static PITState *pit;
63 63 static IOAPICState *ioapic;
64 64 static PCIDevice *i440fx_state;
65 65  
  66 +typedef struct rom_reset_data {
  67 + uint8_t *data;
  68 + target_phys_addr_t addr;
  69 + unsigned size;
  70 +} RomResetData;
  71 +
  72 +static void option_rom_reset(void *_rrd)
  73 +{
  74 + RomResetData *rrd = _rrd;
  75 +
  76 + cpu_physical_memory_write_rom(rrd->addr, rrd->data, rrd->size);
  77 +}
  78 +
  79 +static void option_rom_setup_reset(target_phys_addr_t addr, unsigned size)
  80 +{
  81 + RomResetData *rrd = qemu_malloc(sizeof *rrd);
  82 +
  83 + rrd->data = qemu_malloc(size);
  84 + cpu_physical_memory_read(addr, rrd->data, size);
  85 + rrd->addr = addr;
  86 + rrd->size = size;
  87 + qemu_register_reset(option_rom_reset, rrd);
  88 +}
  89 +
66 90 static void ioport80_write(void *opaque, uint32_t addr, uint32_t data)
67 91 {
68 92 }
... ... @@ -806,6 +830,7 @@ static int load_option_rom(const char *oprom, target_phys_addr_t start,
806 830 }
807 831 /* Round up optiom rom size to the next 2k boundary */
808 832 size = (size + 2047) & ~2047;
  833 + option_rom_setup_reset(start, size);
809 834 return size;
810 835 }
811 836  
... ...