diff options
author | Avi Kivity <avi@redhat.com> | 2008-12-04 15:08:34 +0200 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2008-12-04 15:45:14 +0200 |
commit | 9bbe1e2fcc7b68b88f79dfcf84ce9d24f56ccb0c (patch) | |
tree | bb61e6a65bc9cf8f0ae7f916ee21e439b9184824 | |
parent | 57c1f215c21a929495a5fcdbd280ba6d6693b56c (diff) |
Temporarily disable logging around pci config writes (cirrus)kvm-80rc2
A pci config write may remap the cirrus linear frame buffer, confusing the
memory slot dirty logging logic.
Signed-off-by: Avi Kivity <avi@redhat.com>
-rw-r--r-- | hw/cirrus_vga.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/hw/cirrus_vga.c b/hw/cirrus_vga.c index 09f57041a..9fe1700f6 100644 --- a/hw/cirrus_vga.c +++ b/hw/cirrus_vga.c @@ -3348,6 +3348,17 @@ static void cirrus_pci_mmio_map(PCIDevice *d, int region_num, s->cirrus_mmio_io_addr); } +static void pci_cirrus_write_config(PCIDevice *d, + uint32_t address, uint32_t val, int len) +{ + PCICirrusVGAState *pvs = container_of(d, PCICirrusVGAState, dev); + CirrusVGAState *s = &pvs->cirrus_vga; + + vga_dirty_log_stop((VGAState *)s); + pci_default_write_config(d, address, val, len); + vga_dirty_log_start((VGAState *)s); +} + void pci_cirrus_vga_init(PCIBus *bus, DisplayState *ds, uint8_t *vga_ram_base, ram_addr_t vga_ram_offset, int vga_ram_size) { @@ -3361,7 +3372,7 @@ void pci_cirrus_vga_init(PCIBus *bus, DisplayState *ds, uint8_t *vga_ram_base, /* setup PCI configuration registers */ d = (PCICirrusVGAState *)pci_register_device(bus, "Cirrus VGA", sizeof(PCICirrusVGAState), - -1, NULL, NULL); + -1, NULL, pci_cirrus_write_config); pci_conf = d->dev.config; pci_conf[0x00] = (uint8_t) (PCI_VENDOR_CIRRUS & 0xff); pci_conf[0x01] = (uint8_t) (PCI_VENDOR_CIRRUS >> 8); |