mirror of https://github.com/xqemu/xqemu.git
hw/qxl: ignore guest from guestbug until reset
soft_reset is called from any of: * QXL_IO_RESET * vga io * pci reset handler Signed-off-by: Alon Levy <alevy@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
0f7bfd8198
commit
087e6a42ed
13
hw/qxl.c
13
hw/qxl.c
|
@ -141,6 +141,7 @@ static void qxl_ring_set_dirty(PCIQXLDevice *qxl);
|
||||||
void qxl_set_guest_bug(PCIQXLDevice *qxl, const char *msg, ...)
|
void qxl_set_guest_bug(PCIQXLDevice *qxl, const char *msg, ...)
|
||||||
{
|
{
|
||||||
qxl_send_events(qxl, QXL_INTERRUPT_ERROR);
|
qxl_send_events(qxl, QXL_INTERRUPT_ERROR);
|
||||||
|
qxl->guest_bug = 1;
|
||||||
if (qxl->guestdebug) {
|
if (qxl->guestdebug) {
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, msg);
|
va_start(ap, msg);
|
||||||
|
@ -151,6 +152,10 @@ void qxl_set_guest_bug(PCIQXLDevice *qxl, const char *msg, ...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void qxl_clear_guest_bug(PCIQXLDevice *qxl)
|
||||||
|
{
|
||||||
|
qxl->guest_bug = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void qxl_spice_update_area(PCIQXLDevice *qxl, uint32_t surface_id,
|
void qxl_spice_update_area(PCIQXLDevice *qxl, uint32_t surface_id,
|
||||||
struct QXLRect *area, struct QXLRect *dirty_rects,
|
struct QXLRect *area, struct QXLRect *dirty_rects,
|
||||||
|
@ -572,7 +577,7 @@ static int interface_get_command(QXLInstance *sin, struct QXLCommandExt *ext)
|
||||||
case QXL_MODE_NATIVE:
|
case QXL_MODE_NATIVE:
|
||||||
case QXL_MODE_UNDEFINED:
|
case QXL_MODE_UNDEFINED:
|
||||||
ring = &qxl->ram->cmd_ring;
|
ring = &qxl->ram->cmd_ring;
|
||||||
if (SPICE_RING_IS_EMPTY(ring)) {
|
if (qxl->guest_bug || SPICE_RING_IS_EMPTY(ring)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
SPICE_RING_CONS_ITEM(qxl, ring, cmd);
|
SPICE_RING_CONS_ITEM(qxl, ring, cmd);
|
||||||
|
@ -980,6 +985,7 @@ static void qxl_soft_reset(PCIQXLDevice *d)
|
||||||
{
|
{
|
||||||
trace_qxl_soft_reset(d->id);
|
trace_qxl_soft_reset(d->id);
|
||||||
qxl_check_state(d);
|
qxl_check_state(d);
|
||||||
|
qxl_clear_guest_bug(d);
|
||||||
|
|
||||||
if (d->id == 0) {
|
if (d->id == 0) {
|
||||||
qxl_enter_vga_mode(d);
|
qxl_enter_vga_mode(d);
|
||||||
|
@ -1297,6 +1303,10 @@ static void ioport_write(void *opaque, target_phys_addr_t addr,
|
||||||
qxl_async_io async = QXL_SYNC;
|
qxl_async_io async = QXL_SYNC;
|
||||||
uint32_t orig_io_port = io_port;
|
uint32_t orig_io_port = io_port;
|
||||||
|
|
||||||
|
if (d->guest_bug && !io_port == QXL_IO_RESET) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch (io_port) {
|
switch (io_port) {
|
||||||
case QXL_IO_RESET:
|
case QXL_IO_RESET:
|
||||||
case QXL_IO_SET_MODE:
|
case QXL_IO_SET_MODE:
|
||||||
|
@ -1749,6 +1759,7 @@ static int qxl_init_common(PCIQXLDevice *qxl)
|
||||||
qemu_mutex_init(&qxl->track_lock);
|
qemu_mutex_init(&qxl->track_lock);
|
||||||
qemu_mutex_init(&qxl->async_lock);
|
qemu_mutex_init(&qxl->async_lock);
|
||||||
qxl->current_async = QXL_UNDEFINED_IO;
|
qxl->current_async = QXL_UNDEFINED_IO;
|
||||||
|
qxl->guest_bug = 0;
|
||||||
|
|
||||||
switch (qxl->revision) {
|
switch (qxl->revision) {
|
||||||
case 1: /* spice 0.4 -- qxl-1 */
|
case 1: /* spice 0.4 -- qxl-1 */
|
||||||
|
|
3
hw/qxl.h
3
hw/qxl.h
|
@ -31,6 +31,9 @@ typedef struct PCIQXLDevice {
|
||||||
uint32_t debug;
|
uint32_t debug;
|
||||||
uint32_t guestdebug;
|
uint32_t guestdebug;
|
||||||
uint32_t cmdlog;
|
uint32_t cmdlog;
|
||||||
|
|
||||||
|
uint32_t guest_bug;
|
||||||
|
|
||||||
enum qxl_mode mode;
|
enum qxl_mode mode;
|
||||||
uint32_t cmdflags;
|
uint32_t cmdflags;
|
||||||
int generation;
|
int generation;
|
||||||
|
|
Loading…
Reference in New Issue