aboutsummaryrefslogtreecommitdiff
path: root/hw/display
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2024-04-02 12:25:57 +0200
committerPaolo Bonzini <pbonzini@redhat.com>2024-04-02 18:08:59 +0200
commit3b6d2b1962b23295c463f010ff88eb5a594f2ef9 (patch)
treee12df109d13f46438190d8c75e2238f0ff5aa8a8 /hw/display
parent3826a372e4aafac1dba9ba3434e7c2f76775de42 (diff)
downloadqemu-3b6d2b1962b23295c463f010ff88eb5a594f2ef9.zip
qemu-3b6d2b1962b23295c463f010ff88eb5a594f2ef9.tar.gz
qemu-3b6d2b1962b23295c463f010ff88eb5a594f2ef9.tar.bz2
vga: adjust dirty memory region if pel panning is active
When pel panning is active, one more byte is read from each of the VGA memory planes. This has to be accounted in the computation of region_end, otherwise vga_draw_graphic() fails an assertion: qemu-system-i386: ../system/physmem.c:946: cpu_physical_memory_snapshot_get_dirty: Assertion `start + length <= snap->end' failed. Reported-by: Helge Konetzka <hk@zapateado.de> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2244 Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'hw/display')
-rw-r--r--hw/display/vga.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/hw/display/vga.c b/hw/display/vga.c
index b4ceff7..40acd19 100644
--- a/hw/display/vga.c
+++ b/hw/display/vga.c
@@ -1571,11 +1571,15 @@ static void vga_draw_graphic(VGACommonState *s, int full_update)
break;
}
}
+ hpel = bits <= 8 ? s->params.hpel : 0;
region_start = (s->params.start_addr * 4);
region_end = region_start + (ram_addr_t)s->params.line_offset * height;
region_end += width * depth / 8; /* scanline length */
region_end -= s->params.line_offset;
+ if (hpel) {
+ region_end += 4;
+ }
if (region_end > s->vbe_size || depth == 0 || depth == 15) {
/*
* We land here on:
@@ -1660,7 +1664,6 @@ static void vga_draw_graphic(VGACommonState *s, int full_update)
width, height, v, line_offset, s->cr[9], s->cr[VGA_CRTC_MODE],
s->params.line_compare, sr(s, VGA_SEQ_CLOCK_MODE));
#endif
- hpel = bits <= 8 ? s->params.hpel : 0;
addr1 = (s->params.start_addr * 4);
bwidth = DIV_ROUND_UP(width * bits, 8);
if (hpel) {