[pve-devel] [PATCH qemu] add backport for windows console crash
Dominik Csapak
d.csapak at proxmox.com
Mon Apr 8 15:55:09 CEST 2019
fixes an occasional crash when users go to the console of a windows vm
Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
debian/patches/extra/0019-vga-catch-depth-0.patch | 68 +++++++++++++++++++++++
debian/patches/series | 1 +
2 files changed, 69 insertions(+)
create mode 100644 debian/patches/extra/0019-vga-catch-depth-0.patch
diff --git a/debian/patches/extra/0019-vga-catch-depth-0.patch b/debian/patches/extra/0019-vga-catch-depth-0.patch
new file mode 100644
index 0000000..00108c2
--- /dev/null
+++ b/debian/patches/extra/0019-vga-catch-depth-0.patch
@@ -0,0 +1,68 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Gerd Hoffmann <kraxel at redhat.com>
+Date: Mon, 14 May 2018 12:31:17 +0200
+Subject: [PATCH] vga: catch depth 0
+
+depth == 0 is used to indicate 256 color modes. Our region calculation
+goes wrong in that case. So detect that and just take the safe code
+path we already have for the wraparound case.
+
+While being at it also catch depth == 15 (where our region size
+calculation goes wrong too). And make the comment more verbose,
+explaining what is going on here.
+
+Without this windows guest install might trigger an assert due to trying
+to check dirty bitmap outside the snapshot region.
+
+Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1575541
+Signed-off-by: Gerd Hoffmann <kraxel at redhat.com>
+Message-id: 20180514103117.21059-1-kraxel at redhat.com
+---
+ hw/display/vga.c | 23 ++++++++++++++++++-----
+ 1 file changed, 18 insertions(+), 5 deletions(-)
+
+diff --git a/hw/display/vga.c b/hw/display/vga.c
+index 72181330b8..a7794f6d1f 100644
+--- a/hw/display/vga.c
++++ b/hw/display/vga.c
+@@ -1480,13 +1480,28 @@ static void vga_draw_graphic(VGACommonState *s, int full_update)
+
+ s->get_resolution(s, &width, &height);
+ disp_width = width;
++ depth = s->get_bpp(s);
+
+ region_start = (s->start_addr * 4);
+ region_end = region_start + (ram_addr_t)s->line_offset * height;
+- region_end += width * s->get_bpp(s) / 8; /* scanline length */
++ region_end += width * depth / 8; /* scanline length */
+ region_end -= s->line_offset;
+- if (region_end > s->vbe_size) {
+- /* wraps around (can happen with cirrus vbe modes) */
++ if (region_end > s->vbe_size || depth == 0 || depth == 15) {
++ /*
++ * We land here on:
++ * - wraps around (can happen with cirrus vbe modes)
++ * - depth == 0 (256 color palette video mode)
++ * - depth == 15
++ *
++ * Take the safe and slow route:
++ * - create a dirty bitmap snapshot for all vga memory.
++ * - force shadowing (so all vga memory access goes
++ * through vga_read_*() helpers).
++ *
++ * Given this affects only vga features which are pretty much
++ * unused by modern guests there should be no performance
++ * impact.
++ */
+ region_start = 0;
+ region_end = s->vbe_size;
+ force_shadow = true;
+@@ -1520,8 +1535,6 @@ static void vga_draw_graphic(VGACommonState *s, int full_update)
+ }
+ }
+
+- depth = s->get_bpp(s);
+-
+ /*
+ * Check whether we can share the surface with the backend
+ * or whether we need a shadow surface. We share native
diff --git a/debian/patches/series b/debian/patches/series
index 13e927c..fda0928 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -54,3 +54,4 @@ extra/0015-pvrdma-add-uar_read-routine.patch
extra/0016-pvrdma-check-number-of-pages-when-creating-rings.patch
extra/0017-pvrdma-check-return-value-from-pvrdma_idx_ring_has_-.patch
extra/0018-lsi53c895a-check-message-length-value-is-valid.patch
+extra/0019-vga-catch-depth-0.patch
--
2.11.0
More information about the pve-devel
mailing list