aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAvi Kivity <avi@redhat.com>2008-12-04 15:08:34 +0200
committerAvi Kivity <avi@redhat.com>2008-12-04 15:45:14 +0200
commit9bbe1e2fcc7b68b88f79dfcf84ce9d24f56ccb0c (patch)
treebb61e6a65bc9cf8f0ae7f916ee21e439b9184824
parent57c1f215c21a929495a5fcdbd280ba6d6693b56c (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.c13
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);