From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LJtO4-0001kY-6v for qemu-devel@nongnu.org; Mon, 05 Jan 2009 12:37:12 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LJtO1-0001kM-0a for qemu-devel@nongnu.org; Mon, 05 Jan 2009 12:37:10 -0500 Received: from [199.232.76.173] (port=41931 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LJtO0-0001kJ-SS for qemu-devel@nongnu.org; Mon, 05 Jan 2009 12:37:08 -0500 Received: from savannah.gnu.org ([199.232.41.3]:60717 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LJtO0-0001wt-Hk for qemu-devel@nongnu.org; Mon, 05 Jan 2009 12:37:08 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1LJtNz-0007Lf-Ts for qemu-devel@nongnu.org; Mon, 05 Jan 2009 17:37:08 +0000 Received: from blueswir1 by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1LJtNz-0007LZ-IE for qemu-devel@nongnu.org; Mon, 05 Jan 2009 17:37:07 +0000 MIME-Version: 1.0 Errors-To: blueswir1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Blue Swirl Message-Id: Date: Mon, 05 Jan 2009 17:37:07 +0000 Subject: [Qemu-devel] [6191] Add cirrus reset handler Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 6191 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6191 Author: blueswir1 Date: 2009-01-05 17:37:06 +0000 (Mon, 05 Jan 2009) Log Message: ----------- Add cirrus reset handler The vga reset handler overwrites some cirrus registers, causing reboots to corrupt cirrus state to the point that guests can only bring up 640x480 resolutions. Fix by adding a dedicated cirrus reset handler (which calls the common vga handler). Signed-off-by: Avi Kivity Modified Paths: -------------- trunk/hw/cirrus_vga.c trunk/hw/vga.c trunk/hw/vga_int.h Modified: trunk/hw/cirrus_vga.c =================================================================== --- trunk/hw/cirrus_vga.c 2009-01-04 22:51:59 UTC (rev 6190) +++ trunk/hw/cirrus_vga.c 2009-01-05 17:37:06 UTC (rev 6191) @@ -287,6 +287,8 @@ int last_hw_cursor_y_end; int real_vram_size; /* XXX: suppress that */ CPUWriteMemoryFunc **cirrus_linear_write; + int device_id; + int bustype; } CirrusVGAState; typedef struct PCICirrusVGAState { @@ -3175,55 +3177,13 @@ * ***************************************/ -static void cirrus_init_common(CirrusVGAState * s, int device_id, int is_pci) +static void cirrus_reset(void *opaque) { - int i; - static int inited; + CirrusVGAState *s = opaque; - if (!inited) { - inited = 1; - for(i = 0;i < 256; i++) - rop_to_index[i] = CIRRUS_ROP_NOP_INDEX; /* nop rop */ - rop_to_index[CIRRUS_ROP_0] = 0; - rop_to_index[CIRRUS_ROP_SRC_AND_DST] = 1; - rop_to_index[CIRRUS_ROP_NOP] = 2; - rop_to_index[CIRRUS_ROP_SRC_AND_NOTDST] = 3; - rop_to_index[CIRRUS_ROP_NOTDST] = 4; - rop_to_index[CIRRUS_ROP_SRC] = 5; - rop_to_index[CIRRUS_ROP_1] = 6; - rop_to_index[CIRRUS_ROP_NOTSRC_AND_DST] = 7; - rop_to_index[CIRRUS_ROP_SRC_XOR_DST] = 8; - rop_to_index[CIRRUS_ROP_SRC_OR_DST] = 9; - rop_to_index[CIRRUS_ROP_NOTSRC_OR_NOTDST] = 10; - rop_to_index[CIRRUS_ROP_SRC_NOTXOR_DST] = 11; - rop_to_index[CIRRUS_ROP_SRC_OR_NOTDST] = 12; - rop_to_index[CIRRUS_ROP_NOTSRC] = 13; - rop_to_index[CIRRUS_ROP_NOTSRC_OR_DST] = 14; - rop_to_index[CIRRUS_ROP_NOTSRC_AND_NOTDST] = 15; - } - - register_ioport_write(0x3c0, 16, 1, vga_ioport_write, s); - - register_ioport_write(0x3b4, 2, 1, vga_ioport_write, s); - register_ioport_write(0x3d4, 2, 1, vga_ioport_write, s); - register_ioport_write(0x3ba, 1, 1, vga_ioport_write, s); - register_ioport_write(0x3da, 1, 1, vga_ioport_write, s); - - register_ioport_read(0x3c0, 16, 1, vga_ioport_read, s); - - register_ioport_read(0x3b4, 2, 1, vga_ioport_read, s); - register_ioport_read(0x3d4, 2, 1, vga_ioport_read, s); - register_ioport_read(0x3ba, 1, 1, vga_ioport_read, s); - register_ioport_read(0x3da, 1, 1, vga_ioport_read, s); - - s->vga_io_memory = cpu_register_io_memory(0, cirrus_vga_mem_read, - cirrus_vga_mem_write, s); - cpu_register_physical_memory(isa_mem_base + 0x000a0000, 0x20000, - s->vga_io_memory); - qemu_register_coalesced_mmio(isa_mem_base + 0x000a0000, 0x20000); - + vga_reset(s); s->sr[0x06] = 0x0f; - if (device_id == CIRRUS_ID_CLGD5446) { + if (s->device_id == CIRRUS_ID_CLGD5446) { /* 4MB 64 bit memory config, always PCI */ s->sr[0x1F] = 0x2d; // MemClock s->gr[0x18] = 0x0f; // fastest memory configuration @@ -3241,14 +3201,11 @@ } else { s->sr[0x1F] = 0x22; // MemClock s->sr[0x0F] = CIRRUS_MEMSIZE_2M; - if (is_pci) - s->sr[0x17] = CIRRUS_BUSTYPE_PCI; - else - s->sr[0x17] = CIRRUS_BUSTYPE_ISA; + s->sr[0x17] = s->bustype; s->real_vram_size = 2048 * 1024; s->sr[0x15] = 0x03; /* memory size, 3=2MB, 4=4MB */ } - s->cr[0x27] = device_id; + s->cr[0x27] = s->device_id; /* Win2K seems to assume that the pattern buffer is at 0xff initially ! */ @@ -3281,7 +3238,62 @@ s->get_resolution = cirrus_get_resolution; s->cursor_invalidate = cirrus_cursor_invalidate; s->cursor_draw_line = cirrus_cursor_draw_line; +} +static void cirrus_init_common(CirrusVGAState * s, int device_id, int is_pci) +{ + int i; + static int inited; + + if (!inited) { + inited = 1; + for(i = 0;i < 256; i++) + rop_to_index[i] = CIRRUS_ROP_NOP_INDEX; /* nop rop */ + rop_to_index[CIRRUS_ROP_0] = 0; + rop_to_index[CIRRUS_ROP_SRC_AND_DST] = 1; + rop_to_index[CIRRUS_ROP_NOP] = 2; + rop_to_index[CIRRUS_ROP_SRC_AND_NOTDST] = 3; + rop_to_index[CIRRUS_ROP_NOTDST] = 4; + rop_to_index[CIRRUS_ROP_SRC] = 5; + rop_to_index[CIRRUS_ROP_1] = 6; + rop_to_index[CIRRUS_ROP_NOTSRC_AND_DST] = 7; + rop_to_index[CIRRUS_ROP_SRC_XOR_DST] = 8; + rop_to_index[CIRRUS_ROP_SRC_OR_DST] = 9; + rop_to_index[CIRRUS_ROP_NOTSRC_OR_NOTDST] = 10; + rop_to_index[CIRRUS_ROP_SRC_NOTXOR_DST] = 11; + rop_to_index[CIRRUS_ROP_SRC_OR_NOTDST] = 12; + rop_to_index[CIRRUS_ROP_NOTSRC] = 13; + rop_to_index[CIRRUS_ROP_NOTSRC_OR_DST] = 14; + rop_to_index[CIRRUS_ROP_NOTSRC_AND_NOTDST] = 15; + s->device_id = device_id; + if (is_pci) + s->bustype = CIRRUS_BUSTYPE_PCI; + else + s->bustype = CIRRUS_BUSTYPE_ISA; + } + + register_ioport_write(0x3c0, 16, 1, vga_ioport_write, s); + + register_ioport_write(0x3b4, 2, 1, vga_ioport_write, s); + register_ioport_write(0x3d4, 2, 1, vga_ioport_write, s); + register_ioport_write(0x3ba, 1, 1, vga_ioport_write, s); + register_ioport_write(0x3da, 1, 1, vga_ioport_write, s); + + register_ioport_read(0x3c0, 16, 1, vga_ioport_read, s); + + register_ioport_read(0x3b4, 2, 1, vga_ioport_read, s); + register_ioport_read(0x3d4, 2, 1, vga_ioport_read, s); + register_ioport_read(0x3ba, 1, 1, vga_ioport_read, s); + register_ioport_read(0x3da, 1, 1, vga_ioport_read, s); + + s->vga_io_memory = cpu_register_io_memory(0, cirrus_vga_mem_read, + cirrus_vga_mem_write, s); + cpu_register_physical_memory(isa_mem_base + 0x000a0000, 0x20000, + s->vga_io_memory); + qemu_register_coalesced_mmio(isa_mem_base + 0x000a0000, 0x20000); + + qemu_register_reset(cirrus_reset, s); + cirrus_reset(s); register_savevm("cirrus_vga", 0, 2, cirrus_vga_save, cirrus_vga_load, s); } Modified: trunk/hw/vga.c =================================================================== --- trunk/hw/vga.c 2009-01-04 22:51:59 UTC (rev 6190) +++ trunk/hw/vga.c 2009-01-05 17:37:06 UTC (rev 6191) @@ -1839,7 +1839,7 @@ s->last_height = -1; } -static void vga_reset(void *opaque) +void vga_reset(void *opaque) { VGAState *s = (VGAState *) opaque; @@ -2277,7 +2277,6 @@ s->update_retrace_info = vga_precise_update_retrace_info; break; } - qemu_register_reset(vga_reset, s); vga_reset(s); } @@ -2286,6 +2285,7 @@ { int vga_io_memory; + qemu_register_reset(vga_reset, s); register_savevm("vga", 0, 2, vga_save, vga_load, s); register_ioport_write(0x3c0, 16, 1, vga_ioport_write, s); Modified: trunk/hw/vga_int.h =================================================================== --- trunk/hw/vga_int.h 2009-01-04 22:51:59 UTC (rev 6190) +++ trunk/hw/vga_int.h 2009-01-05 17:37:06 UTC (rev 6191) @@ -193,6 +193,7 @@ void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base, ram_addr_t vga_ram_offset, int vga_ram_size); void vga_init(VGAState *s); +void vga_reset(void *s); void vga_dirty_log_start(VGAState *s); void vga_dirty_log_stop(VGAState *s);