* [PULL 0/6] Fixes 20220318 patches @ 2022-03-18 13:56 Gerd Hoffmann 2022-03-18 13:56 ` [PULL 1/6] ui/gtk: Ignore 2- and 3-button press events Gerd Hoffmann ` (6 more replies) 0 siblings, 7 replies; 8+ messages in thread From: Gerd Hoffmann @ 2022-03-18 13:56 UTC (permalink / raw) To: qemu-devel; +Cc: Gerd Hoffmann, Michael S. Tsirkin The following changes since commit 1d60bb4b14601e38ed17384277aa4c30c57925d3: Merge tag 'pull-request-2022-03-15v2' of https://gitlab.com/thuth/qemu into staging (2022-03-16 10:43:58 +0000) are available in the Git repository at: git://git.kraxel.org/qemu tags/fixes-20220318-pull-request for you to fetch changes up to 9eb840a20998a97c0ad0f5ced6ebc7e6a88a4dc4: hw/display/vga: Report a proper error when adding a 2nd ISA VGA (2022-03-18 10:15:57 +0100) ---------------------------------------------------------------- bugfixes for vga, audio, vnc ---------------------------------------------------------------- Akihiko Odaki (1): audio/mixeng: Do not declare unused variables K. Lange (1): ui/gtk: Ignore 2- and 3-button press events Thomas Huth (3): hw/display/cirrus_vga: Clean up indentation in pci_cirrus_vga_realize() hw/display: Allow vga_common_init() to return errors hw/display/vga: Report a proper error when adding a 2nd ISA VGA Wen, Jianxian (1): ui: avoid unnecessary memory operations in vnc_refresh_server_surface() hw/display/vga_int.h | 2 +- audio/mixeng.c | 20 ++++++------- hw/display/ati.c | 4 ++- hw/display/cirrus_vga.c | 57 +++++++++++++++++++------------------ hw/display/cirrus_vga_isa.c | 4 ++- hw/display/qxl.c | 6 +++- hw/display/vga-isa.c | 5 +++- hw/display/vga-mmio.c | 5 +++- hw/display/vga-pci.c | 8 ++++-- hw/display/vga.c | 17 +++++++++-- hw/display/virtio-vga.c | 4 ++- hw/display/vmware_vga.c | 2 +- ui/gtk.c | 4 +++ ui/vnc.c | 26 +++++++++++------ 14 files changed, 106 insertions(+), 58 deletions(-) -- 2.35.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PULL 1/6] ui/gtk: Ignore 2- and 3-button press events 2022-03-18 13:56 [PULL 0/6] Fixes 20220318 patches Gerd Hoffmann @ 2022-03-18 13:56 ` Gerd Hoffmann 2022-03-18 13:56 ` [PULL 2/6] ui: avoid unnecessary memory operations in vnc_refresh_server_surface() Gerd Hoffmann ` (5 subsequent siblings) 6 siblings, 0 replies; 8+ messages in thread From: Gerd Hoffmann @ 2022-03-18 13:56 UTC (permalink / raw) To: qemu-devel; +Cc: K. Lange, Gerd Hoffmann, Michael S. Tsirkin From: "K. Lange" <klange@toaruos.org> GTK already produces corresponding GDK_BUTTON_PRESS events alongside 2BUTTON and 3BUTTON_PRESS events. The 2BUTTON and 3BUTTON_PRESS events were incorrectly being interpreted and passed to guests as button release events. Resolves: https://gitlab.com/qemu-project/qemu/-/issues/558 Signed-off-by: K. Lange <klange@toaruos.org> Message-Id: <20220305104521.3583703-1-klange@toaruos.org> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- ui/gtk.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ui/gtk.c b/ui/gtk.c index 1b24a67d7964..c57c36749e0e 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -972,6 +972,10 @@ static gboolean gd_button_event(GtkWidget *widget, GdkEventButton *button, return TRUE; } + if (button->type == GDK_2BUTTON_PRESS || button->type == GDK_3BUTTON_PRESS) { + return TRUE; + } + qemu_input_queue_btn(vc->gfx.dcl.con, btn, button->type == GDK_BUTTON_PRESS); qemu_input_event_sync(); -- 2.35.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PULL 2/6] ui: avoid unnecessary memory operations in vnc_refresh_server_surface() 2022-03-18 13:56 [PULL 0/6] Fixes 20220318 patches Gerd Hoffmann 2022-03-18 13:56 ` [PULL 1/6] ui/gtk: Ignore 2- and 3-button press events Gerd Hoffmann @ 2022-03-18 13:56 ` Gerd Hoffmann 2022-03-18 13:56 ` [PULL 3/6] audio/mixeng: Do not declare unused variables Gerd Hoffmann ` (4 subsequent siblings) 6 siblings, 0 replies; 8+ messages in thread From: Gerd Hoffmann @ 2022-03-18 13:56 UTC (permalink / raw) To: qemu-devel Cc: Lu Gao, Marc-André Lureau, Jianxian Wen, Gerd Hoffmann, Michael S. Tsirkin From: "Wen, Jianxian" <Jianxian.Wen@verisilicon.com> Check the dirty bits in advance to avoid unnecessary memory operations. In the case that guest surface has different format than the server, but it does not have dirty bits which means no refresh is actually needed, the memory operations is not necessary. Signed-off-by: Jianxian Wen <jianxian.wen@verisilicon.com> Signed-off-by: Lu Gao <lu.gao@verisilicon.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <4C23C17B8E87E74E906A25A3254A03F4FA22100C@SHASXM06.verisilicon.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- ui/vnc.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/ui/vnc.c b/ui/vnc.c index 3ccd33dedcc8..310a873c2184 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -3098,6 +3098,9 @@ static int vnc_refresh_server_surface(VncDisplay *vd) VncState *vs; int has_dirty = 0; pixman_image_t *tmpbuf = NULL; + unsigned long offset; + int x; + uint8_t *guest_ptr, *server_ptr; struct timeval tv = { 0, 0 }; @@ -3106,6 +3109,13 @@ static int vnc_refresh_server_surface(VncDisplay *vd) has_dirty = vnc_update_stats(vd, &tv); } + offset = find_next_bit((unsigned long *) &vd->guest.dirty, + height * VNC_DIRTY_BPL(&vd->guest), 0); + if (offset == height * VNC_DIRTY_BPL(&vd->guest)) { + /* no dirty bits in guest surface */ + return has_dirty; + } + /* * Walk through the guest dirty map. * Check and copy modified bits from guest to server surface. @@ -3130,15 +3140,6 @@ static int vnc_refresh_server_surface(VncDisplay *vd) line_bytes = MIN(server_stride, guest_ll); for (;;) { - int x; - uint8_t *guest_ptr, *server_ptr; - unsigned long offset = find_next_bit((unsigned long *) &vd->guest.dirty, - height * VNC_DIRTY_BPL(&vd->guest), - y * VNC_DIRTY_BPL(&vd->guest)); - if (offset == height * VNC_DIRTY_BPL(&vd->guest)) { - /* no more dirty bits */ - break; - } y = offset / VNC_DIRTY_BPL(&vd->guest); x = offset % VNC_DIRTY_BPL(&vd->guest); @@ -3177,6 +3178,13 @@ static int vnc_refresh_server_surface(VncDisplay *vd) } y++; + offset = find_next_bit((unsigned long *) &vd->guest.dirty, + height * VNC_DIRTY_BPL(&vd->guest), + y * VNC_DIRTY_BPL(&vd->guest)); + if (offset == height * VNC_DIRTY_BPL(&vd->guest)) { + /* no more dirty bits */ + break; + } } qemu_pixman_image_unref(tmpbuf); return has_dirty; -- 2.35.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PULL 3/6] audio/mixeng: Do not declare unused variables 2022-03-18 13:56 [PULL 0/6] Fixes 20220318 patches Gerd Hoffmann 2022-03-18 13:56 ` [PULL 1/6] ui/gtk: Ignore 2- and 3-button press events Gerd Hoffmann 2022-03-18 13:56 ` [PULL 2/6] ui: avoid unnecessary memory operations in vnc_refresh_server_surface() Gerd Hoffmann @ 2022-03-18 13:56 ` Gerd Hoffmann 2022-03-18 13:56 ` [PULL 4/6] hw/display/cirrus_vga: Clean up indentation in pci_cirrus_vga_realize() Gerd Hoffmann ` (3 subsequent siblings) 6 siblings, 0 replies; 8+ messages in thread From: Gerd Hoffmann @ 2022-03-18 13:56 UTC (permalink / raw) To: qemu-devel Cc: Philippe Mathieu-Daudé, Gerd Hoffmann, Akihiko Odaki, Michael S. Tsirkin From: Akihiko Odaki <akihiko.odaki@gmail.com> The unused variables when FLOAT_MIXENG is defined caused warnings on Apple clang version 13.1.6 (clang-1316.0.21.2). Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <20220316061053.60587-1-akihiko.odaki@gmail.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- audio/mixeng.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/audio/mixeng.c b/audio/mixeng.c index f27deb165b67..100a306d6fec 100644 --- a/audio/mixeng.c +++ b/audio/mixeng.c @@ -342,13 +342,13 @@ f_sample *mixeng_clip_float[2] = { void audio_sample_to_uint64(const void *samples, int pos, uint64_t *left, uint64_t *right) { +#ifdef FLOAT_MIXENG + error_report( + "Coreaudio and floating point samples are not supported by replay yet"); + abort(); +#else const struct st_sample *sample = samples; sample += pos; -#ifdef FLOAT_MIXENG - error_report( - "Coreaudio and floating point samples are not supported by replay yet"); - abort(); -#else *left = sample->l; *right = sample->r; #endif @@ -357,13 +357,13 @@ void audio_sample_to_uint64(const void *samples, int pos, void audio_sample_from_uint64(void *samples, int pos, uint64_t left, uint64_t right) { +#ifdef FLOAT_MIXENG + error_report( + "Coreaudio and floating point samples are not supported by replay yet"); + abort(); +#else struct st_sample *sample = samples; sample += pos; -#ifdef FLOAT_MIXENG - error_report( - "Coreaudio and floating point samples are not supported by replay yet"); - abort(); -#else sample->l = left; sample->r = right; #endif -- 2.35.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PULL 4/6] hw/display/cirrus_vga: Clean up indentation in pci_cirrus_vga_realize() 2022-03-18 13:56 [PULL 0/6] Fixes 20220318 patches Gerd Hoffmann ` (2 preceding siblings ...) 2022-03-18 13:56 ` [PULL 3/6] audio/mixeng: Do not declare unused variables Gerd Hoffmann @ 2022-03-18 13:56 ` Gerd Hoffmann 2022-03-18 13:56 ` [PULL 5/6] hw/display: Allow vga_common_init() to return errors Gerd Hoffmann ` (2 subsequent siblings) 6 siblings, 0 replies; 8+ messages in thread From: Gerd Hoffmann @ 2022-03-18 13:56 UTC (permalink / raw) To: qemu-devel Cc: Thomas Huth, Philippe Mathieu-Daudé, Gerd Hoffmann, Michael S. Tsirkin From: Thomas Huth <thuth@redhat.com> Most of the code in this function had been indented with 5 spaces instead of 4. Since 4 is our preferred style, remove one space in the bad lines here. Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Thomas Huth <thuth@redhat.com> Message-Id: <20220317083027.16688-2-thuth@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- hw/display/cirrus_vga.c | 55 +++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c index fdca6ca659f9..7da1be3e122e 100644 --- a/hw/display/cirrus_vga.c +++ b/hw/display/cirrus_vga.c @@ -2940,27 +2940,28 @@ void cirrus_init_common(CirrusVGAState *s, Object *owner, static void pci_cirrus_vga_realize(PCIDevice *dev, Error **errp) { - PCICirrusVGAState *d = PCI_CIRRUS_VGA(dev); - CirrusVGAState *s = &d->cirrus_vga; - PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev); - int16_t device_id = pc->device_id; + PCICirrusVGAState *d = PCI_CIRRUS_VGA(dev); + CirrusVGAState *s = &d->cirrus_vga; + PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev); + int16_t device_id = pc->device_id; - /* follow real hardware, cirrus card emulated has 4 MB video memory. - Also accept 8 MB/16 MB for backward compatibility. */ - if (s->vga.vram_size_mb != 4 && s->vga.vram_size_mb != 8 && - s->vga.vram_size_mb != 16) { - error_setg(errp, "Invalid cirrus_vga ram size '%u'", - s->vga.vram_size_mb); - return; - } - /* setup VGA */ - vga_common_init(&s->vga, OBJECT(dev)); - cirrus_init_common(s, OBJECT(dev), device_id, 1, pci_address_space(dev), - pci_address_space_io(dev)); - s->vga.con = graphic_console_init(DEVICE(dev), 0, s->vga.hw_ops, &s->vga); - - /* setup PCI */ + /* + * Follow real hardware, cirrus card emulated has 4 MB video memory. + * Also accept 8 MB/16 MB for backward compatibility. + */ + if (s->vga.vram_size_mb != 4 && s->vga.vram_size_mb != 8 && + s->vga.vram_size_mb != 16) { + error_setg(errp, "Invalid cirrus_vga ram size '%u'", + s->vga.vram_size_mb); + return; + } + /* setup VGA */ + vga_common_init(&s->vga, OBJECT(dev)); + cirrus_init_common(s, OBJECT(dev), device_id, 1, pci_address_space(dev), + pci_address_space_io(dev)); + s->vga.con = graphic_console_init(DEVICE(dev), 0, s->vga.hw_ops, &s->vga); + /* setup PCI */ memory_region_init(&s->pci_bar, OBJECT(dev), "cirrus-pci-bar0", 0x2000000); /* XXX: add byte swapping apertures */ @@ -2968,14 +2969,14 @@ static void pci_cirrus_vga_realize(PCIDevice *dev, Error **errp) memory_region_add_subregion(&s->pci_bar, 0x1000000, &s->cirrus_linear_bitblt_io); - /* setup memory space */ - /* memory #0 LFB */ - /* memory #1 memory-mapped I/O */ - /* XXX: s->vga.vram_size must be a power of two */ - pci_register_bar(&d->dev, 0, PCI_BASE_ADDRESS_MEM_PREFETCH, &s->pci_bar); - if (device_id == CIRRUS_ID_CLGD5446) { - pci_register_bar(&d->dev, 1, 0, &s->cirrus_mmio_io); - } + /* setup memory space */ + /* memory #0 LFB */ + /* memory #1 memory-mapped I/O */ + /* XXX: s->vga.vram_size must be a power of two */ + pci_register_bar(&d->dev, 0, PCI_BASE_ADDRESS_MEM_PREFETCH, &s->pci_bar); + if (device_id == CIRRUS_ID_CLGD5446) { + pci_register_bar(&d->dev, 1, 0, &s->cirrus_mmio_io); + } } static Property pci_vga_cirrus_properties[] = { -- 2.35.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PULL 5/6] hw/display: Allow vga_common_init() to return errors 2022-03-18 13:56 [PULL 0/6] Fixes 20220318 patches Gerd Hoffmann ` (3 preceding siblings ...) 2022-03-18 13:56 ` [PULL 4/6] hw/display/cirrus_vga: Clean up indentation in pci_cirrus_vga_realize() Gerd Hoffmann @ 2022-03-18 13:56 ` Gerd Hoffmann 2022-03-18 13:56 ` [PULL 6/6] hw/display/vga: Report a proper error when adding a 2nd ISA VGA Gerd Hoffmann 2022-03-19 14:16 ` [PULL 0/6] Fixes 20220318 patches Peter Maydell 6 siblings, 0 replies; 8+ messages in thread From: Gerd Hoffmann @ 2022-03-18 13:56 UTC (permalink / raw) To: qemu-devel Cc: Thomas Huth, Philippe Mathieu-Daudé, Gerd Hoffmann, Michael S. Tsirkin From: Thomas Huth <thuth@redhat.com> The vga_common_init() function currently cannot report errors to its caller. But in the following patch, we'd need this possibility, so let's change it to take an "Error **" as parameter for this. Signed-off-by: Thomas Huth <thuth@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <20220317083027.16688-3-thuth@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- hw/display/vga_int.h | 2 +- hw/display/ati.c | 4 +++- hw/display/cirrus_vga.c | 4 +++- hw/display/cirrus_vga_isa.c | 4 +++- hw/display/qxl.c | 6 +++++- hw/display/vga-isa.c | 5 ++++- hw/display/vga-mmio.c | 5 ++++- hw/display/vga-pci.c | 8 ++++++-- hw/display/vga.c | 11 +++++++++-- hw/display/virtio-vga.c | 4 +++- hw/display/vmware_vga.c | 2 +- 11 files changed, 42 insertions(+), 13 deletions(-) diff --git a/hw/display/vga_int.h b/hw/display/vga_int.h index 847e784ca6a8..305e700014d8 100644 --- a/hw/display/vga_int.h +++ b/hw/display/vga_int.h @@ -156,7 +156,7 @@ static inline int c6_to_8(int v) return (v << 2) | (b << 1) | b; } -void vga_common_init(VGACommonState *s, Object *obj); +bool vga_common_init(VGACommonState *s, Object *obj, Error **errp); void vga_init(VGACommonState *s, Object *obj, MemoryRegion *address_space, MemoryRegion *address_space_io, bool init_vga_ports); MemoryRegion *vga_init_io(VGACommonState *s, Object *obj, diff --git a/hw/display/ati.c b/hw/display/ati.c index 31f22754dcee..6e38e0050225 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -955,7 +955,9 @@ static void ati_vga_realize(PCIDevice *dev, Error **errp) } /* init vga bits */ - vga_common_init(vga, OBJECT(s)); + if (!vga_common_init(vga, OBJECT(s), errp)) { + return; + } vga_init(vga, OBJECT(s), pci_address_space(dev), pci_address_space_io(dev), true); vga->con = graphic_console_init(DEVICE(s), 0, s->vga.hw_ops, &s->vga); diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c index 7da1be3e122e..3bb6a58698c1 100644 --- a/hw/display/cirrus_vga.c +++ b/hw/display/cirrus_vga.c @@ -2956,7 +2956,9 @@ static void pci_cirrus_vga_realize(PCIDevice *dev, Error **errp) return; } /* setup VGA */ - vga_common_init(&s->vga, OBJECT(dev)); + if (!vga_common_init(&s->vga, OBJECT(dev), errp)) { + return; + } cirrus_init_common(s, OBJECT(dev), device_id, 1, pci_address_space(dev), pci_address_space_io(dev)); s->vga.con = graphic_console_init(DEVICE(dev), 0, s->vga.hw_ops, &s->vga); diff --git a/hw/display/cirrus_vga_isa.c b/hw/display/cirrus_vga_isa.c index 4f6fb1af3bd5..96144bd69060 100644 --- a/hw/display/cirrus_vga_isa.c +++ b/hw/display/cirrus_vga_isa.c @@ -56,7 +56,9 @@ static void isa_cirrus_vga_realizefn(DeviceState *dev, Error **errp) return; } s->global_vmstate = true; - vga_common_init(s, OBJECT(dev)); + if (!vga_common_init(s, OBJECT(dev), errp)) { + return; + } cirrus_init_common(&d->cirrus_vga, OBJECT(dev), CIRRUS_ID_CLGD5430, 0, isa_address_space(isadev), isa_address_space_io(isadev)); diff --git a/hw/display/qxl.c b/hw/display/qxl.c index 1f9ad319438d..adbdbcaeb612 100644 --- a/hw/display/qxl.c +++ b/hw/display/qxl.c @@ -2215,7 +2215,11 @@ static void qxl_realize_primary(PCIDevice *dev, Error **errp) qxl_init_ramsize(qxl); vga->vbe_size = qxl->vgamem_size; vga->vram_size_mb = qxl->vga.vram_size / MiB; - vga_common_init(vga, OBJECT(dev)); + vga_common_init(vga, OBJECT(dev), &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } vga_init(vga, OBJECT(dev), pci_address_space(dev), pci_address_space_io(dev), false); portio_list_init(&qxl->vga_port_list, OBJECT(dev), qxl_vga_portio_list, diff --git a/hw/display/vga-isa.c b/hw/display/vga-isa.c index 90851e730bcd..46abbc56534c 100644 --- a/hw/display/vga-isa.c +++ b/hw/display/vga-isa.c @@ -62,7 +62,10 @@ static void vga_isa_realizefn(DeviceState *dev, Error **errp) const MemoryRegionPortio *vga_ports, *vbe_ports; s->global_vmstate = true; - vga_common_init(s, OBJECT(dev)); + if (!vga_common_init(s, OBJECT(dev), errp)) { + return; + } + s->legacy_address_space = isa_address_space(isadev); vga_io_memory = vga_init_io(s, OBJECT(dev), &vga_ports, &vbe_ports); isa_register_portio_list(isadev, &d->portio_vga, diff --git a/hw/display/vga-mmio.c b/hw/display/vga-mmio.c index 496936808137..75dfcedea510 100644 --- a/hw/display/vga-mmio.c +++ b/hw/display/vga-mmio.c @@ -102,7 +102,10 @@ static void vga_mmio_realizefn(DeviceState *dev, Error **errp) s->vga.bank_offset = 0; s->vga.global_vmstate = true; - vga_common_init(&s->vga, OBJECT(dev)); + if (!vga_common_init(&s->vga, OBJECT(dev), errp)) { + return; + } + sysbus_init_mmio(sbd, &s->vga.vram); s->vga.con = graphic_console_init(dev, 0, s->vga.hw_ops, &s->vga); } diff --git a/hw/display/vga-pci.c b/hw/display/vga-pci.c index 62fb5c38c1fd..3e5bc259f7a5 100644 --- a/hw/display/vga-pci.c +++ b/hw/display/vga-pci.c @@ -239,7 +239,9 @@ static void pci_std_vga_realize(PCIDevice *dev, Error **errp) bool edid = false; /* vga + console init */ - vga_common_init(s, OBJECT(dev)); + if (!vga_common_init(s, OBJECT(dev), errp)) { + return; + } vga_init(s, OBJECT(dev), pci_address_space(dev), pci_address_space_io(dev), true); @@ -275,7 +277,9 @@ static void pci_secondary_vga_realize(PCIDevice *dev, Error **errp) bool edid = false; /* vga + console init */ - vga_common_init(s, OBJECT(dev)); + if (!vga_common_init(s, OBJECT(dev), errp)) { + return; + } s->con = graphic_console_init(DEVICE(dev), 0, s->hw_ops, s); /* mmio bar */ diff --git a/hw/display/vga.c b/hw/display/vga.c index 9d1f66af402e..ae960235963b 100644 --- a/hw/display/vga.c +++ b/hw/display/vga.c @@ -2168,9 +2168,10 @@ static inline uint32_t uint_clamp(uint32_t val, uint32_t vmin, uint32_t vmax) return val; } -void vga_common_init(VGACommonState *s, Object *obj) +bool vga_common_init(VGACommonState *s, Object *obj, Error **errp) { int i, j, v, b; + Error *local_err = NULL; for(i = 0;i < 256; i++) { v = 0; @@ -2206,7 +2207,11 @@ void vga_common_init(VGACommonState *s, Object *obj) s->is_vbe_vmstate = 1; memory_region_init_ram_nomigrate(&s->vram, obj, "vga.vram", s->vram_size, - &error_fatal); + &local_err); + if (local_err) { + error_propagate(errp, local_err); + return false; + } vmstate_register_ram(&s->vram, s->global_vmstate ? NULL : DEVICE(obj)); xen_register_framebuffer(&s->vram); s->vram_ptr = memory_region_get_ram_ptr(&s->vram); @@ -2237,6 +2242,8 @@ void vga_common_init(VGACommonState *s, Object *obj) s->default_endian_fb = false; #endif vga_dirty_log_start(s); + + return true; } static const MemoryRegionPortio vga_portio_list[] = { diff --git a/hw/display/virtio-vga.c b/hw/display/virtio-vga.c index 5a2f7a45408b..7b55c8d0e723 100644 --- a/hw/display/virtio-vga.c +++ b/hw/display/virtio-vga.c @@ -108,7 +108,9 @@ static void virtio_vga_base_realize(VirtIOPCIProxy *vpci_dev, Error **errp) /* init vga compat bits */ vga->vram_size_mb = 8; - vga_common_init(vga, OBJECT(vpci_dev)); + if (!vga_common_init(vga, OBJECT(vpci_dev), errp)) { + return; + } vga_init(vga, OBJECT(vpci_dev), pci_address_space(&vpci_dev->pci_dev), pci_address_space_io(&vpci_dev->pci_dev), true); pci_register_bar(&vpci_dev->pci_dev, 0, diff --git a/hw/display/vmware_vga.c b/hw/display/vmware_vga.c index 0cc43a1f15f6..98c83474adb5 100644 --- a/hw/display/vmware_vga.c +++ b/hw/display/vmware_vga.c @@ -1254,7 +1254,7 @@ static void vmsvga_init(DeviceState *dev, struct vmsvga_state_s *s, &error_fatal); s->fifo_ptr = memory_region_get_ram_ptr(&s->fifo_ram); - vga_common_init(&s->vga, OBJECT(dev)); + vga_common_init(&s->vga, OBJECT(dev), &error_fatal); vga_init(&s->vga, OBJECT(dev), address_space, io, true); vmstate_register(NULL, 0, &vmstate_vga_common, &s->vga); s->new_depth = 32; -- 2.35.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PULL 6/6] hw/display/vga: Report a proper error when adding a 2nd ISA VGA 2022-03-18 13:56 [PULL 0/6] Fixes 20220318 patches Gerd Hoffmann ` (4 preceding siblings ...) 2022-03-18 13:56 ` [PULL 5/6] hw/display: Allow vga_common_init() to return errors Gerd Hoffmann @ 2022-03-18 13:56 ` Gerd Hoffmann 2022-03-19 14:16 ` [PULL 0/6] Fixes 20220318 patches Peter Maydell 6 siblings, 0 replies; 8+ messages in thread From: Gerd Hoffmann @ 2022-03-18 13:56 UTC (permalink / raw) To: qemu-devel; +Cc: Thomas Huth, Gerd Hoffmann, Michael S. Tsirkin From: Thomas Huth <thuth@redhat.com> QEMU currently abort()s if the user tries to add a second ISA VGA device, for example: $ ./qemu-system-x86_64 -device isa-vga -device isa-vga RAMBlock "vga.vram" already registered, abort! Aborted (core dumped) $ ./qemu-system-x86_64 -device isa-cirrus-vga -device isa-cirrus-vga RAMBlock "vga.vram" already registered, abort! Aborted (core dumped) $ ./qemu-system-mips64el -M pica61 -device isa-vga RAMBlock "vga.vram" already registered, abort! Aborted (core dumped) Such a crash should never happen just because of giving bad parameters at the command line. Let's return a proper error message instead. (The idea is based on an original patch by Jose R. Ziviani for the isa-vga device, but this now fixes it for the isa-cirrus-vga device, too) Resolves: https://gitlab.com/qemu-project/qemu/-/issues/44 Signed-off-by: Thomas Huth <thuth@redhat.com> Message-Id: <20220317083027.16688-4-thuth@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- hw/display/vga.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hw/display/vga.c b/hw/display/vga.c index ae960235963b..a7a291fa2089 100644 --- a/hw/display/vga.c +++ b/hw/display/vga.c @@ -2206,6 +2206,12 @@ bool vga_common_init(VGACommonState *s, Object *obj, Error **errp) s->vbe_size_mask = s->vbe_size - 1; s->is_vbe_vmstate = 1; + + if (s->global_vmstate && qemu_ram_block_by_name("vga.vram")) { + error_setg(errp, "Only one global VGA device can be used at a time"); + return false; + } + memory_region_init_ram_nomigrate(&s->vram, obj, "vga.vram", s->vram_size, &local_err); if (local_err) { -- 2.35.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PULL 0/6] Fixes 20220318 patches 2022-03-18 13:56 [PULL 0/6] Fixes 20220318 patches Gerd Hoffmann ` (5 preceding siblings ...) 2022-03-18 13:56 ` [PULL 6/6] hw/display/vga: Report a proper error when adding a 2nd ISA VGA Gerd Hoffmann @ 2022-03-19 14:16 ` Peter Maydell 6 siblings, 0 replies; 8+ messages in thread From: Peter Maydell @ 2022-03-19 14:16 UTC (permalink / raw) To: Gerd Hoffmann; +Cc: qemu-devel, Michael S. Tsirkin On Fri, 18 Mar 2022 at 14:09, Gerd Hoffmann <kraxel@redhat.com> wrote: > > The following changes since commit 1d60bb4b14601e38ed17384277aa4c30c57925d3: > > Merge tag 'pull-request-2022-03-15v2' of https://gitlab.com/thuth/qemu into staging (2022-03-16 10:43:58 +0000) > > are available in the Git repository at: > > git://git.kraxel.org/qemu tags/fixes-20220318-pull-request > > for you to fetch changes up to 9eb840a20998a97c0ad0f5ced6ebc7e6a88a4dc4: > > hw/display/vga: Report a proper error when adding a 2nd ISA VGA (2022-03-18 10:15:57 +0100) > > ---------------------------------------------------------------- > bugfixes for vga, audio, vnc > > ---------------------------------------------------------------- Applied, thanks. Please update the changelog at https://wiki.qemu.org/ChangeLog/7.0 for any user-visible changes. -- PMM ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2022-03-19 14:18 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-03-18 13:56 [PULL 0/6] Fixes 20220318 patches Gerd Hoffmann 2022-03-18 13:56 ` [PULL 1/6] ui/gtk: Ignore 2- and 3-button press events Gerd Hoffmann 2022-03-18 13:56 ` [PULL 2/6] ui: avoid unnecessary memory operations in vnc_refresh_server_surface() Gerd Hoffmann 2022-03-18 13:56 ` [PULL 3/6] audio/mixeng: Do not declare unused variables Gerd Hoffmann 2022-03-18 13:56 ` [PULL 4/6] hw/display/cirrus_vga: Clean up indentation in pci_cirrus_vga_realize() Gerd Hoffmann 2022-03-18 13:56 ` [PULL 5/6] hw/display: Allow vga_common_init() to return errors Gerd Hoffmann 2022-03-18 13:56 ` [PULL 6/6] hw/display/vga: Report a proper error when adding a 2nd ISA VGA Gerd Hoffmann 2022-03-19 14:16 ` [PULL 0/6] Fixes 20220318 patches Peter Maydell
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).