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

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