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

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