From: Gerd Hoffmann <kra...@redhat.com> Signed-off-by: Gerd Hoffmann <kra...@redhat.com> --- hw/qxl.c | 40 ++++++++++++++++++++++++---------------- 1 files changed, 24 insertions(+), 16 deletions(-)
diff --git a/hw/qxl.c b/hw/qxl.c index bbba25d..26f80d5 100644 --- a/hw/qxl.c +++ b/hw/qxl.c @@ -735,7 +735,8 @@ static void qxl_vga_ioport_write(void *opaque, uint32_t addr, uint32_t val) vga_ioport_write(opaque, addr, val); } -static void qxl_add_memslot(PCIQXLDevice *d, uint32_t slot_id, uint64_t delta) +static void qxl_add_memslot(PCIQXLDevice *d, uint32_t slot_id, uint64_t delta, + QXLDevMemSlot *memslot) { static const int regions[] = { QXL_RAM_RANGE_INDEX, @@ -747,7 +748,6 @@ static void qxl_add_memslot(PCIQXLDevice *d, uint32_t slot_id, uint64_t delta) pcibus_t pci_start; pcibus_t pci_end; intptr_t virt_start; - QXLDevMemSlot memslot; int i; guest_start = le64_to_cpu(d->guest_slots[slot_id].slot.mem_start); @@ -793,21 +793,20 @@ static void qxl_add_memslot(PCIQXLDevice *d, uint32_t slot_id, uint64_t delta) abort(); } - memslot.slot_id = slot_id; - memslot.slot_group_id = MEMSLOT_GROUP_GUEST; /* guest group */ - memslot.virt_start = virt_start + (guest_start - pci_start); - memslot.virt_end = virt_start + (guest_end - pci_start); - memslot.addr_delta = memslot.virt_start - delta; - memslot.generation = d->rom->slot_generation = 0; + memslot->slot_id = slot_id; + memslot->slot_group_id = MEMSLOT_GROUP_GUEST; /* guest group */ + memslot->virt_start = virt_start + (guest_start - pci_start); + memslot->virt_end = virt_start + (guest_end - pci_start); + memslot->addr_delta = memslot->virt_start - delta; + memslot->generation = d->rom->slot_generation = 0; qxl_rom_set_dirty(d); dprint(d, 1, "%s: slot %d: host virt 0x%" PRIx64 " - 0x%" PRIx64 "\n", - __FUNCTION__, memslot.slot_id, - memslot.virt_start, memslot.virt_end); + __FUNCTION__, memslot->slot_id, + memslot->virt_start, memslot->virt_end); - qemu_spice_add_memslot(&d->ssd, &memslot); - d->guest_slots[slot_id].ptr = (void*)memslot.virt_start; - d->guest_slots[slot_id].size = memslot.virt_end - memslot.virt_start; + d->guest_slots[slot_id].ptr = (void*)memslot->virt_start; + d->guest_slots[slot_id].size = memslot->virt_end - memslot->virt_start; d->guest_slots[slot_id].delta = delta; d->guest_slots[slot_id].active = 1; } @@ -912,6 +911,7 @@ static void qxl_set_mode(PCIQXLDevice *d, int modenr, int loadvm) .mem_start = start, .mem_end = end }; + QXLDevMemSlot memslot; QXLSurfaceCreate surface = { .width = mode->x_res, .height = mode->y_res, @@ -929,7 +929,8 @@ static void qxl_set_mode(PCIQXLDevice *d, int modenr, int loadvm) } d->guest_slots[0].slot = slot; - qxl_add_memslot(d, 0, devmem); + qxl_add_memslot(d, 0, devmem, &memslot); + qemu_spice_add_memslot(&d->ssd, &memslot); d->guest_primary.surface = surface; qxl_create_guest_primary(d, 0); @@ -1011,11 +1012,16 @@ static void ioport_write(void *opaque, uint32_t addr, uint32_t val) qxl_hard_reset(d, 0); break; case QXL_IO_MEMSLOT_ADD: + { + QXLDevMemSlot memslot; + PANIC_ON(val >= NUM_MEMSLOTS); PANIC_ON(d->guest_slots[val].active); d->guest_slots[val].slot = d->ram->mem_slot; - qxl_add_memslot(d, val, 0); + qxl_add_memslot(d, val, 0, &memslot); + qemu_spice_add_memslot(&d->ssd, &memslot); break; + } case QXL_IO_MEMSLOT_DEL: qxl_del_memslot(d, val); break; @@ -1387,6 +1393,7 @@ static int qxl_post_load(void *opaque, int version) PCIQXLDevice* d = opaque; uint8_t *ram_start = d->vga.vram_ptr; QXLCommandExt *cmds; + QXLDevMemSlot memslot; int in, out, i, newmode; dprint(d, 1, "%s: start\n", __FUNCTION__); @@ -1415,7 +1422,8 @@ static int qxl_post_load(void *opaque, int version) if (!d->guest_slots[i].active) { continue; } - qxl_add_memslot(d, i, 0); + qxl_add_memslot(d, i, 0, &memslot); + qemu_spice_add_memslot(&d->ssd, &memslot); } qxl_create_guest_primary(d, 1); -- 1.7.5.4