Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 3160499aacb81f6735941eb4c372d87a > files > 643

kvm-83-164.el5_5.30.src.rpm

From 8456651cea88e12ed16bb208e71e8d2cc821bb42 Mon Sep 17 00:00:00 2001
From: Yaniv Kamay <yaniv@qumranet.com>
Date: Sun, 22 Mar 2009 15:36:20 +0200
Subject: [PATCH 5/6] vdi_port: fix migration

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Bugzilla: 492365
RH-Upstream-status: pending
Acked-by: Juan Quintela <quintela@redhat.com>
Acked-by: Izik Eidus <ieidus@redhat.com>
---
 qemu/audio/vd_interface_audio.c |    4 ----
 qemu/hw/qxl.c                   |   23 ++++++++++++++++++++++-
 qemu/hw/qxl_dev.h               |    2 +-
 3 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/qemu/audio/vd_interface_audio.c b/qemu/audio/vd_interface_audio.c
index 714bda3..15d017f 100644
--- a/qemu/audio/vd_interface_audio.c
+++ b/qemu/audio/vd_interface_audio.c
@@ -307,14 +307,12 @@ static int line_out_ctl(HWVoiceOut *hw, int cmd, ...)
 
     switch (cmd) {
     case VOICE_ENABLE:
-        dprintf("VOICE_ENABLE");
         voice_out->prev_ticks = get_monotonic_time();
         if (driver.play_plug) {
             driver.play_plug->start(driver.play_plug);
         }
         break;
     case VOICE_DISABLE:
-        dprintf("VOICE_DISABLE");
         if (driver.play_plug) {
             if (driver.play_frame) {
                 uint32_t *frame = driver.play_frame;
@@ -436,13 +434,11 @@ static int line_in_ctl(HWVoiceIn *hw, int cmd, ...)
     switch (cmd) {
     case VOICE_ENABLE:
         voice_in->prev_ticks = get_monotonic_time();
-        dprintf("VOICE_ENABLE");
         if (driver.record_plug) {
             driver.record_plug->start(driver.record_plug);
         }
         break;
     case VOICE_DISABLE:
-        dprintf("VOICE_DISABLE");
         if (driver.record_plug) {
             driver.record_plug->stop(driver.record_plug);
         }
diff --git a/qemu/hw/qxl.c b/qemu/hw/qxl.c
index effc1a5..e61d3ed 100644
--- a/qemu/hw/qxl.c
+++ b/qemu/hw/qxl.c
@@ -661,9 +661,21 @@ static void qxl_reset(PCIQXLDevice *d)
     }
 }
 
+static inline void vdi_port_set_dirty(PCIVDIPortDevice *d, void *start, uint32_t length)
+{
+    ram_addr_t addr =  (ram_addr_t)start - (ram_addr_t)d->ram + d->ram_offset;
+    ram_addr_t end =  ALIGN(addr + length, TARGET_PAGE_SIZE);
+
+    do {
+        cpu_physical_memory_set_dirty(addr);
+        addr += TARGET_PAGE_SIZE;
+    } while ( addr < end );
+}
+
 static void vdi_port_new_gen(PCIVDIPortDevice *d)
 {
     d->ram->generation = (d->ram->generation + 1 == 0) ? 1 : d->ram->generation + 1;
+    vdi_port_set_dirty(d, &d->ram->generation, sizeof(d->ram->generation));
 }
 
 static int vdi_port_irq_level(PCIVDIPortDevice *d)
@@ -685,6 +697,7 @@ static void vdi_port_notify_guest(PCIVDIPortDevice *d)
     }
     atomic_or(&d->ram->int_pending, events);
     qemu_set_irq(d->pci_dev.irq[0], vdi_port_irq_level(d));
+    vdi_port_set_dirty(d, &d->ram->int_pending, sizeof(d->ram->int_pending));
 }
 
 #ifdef CONFIG_SPICE
@@ -737,16 +750,20 @@ static int vdi_port_interface_write(VDIPortInterface *port, VDObjectRef plug,
         if (wait) {
             break;
         }
+
         packet = RING_PROD_ITEM(ring);
         packet->gen = d->ram->generation;
         packet->size = MIN(len, sizeof(packet->data));
         memcpy(packet->data, buf, packet->size);
+        vdi_port_set_dirty(d, packet, sizeof(*packet) - (sizeof(packet->data) - packet->size));
+
         RING_PUSH(ring, notify);
         do_notify = do_notify || notify;   
         len -= packet->size;
         buf += packet->size;
         actual_write += packet->size;
     }
+    vdi_port_set_dirty(d, ring, sizeof(*ring) - sizeof(ring->items));
 
     if (do_notify) {
         vdi_port_notify_guest(d);
@@ -786,6 +803,7 @@ static int vdi_port_interface_read(VDIPortInterface *port, VDObjectRef plug,
 
         packet = RING_CONS_ITEM(ring);
         if (packet->size > sizeof(packet->data)) {
+            vdi_port_set_dirty(d, ring, sizeof(*ring) - sizeof(ring->items));
             printf("%s: bad packet size\n", __FUNCTION__);
             return 0;
         }
@@ -802,6 +820,7 @@ static int vdi_port_interface_read(VDIPortInterface *port, VDObjectRef plug,
             do_notify = do_notify || notify;
         }
     }
+    vdi_port_set_dirty(d, ring, sizeof(*ring) - sizeof(ring->items));
 
     if (do_notify) {
         vdi_port_notify_guest(d);
@@ -1262,6 +1281,7 @@ int qxl_vga_touch(void)
     return ret;
 }
 
+//todo: use cpu_physical_memory_set_dirty instead of manual copy
 static void qxl_save(QEMUFile* f, void* opaque)
 {
     PCIQXLDevice* d=(PCIQXLDevice*)opaque;
@@ -1734,7 +1754,7 @@ static void vdi_port_ram_map(PCIDevice *pci_dev, int region_num,
     ASSERT((addr & (size - 1)) == 0);
     ASSERT(size ==  d->ram_size);
 
-    cpu_register_physical_memory(addr, size, d->ram_offset | IO_MEM_ROM);
+    cpu_register_physical_memory(addr, size, d->ram_offset | IO_MEM_RAM);
 }
 
 static void vdi_port_reset(PCIVDIPortDevice *d)
@@ -1750,6 +1770,7 @@ static void vdi_port_reset(PCIVDIPortDevice *d)
 #ifdef CONFIG_SPICE
     d->plug_read_pos = 0;
 #endif
+     vdi_port_set_dirty(d, d->ram, sizeof(*d->ram));
 }
 
 static void vdi_port_reset_handler(void *opaque)
diff --git a/qemu/hw/qxl_dev.h b/qemu/hw/qxl_dev.h
index e739632..15b8fb9 100644
--- a/qemu/hw/qxl_dev.h
+++ b/qemu/hw/qxl_dev.h
@@ -172,7 +172,7 @@ typedef struct ATTR_PACKED QXLCursorCmd {
         } trail;
         Point16 position;
     } u;
-    UINT8 device_data[QXL_CURSUR_DEVICE_DATA_SIZE]; //todo: dynamic size from rom
+    UINT8 device_data[QXL_CURSUR_DEVICE_DATA_SIZE]; //todo: use host memory
 } QXLCursorCmd;
 
 enum {
-- 
1.6.1