[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