mirror of https://gitee.com/openkylin/qemu.git
virtio-vga: fix reset.
Store reset handler of the parent class and just call that for a complete virtio reset. When taking the shortcut and calling virtio_gpu_reset() directly the generic virtio reset code (for virtqueues etc) will not be executed. Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1597621 Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Message-id: 20190307080244.9011-3-kraxel@redhat.com
This commit is contained in:
parent
8ea90ee690
commit
3912e66a3f
|
@ -12,6 +12,10 @@
|
|||
#define TYPE_VIRTIO_VGA "virtio-vga"
|
||||
#define VIRTIO_VGA(obj) \
|
||||
OBJECT_CHECK(VirtIOVGA, (obj), TYPE_VIRTIO_VGA)
|
||||
#define VIRTIO_VGA_GET_CLASS(obj) \
|
||||
OBJECT_GET_CLASS(VirtIOVGAClass, obj, TYPE_VIRTIO_VGA)
|
||||
#define VIRTIO_VGA_CLASS(klass) \
|
||||
OBJECT_CLASS_CHECK(VirtIOVGAClass, klass, TYPE_VIRTIO_VGA)
|
||||
|
||||
typedef struct VirtIOVGA {
|
||||
VirtIOPCIProxy parent_obj;
|
||||
|
@ -20,6 +24,11 @@ typedef struct VirtIOVGA {
|
|||
MemoryRegion vga_mrs[3];
|
||||
} VirtIOVGA;
|
||||
|
||||
typedef struct VirtIOVGAClass {
|
||||
VirtioPCIClass parent_class;
|
||||
DeviceReset parent_reset;
|
||||
} VirtIOVGAClass;
|
||||
|
||||
static void virtio_vga_invalidate_display(void *opaque)
|
||||
{
|
||||
VirtIOVGA *vvga = opaque;
|
||||
|
@ -168,10 +177,11 @@ static void virtio_vga_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
|
|||
|
||||
static void virtio_vga_reset(DeviceState *dev)
|
||||
{
|
||||
VirtIOVGAClass *klass = VIRTIO_VGA_GET_CLASS(dev);
|
||||
VirtIOVGA *vvga = VIRTIO_VGA(dev);
|
||||
|
||||
/* reset virtio-gpu */
|
||||
virtio_gpu_reset(VIRTIO_DEVICE(&vvga->vdev));
|
||||
klass->parent_reset(dev);
|
||||
|
||||
/* reset vga */
|
||||
vga_common_reset(&vvga->vga);
|
||||
|
@ -187,13 +197,15 @@ static void virtio_vga_class_init(ObjectClass *klass, void *data)
|
|||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
VirtioPCIClass *k = VIRTIO_PCI_CLASS(klass);
|
||||
VirtIOVGAClass *v = VIRTIO_VGA_CLASS(klass);
|
||||
PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
|
||||
|
||||
set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
|
||||
dc->props = virtio_vga_properties;
|
||||
dc->reset = virtio_vga_reset;
|
||||
dc->vmsd = &vmstate_virtio_vga;
|
||||
dc->hotpluggable = false;
|
||||
device_class_set_parent_reset(dc, virtio_vga_reset,
|
||||
&v->parent_reset);
|
||||
|
||||
k->realize = virtio_vga_realize;
|
||||
pcidev_k->romfile = "vgabios-virtio.bin";
|
||||
|
@ -212,6 +224,7 @@ static VirtioPCIDeviceTypeInfo virtio_vga_info = {
|
|||
.generic_name = TYPE_VIRTIO_VGA,
|
||||
.instance_size = sizeof(struct VirtIOVGA),
|
||||
.instance_init = virtio_vga_inst_initfn,
|
||||
.class_size = sizeof(struct VirtIOVGAClass),
|
||||
.class_init = virtio_vga_class_init,
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue