fixes an occasional crash when users go to the console of a windows vm Signed-off-by: Dominik Csapak <d.csa...@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 <kra...@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 <kra...@redhat.com> +Message-id: 20180514103117.21059-1-kra...@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 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel