From 1cbd2bbaf68c84148c679555fcf941c1a9b74473 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 16 Mar 2009 16:49:39 +0000 Subject: [PATCH] Introduce piecemeal VGA reset from upstream. This fixes null pointer dereference bugs introduced by the merge. Signed-off-by: Ian Jackson --- hw/cirrus_vga.c | 3 ++- hw/vga.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++-- hw/vga_int.h | 1 + 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/hw/cirrus_vga.c b/hw/cirrus_vga.c index 83dc616c..6149a0f9 100644 --- a/hw/cirrus_vga.c +++ b/hw/cirrus_vga.c @@ -3174,7 +3174,8 @@ static void cirrus_reset(void *opaque) { CirrusVGAState *s = opaque; - memset(s, 0, sizeof(*s)); + vga_reset(s); + s->graphic_mode = -1; /* force full update */ s->sr[0x06] = 0x0f; diff --git a/hw/vga.c b/hw/vga.c index 99452389..e47a23fe 100644 --- a/hw/vga.c +++ b/hw/vga.c @@ -1916,10 +1916,70 @@ static void vga_invalidate_display(void *opaque) s->last_height = -1; } -static void vga_reset(VGAState *s) +void vga_reset(void *opaque) { - memset(s, 0, sizeof(VGAState)); + VGAState *s = (VGAState *) opaque; + + s->lfb_addr = 0; + s->lfb_end = 0; + s->bios_offset = 0; + s->bios_size = 0; + s->sr_index = 0; + memset(s->sr, '\0', sizeof(s->sr)); + s->gr_index = 0; + memset(s->gr, '\0', sizeof(s->gr)); + s->ar_index = 0; + memset(s->ar, '\0', sizeof(s->ar)); + s->ar_flip_flop = 0; + s->cr_index = 0; + memset(s->cr, '\0', sizeof(s->cr)); + s->msr = 0; + s->fcr = 0; + s->st00 = 0; + s->st01 = 0; + s->dac_state = 0; + s->dac_sub_index = 0; + s->dac_read_index = 0; + s->dac_write_index = 0; + memset(s->dac_cache, '\0', sizeof(s->dac_cache)); + s->dac_8bit = 0; + memset(s->palette, '\0', sizeof(s->palette)); + s->bank_offset = 0; +#ifdef CONFIG_BOCHS_VBE + s->vbe_index = 0; + memset(s->vbe_regs, '\0', sizeof(s->vbe_regs)); + s->vbe_regs[VBE_DISPI_INDEX_ID] = VBE_DISPI_ID0; + s->vbe_start_addr = 0; + s->vbe_line_offset = 0; + s->vbe_bank_mask = (s->vram_size >> 16) - 1; +#endif + memset(s->font_offsets, '\0', sizeof(s->font_offsets)); s->graphic_mode = -1; /* force full update */ + s->shift_control = 0; + s->double_scan = 0; + s->line_offset = 0; + s->line_compare = 0; + s->start_addr = 0; + s->plane_updated = 0; + s->last_cw = 0; + s->last_ch = 0; + s->last_width = 0; + s->last_height = 0; + s->last_scr_width = 0; + s->last_scr_height = 0; + s->cursor_start = 0; + s->cursor_end = 0; + s->cursor_offset = 0; + memset(s->invalidated_y_table, '\0', sizeof(s->invalidated_y_table)); + memset(s->last_palette, '\0', sizeof(s->last_palette)); + memset(s->last_ch_attr, '\0', sizeof(s->last_ch_attr)); + switch (vga_retrace_method) { + case VGA_RETRACE_DUMB: + break; + case VGA_RETRACE_PRECISE: + memset(&s->retrace_info, 0, sizeof (s->retrace_info)); + break; + } } #define TEXTMODE_X(x) ((x) % width) diff --git a/hw/vga_int.h b/hw/vga_int.h index c9be893d..96465acd 100644 --- a/hw/vga_int.h +++ b/hw/vga_int.h @@ -188,6 +188,7 @@ static inline int c6_to_8(int v) void vga_common_init(VGAState *s, uint8_t *vga_ram_base, unsigned long vga_ram_offset, int vga_ram_size); +void vga_reset(void *s); uint32_t vga_mem_readb(void *opaque, target_phys_addr_t addr); void vga_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val); void vga_invalidate_scanlines(VGAState *s, int y1, int y2); -- 2.39.5