* [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).