Blame SOURCES/kvm-vga-catch-depth-0.patch

357786
From 18adbd3883efdd681ed30402c0127971bf058031 Mon Sep 17 00:00:00 2001
357786
From: Gerd Hoffmann <kraxel@redhat.com>
357786
Date: Tue, 29 May 2018 10:57:04 +0200
357786
Subject: [PATCH 6/8] vga: catch depth 0
357786
357786
RH-Author: Gerd Hoffmann <kraxel@redhat.com>
357786
Message-id: <20180529105704.21419-2-kraxel@redhat.com>
357786
Patchwork-id: 80500
357786
O-Subject: [RHEL-7.6 qemu-kvm-rhev PATCH 1/1] vga: catch depth 0
357786
Bugzilla: 1575541
357786
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
357786
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
357786
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
357786
357786
depth == 0 is used to indicate 256 color modes.  Our region calculation
357786
goes wrong in that case.  So detect that and just take the safe code
357786
path we already have for the wraparound case.
357786
357786
While being at it also catch depth == 15 (where our region size
357786
calculation goes wrong too).  And make the comment more verbose,
357786
explaining what is going on here.
357786
357786
Without this windows guest install might trigger an assert due to trying
357786
to check dirty bitmap outside the snapshot region.
357786
357786
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1575541
357786
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
357786
Message-id: 20180514103117.21059-1-kraxel@redhat.com
357786
(cherry picked from commit a89fe6c329799e47aaa1663650f076b28808e186)
357786
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
357786
---
357786
 hw/display/vga.c | 23 ++++++++++++++++++-----
357786
 1 file changed, 18 insertions(+), 5 deletions(-)
357786
357786
diff --git a/hw/display/vga.c b/hw/display/vga.c
357786
index 7218133..a7794f6 100644
357786
--- a/hw/display/vga.c
357786
+++ b/hw/display/vga.c
357786
@@ -1480,13 +1480,28 @@ static void vga_draw_graphic(VGACommonState *s, int full_update)
357786
 
357786
     s->get_resolution(s, &width, &height);
357786
     disp_width = width;
357786
+    depth = s->get_bpp(s);
357786
 
357786
     region_start = (s->start_addr * 4);
357786
     region_end = region_start + (ram_addr_t)s->line_offset * height;
357786
-    region_end += width * s->get_bpp(s) / 8; /* scanline length */
357786
+    region_end += width * depth / 8; /* scanline length */
357786
     region_end -= s->line_offset;
357786
-    if (region_end > s->vbe_size) {
357786
-        /* wraps around (can happen with cirrus vbe modes) */
357786
+    if (region_end > s->vbe_size || depth == 0 || depth == 15) {
357786
+        /*
357786
+         * We land here on:
357786
+         *  - wraps around (can happen with cirrus vbe modes)
357786
+         *  - depth == 0 (256 color palette video mode)
357786
+         *  - depth == 15
357786
+         *
357786
+         * Take the safe and slow route:
357786
+         *   - create a dirty bitmap snapshot for all vga memory.
357786
+         *   - force shadowing (so all vga memory access goes
357786
+         *     through vga_read_*() helpers).
357786
+         *
357786
+         * Given this affects only vga features which are pretty much
357786
+         * unused by modern guests there should be no performance
357786
+         * impact.
357786
+         */
357786
         region_start = 0;
357786
         region_end = s->vbe_size;
357786
         force_shadow = true;
357786
@@ -1520,8 +1535,6 @@ static void vga_draw_graphic(VGACommonState *s, int full_update)
357786
         }
357786
     }
357786
 
357786
-    depth = s->get_bpp(s);
357786
-
357786
     /*
357786
      * Check whether we can share the surface with the backend
357786
      * or whether we need a shadow surface. We share native
357786
-- 
357786
1.8.3.1
357786