qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] cirrus: handle wraparound in cirrus_invalidate_region
@ 2020-08-21  8:26 Gerd Hoffmann
  2020-08-21 10:41 ` Li Qiang
  2020-08-21 10:51 ` Philippe Mathieu-Daudé
  0 siblings, 2 replies; 11+ messages in thread
From: Gerd Hoffmann @ 2020-08-21  8:26 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alexander Bulekov, Li Qiang, Gerd Hoffmann

Code simply asserts that there is no wraparound instead of handling
it properly.  The assert() can be triggered by the guest (must be
privilidged inside the guest though).  Fix it.

Buglink: https://bugs.launchpad.net/qemu/+bug/1880189
Cc: Li Qiang <liq3ea@163.com>
Reported-by: Alexander Bulekov <alxndr@bu.edu>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/display/cirrus_vga.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c
index 212d6f5e6145..b91b64347473 100644
--- a/hw/display/cirrus_vga.c
+++ b/hw/display/cirrus_vga.c
@@ -640,10 +640,15 @@ static void cirrus_invalidate_region(CirrusVGAState * s, int off_begin,
     }
 
     for (y = 0; y < lines; y++) {
-        off_cur = off_begin;
+        off_cur = off_begin & s->cirrus_addr_mask;
         off_cur_end = ((off_cur + bytesperline - 1) & s->cirrus_addr_mask) + 1;
-        assert(off_cur_end >= off_cur);
-        memory_region_set_dirty(&s->vga.vram, off_cur, off_cur_end - off_cur);
+        if (off_cur_end >= off_cur) {
+            memory_region_set_dirty(&s->vga.vram, off_cur, off_cur_end - off_cur);
+        } else {
+            /* wraparound */
+            memory_region_set_dirty(&s->vga.vram, off_cur, s->cirrus_addr_mask - off_cur);
+            memory_region_set_dirty(&s->vga.vram, 0, off_cur_end);
+        }
         off_begin += off_pitch;
     }
 }
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2020-09-01 14:30 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-08-21  8:26 [PATCH] cirrus: handle wraparound in cirrus_invalidate_region Gerd Hoffmann
2020-08-21 10:41 ` Li Qiang
2020-08-31 11:23   ` Gerd Hoffmann
2020-09-01  4:55     ` Li Qiang
2020-09-01  5:15       ` Gerd Hoffmann
2020-09-01  6:26         ` Li Qiang
2020-09-01  7:16           ` Gerd Hoffmann
2020-09-01  7:37             ` Li Qiang
2020-09-01 14:10               ` Gerd Hoffmann
2020-08-21 10:51 ` Philippe Mathieu-Daudé
2020-08-21 13:55   ` Alexander Bulekov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).