]> xenbits.xensource.com Git - qemu-xen-4.1-testing.git/commitdiff
Introduce piecemeal VGA reset from upstream.
authorIan Jackson <ian.jackson@eu.citrix.com>
Mon, 16 Mar 2009 16:49:39 +0000 (16:49 +0000)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Mon, 16 Mar 2009 16:49:39 +0000 (16:49 +0000)
This fixes null pointer dereference bugs introduced by the merge.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
hw/cirrus_vga.c
hw/vga.c
hw/vga_int.h

index 83dc616c2a89bb4e0ffb21db0d7cbc35c4629c59..6149a0f9ffd0ea1e0215ec17eb687197131d8ff1 100644 (file)
@@ -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;
index 994523898226ee1b621f6f9b8bdf77cbfb43f794..e47a23fe3b02cb06b8b9f7bb7a5547c18ae3201c 100644 (file)
--- 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)
index c9be893d809a5996da319cbf4cde8d5d34f6ddab..96465acd7dd97a4cf4614d5d624d8b02b5a72f7c 100644 (file)
@@ -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);