diff options
author | Avi Kivity <avi@redhat.com> | 2009-04-27 17:57:12 +0000 |
---|---|---|
committer | Blue Swirl <blauwirbel@gmail.com> | 2009-04-27 17:57:12 +0000 |
commit | 12c7e75a7c7048c0beb9196bbbedf0070ab29f53 (patch) | |
tree | 65e916ba28c6b9d690450876e80ac8e3f05e54f0 /hw/vga.c | |
parent | 918a608b10607b1db528946689c9b591ca59cd7d (diff) |
[RESEND] Fix vga segfaults or screen corruption with large memory guests
page0 and friends are ram addresses; a smaller size will overflow and
cause a segfault or random corruption.
Change them to ram_addr_t.
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'hw/vga.c')
-rw-r--r-- | hw/vga.c | 11 |
1 files changed, 6 insertions, 5 deletions
@@ -1584,8 +1584,9 @@ static void vga_sync_dirty_bitmap(VGAState *s) */ static void vga_draw_graphic(VGAState *s, int full_update) { - int y1, y, update, page_min, page_max, linesize, y_start, double_scan, mask, depth; - int width, height, shift_control, line_offset, page0, page1, bwidth, bits; + int y1, y, update, linesize, y_start, double_scan, mask, depth; + int width, height, shift_control, line_offset, bwidth, bits; + ram_addr_t page0, page1, page_min, page_max; int disp_width, multi_scan, multi_run; uint8_t *d; uint32_t v, addr1, addr; @@ -1723,8 +1724,8 @@ static void vga_draw_graphic(VGAState *s, int full_update) addr1 = (s->start_addr * 4); bwidth = (width * bits + 7) / 8; y_start = -1; - page_min = 0x7fffffff; - page_max = -1; + page_min = -1; + page_max = 0; d = ds_get_data(s->ds); linesize = ds_get_linesize(s->ds); y1 = 0; @@ -1791,7 +1792,7 @@ static void vga_draw_graphic(VGAState *s, int full_update) disp_width, y - y_start); } /* reset modified pages */ - if (page_max != -1) { + if (page_max >= page_min) { cpu_physical_memory_reset_dirty(page_min, page_max + TARGET_PAGE_SIZE, VGA_DIRTY_FLAG); } |