summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIzik Eidus <ieidus@redhat.com>2009-12-23 21:55:59 +0200
committerYaniv Kamay <ykamay@redhat.com>2009-12-24 00:12:07 +0200
commitfc589875868ceefad8cac57018296ab23a68fbcd (patch)
tree4438fa8368176f93c7c0e9bf32c040d9882cb926
parentcef9698cb045f0e447736f257d4d2ff88c7fd8e0 (diff)
vdesktop: add shadow rom.0.4
This is needed in order not to let the guesst changes of the rom effect the qxl device. Signed-off-by: Izik Eidus <ieidus@redhat.com>
-rw-r--r--qemu/hw/qxl.c54
1 files changed, 35 insertions, 19 deletions
diff --git a/qemu/hw/qxl.c b/qemu/hw/qxl.c
index c3322b5c..bd117251 100644
--- a/qemu/hw/qxl.c
+++ b/qemu/hw/qxl.c
@@ -22,7 +22,7 @@
#define QXL_VRAM_SIZE 4096
#define QXL_DEFAULT_COMPRESSION_LEVEL 0
#define QXL_SHARED_VGA_MODE FALSE
-#define QXL_SAVE_VERSION 3
+#define QXL_SAVE_VERSION 4
#define VDI_PORT_SAVE_VERSION 1
#define ASSERT(x) if (!(x)) { \
@@ -89,6 +89,7 @@ enum {
typedef struct QXLState {
uint32_t io_base;
QXLRom *rom;
+ QXLRom shadow_rom;
QXLModes *modes;
uint64_t rom_offset;
uint32_t rom_size;
@@ -272,6 +273,7 @@ void qxl_do_set_log_level(int log_level)
PCIQXLDevice *d = dev_list;
while (d) {
d->state.rom->log_level = log_level;
+ d->state.shadow_rom.log_level = log_level;
d = d->dev_next;
}
}
@@ -315,7 +317,7 @@ static void qxl_send_events(PCIQXLDevice *d, uint32_t events)
static void set_dreaw_area(PCIQXLDevice *d, QXLDevInfo *info)
{
int stride = info->x_res * sizeof(uint32_t);
- info->draw_area.buf = (uint8_t *)d->state.ram_start + d->state.rom->draw_area_offset;
+ info->draw_area.buf = (uint8_t *)d->state.ram_start + d->state.shadow_rom.draw_area_offset;
info->draw_area.size = stride * info->y_res;
info->draw_area.line_0 = info->draw_area.buf + info->draw_area.size - stride;
info->draw_area.stride = -stride;
@@ -328,7 +330,7 @@ static void _qxl_get_info(PCIQXLDevice *d, QXLDevInfo *info)
QXLState *state = &d->state;
QXLMode *mode;
- info->ram_size = state->rom->num_io_pages << TARGET_PAGE_BITS;
+ info->ram_size = state->shadow_rom.num_io_pages << TARGET_PAGE_BITS;
if (state->mode == QXL_MODE_VGA) {
info->x_res = qxl_vga.ds->width;
@@ -343,14 +345,14 @@ static void _qxl_get_info(PCIQXLDevice *d, QXLDevInfo *info)
return;
}
- mode = &qxl_modes[d->state.rom->mode];
+ mode = &qxl_modes[d->state.shadow_rom.mode];
info->x_res = mode->x_res;
info->y_res = mode->y_res;
info->bits = mode->bits;
info->use_hardware_cursor = TRUE;
- info->phys_start = (unsigned long)state->ram_start + state->rom->pages_offset;
+ info->phys_start = (unsigned long)state->ram_start + state->shadow_rom.pages_offset;
info->phys_end = (unsigned long)state->ram_start + state->ram_size;
info->phys_delta = (long)state->ram_start - state->ram_phys_addr;
set_dreaw_area(d, info);
@@ -513,6 +515,7 @@ static void _qxl_notify_update(PCIQXLDevice *d, uint32_t update_id)
return;
}
d->state.rom->update_id = update_id;
+ d->state.shadow_rom.update_id = update_id;
qxl_send_events(d, QXL_INTERRUPT_DISPLAY);
}
@@ -597,6 +600,7 @@ static void qxl_set_mode(PCIQXLDevice *d, uint32_t mode)
ASSERT(RING_IS_EMPTY(&d->state.vga_ring));
qxl_reset_state(d);
qxl_exit_vga_mode(d);
+ d->state.shadow_rom.mode = mode;
d->state.rom->mode = mode;
memset(d->state.vram, 0, d->state.vram_size);
d->state.mode = QXL_MODE_NATIVE;
@@ -623,6 +627,7 @@ static void qxl_enter_vga_mode(PCIQXLDevice *d)
}
printf("%u: %s\n", d->id, __FUNCTION__);
d->state.rom->mode = ~0;
+ d->state.shadow_rom.mode = ~0;
d->state.mode = QXL_MODE_VGA;
qxl_notify_mode_change(d);
qxl_add_vga_client();
@@ -640,7 +645,8 @@ static void qxl_reset_state(PCIQXLDevice *d)
ram->magic = QXL_RAM_MAGIC;
ram->int_pending = 0;
ram->int_mask = 0;
- rom->update_id = 0;
+ d->state.shadow_rom.update_id = 0;
+ *rom = d->state.shadow_rom;
RING_INIT(&ram->cmd_ring);
RING_INIT(&ram->cursor_ring);
RING_INIT(&d->state.vga_ring);
@@ -1093,6 +1099,7 @@ static uint32_t init_qxl_rom(PCIQXLDevice *d, uint8_t *buf, uint32_t vram_size,
*max_fb = MAX(qxl_modes[i].y_res * qxl_modes[i].stride, *max_fb);
modes->modes[i] = qxl_modes[i];
}
+ s->shadow_rom = *rom;
s->rom = rom;
s->modes = modes;
return (uint32_t)((uint8_t *)&modes->modes[i] - buf);
@@ -1105,22 +1112,26 @@ static void init_qxl_ram(QXLState *s, uint8_t *buf, uint32_t actual_ram_size)
s->ram_start = buf;
- draw_area_size = s->rom->draw_area_size;
+ draw_area_size = s->shadow_rom.draw_area_size;
ram_header_size = ALIGN(sizeof(*s->ram), 8);
ASSERT(ram_header_size + draw_area_size < actual_ram_size);
- s->rom->ram_header_offset = actual_ram_size - ram_header_size;
- s->ram = (QXLRam *)(buf + s->rom->ram_header_offset);
+ s->shadow_rom.ram_header_offset = actual_ram_size - ram_header_size;
+ s->ram = (QXLRam *)(buf + s->shadow_rom.ram_header_offset);
s->ram->magic = QXL_RAM_MAGIC;
RING_INIT(&s->ram->cmd_ring);
RING_INIT(&s->ram->cursor_ring);
RING_INIT(&s->ram->release_ring);
*RING_PROD_ITEM(&s->ram->release_ring) = 0;
- s->rom->draw_area_offset = s->rom->ram_header_offset - draw_area_size;
- s->rom->pages_offset = 0;
- s->rom->num_io_pages = (actual_ram_size - (draw_area_size + ram_header_size)) >> TARGET_PAGE_BITS;
- printf("%s: npages %u\n", __FUNCTION__, s->rom->num_io_pages);
+ s->shadow_rom.draw_area_offset = s->shadow_rom.ram_header_offset - draw_area_size;
+ s->shadow_rom.pages_offset = 0;
+ s->shadow_rom.num_io_pages =
+ (actual_ram_size -(draw_area_size + ram_header_size)) >> TARGET_PAGE_BITS;
+
+ *s->rom = s->shadow_rom;
+
+ printf("%s: npages %u\n", __FUNCTION__, s->shadow_rom.num_io_pages);
}
inline uint32_t msb_mask(uint32_t val)
@@ -1301,6 +1312,7 @@ static void qxl_save(QEMUFile* f, void* opaque)
pci_device_save(&d->pci_dev, f);
qemu_put_be32(f, s->rom->mode);
+ qemu_put_be32(f, s->shadow_rom.mode);
qemu_put_be32(f, s->num_free_res);
if (s->last_release == NULL)
@@ -1329,8 +1341,9 @@ static int qxl_load(QEMUFile* f,void* opaque,int version_id)
uint32_t last_release_offset;
int ret;
- if (version_id != QXL_SAVE_VERSION)
+ if (version_id < 3 || version_id > QXL_SAVE_VERSION) {
return -EINVAL;
+ }
ret = pci_device_load(&d->pci_dev, f);
if (ret) {
@@ -1346,7 +1359,12 @@ static int qxl_load(QEMUFile* f,void* opaque,int version_id)
qxl_remove_vga_client();
}
- s->rom->mode = qemu_get_be32(f);
+ s->rom->mode = qemu_get_be32(f);
+ if (version_id == 3) {
+ s->shadow_rom.mode = s->rom->mode;
+ } else {
+ s->shadow_rom.mode = qemu_get_be32(f);
+ }
s->num_free_res = qemu_get_be32(f);
last_release_offset = qemu_get_be32(f);
@@ -1375,10 +1393,6 @@ static int qxl_load(QEMUFile* f,void* opaque,int version_id)
qemu_get_buffer(f, s->worker_data, s->worker_data_size);
}
- if (version_id == 2) {
- qemu_get_byte(f);
- }
-
if (s->mode == QXL_MODE_VGA) {
qxl_add_vga_client();
}
@@ -1533,12 +1547,14 @@ static void interface_attache_worker(QXLInterface *qxl, QXLWorker *qxl_worker)
static void interface_set_compression_level(QXLInterface *qxl, int level)
{
PCIQXLDevice *d = ((Interface *)qxl)->d;
+ d->state.shadow_rom.compression_level = level;
d->state.rom->compression_level = level;
}
static void interface_set_mm_time(QXLInterface *qxl, uint32_t mm_time)
{
PCIQXLDevice *d = ((Interface *)qxl)->d;
+ d->state.shadow_rom.mm_clock = mm_time;
d->state.rom->mm_clock = mm_time;
}