[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-3.2-testing] x86, hvm: stdvga cache always on
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1210687974 -3600 # Node ID ed61db6c6fe0ba2eba723fba03310a5a4d14641b # Parent 50790bbfa97aa4667358e97a725070dcfde041b9 x86, hvm: stdvga cache always on currently the hypervisor vga cache (stdvga.c) enables itself only in graphical mode and in the a0000h-affffh range. However there is no reason for this: it already allocates enought memory to map the whole vram. I am attaching a patch that implements the bank switching mechanism in stdvga.c, allowing the cache to be always enabled when the emulated graphic card is in VGA mode. Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> xen-unstable changeset: 17572:d5589865bfce91bf65c34bd56e466bf26ca4176f xen-unstable date: Tue May 06 10:19:10 2008 +0100 --- xen/arch/x86/hvm/stdvga.c | 55 +++++++++++++++++++++++++++++++++++++--------- 1 files changed, 45 insertions(+), 10 deletions(-) diff -r 50790bbfa97a -r ed61db6c6fe0 xen/arch/x86/hvm/stdvga.c --- a/xen/arch/x86/hvm/stdvga.c Tue May 13 15:11:11 2008 +0100 +++ b/xen/arch/x86/hvm/stdvga.c Tue May 13 15:12:54 2008 +0100 @@ -130,14 +130,15 @@ static int stdvga_outb(uint64_t addr, ui /* When in standard vga mode, emulate here all writes to the vram buffer * so we can immediately satisfy reads without waiting for qemu. */ - s->stdvga = - (s->sr[7] == 0x00) && /* standard vga mode */ - (s->gr[6] == 0x05); /* misc graphics register w/ MemoryMapSelect=1 - * 0xa0000-0xaffff (64k region), AlphaDis=1 */ + s->stdvga = (s->sr[7] == 0x00); if ( !prev_stdvga && s->stdvga ) { - s->cache = 1; /* (re)start caching video buffer */ + /* + * (Re)start caching of video buffer. + * XXX TODO: In case of a restart the cache could be unsynced. + */ + s->cache = 1; gdprintk(XENLOG_INFO, "entering stdvga and caching modes\n"); } else if ( prev_stdvga && !s->stdvga ) @@ -179,6 +180,40 @@ int stdvga_intercept_pio( spin_unlock(&s->lock); return 0; /* propagate to external ioemu */ +} + +static unsigned int stdvga_mem_offset( + struct hvm_hw_stdvga *s, unsigned int mmio_addr) +{ + unsigned int memory_map_mode = (s->gr[6] >> 2) & 3; + unsigned int offset = mmio_addr & 0x1ffff; + + switch ( memory_map_mode ) + { + case 0: + break; + case 1: + if ( offset >= 0x10000 ) + goto fail; + offset += 0; /* assume bank_offset == 0; */ + break; + case 2: + offset -= 0x10000; + if ( offset >= 0x8000 ) + goto fail; + break; + default: + case 3: + offset -= 0x18000; + if ( offset >= 0x8000 ) + goto fail; + break; + } + + return offset; + + fail: + return ~0u; } #define GET_PLANE(data, p) (((data) >> ((p) * 8)) & 0xff) @@ -190,8 +225,8 @@ static uint8_t stdvga_mem_readb(uint64_t uint32_t ret, *vram_l; uint8_t *vram_b; - addr &= 0x1ffff; - if ( addr >= 0x10000 ) + addr = stdvga_mem_offset(s, addr); + if ( addr == ~0u ) return 0xff; if ( s->sr[4] & 0x08 ) @@ -272,8 +307,8 @@ static void stdvga_mem_writeb(uint64_t a uint32_t write_mask, bit_mask, set_mask, *vram_l; uint8_t *vram_b; - addr &= 0x1ffff; - if ( addr >= 0x10000 ) + addr = stdvga_mem_offset(s, addr); + if ( addr == ~0u ) return; if ( s->sr[4] & 0x08 ) @@ -563,7 +598,7 @@ void stdvga_init(struct domain *d) register_portio_handler(d, 0x3ce, 2, stdvga_intercept_pio); /* MMIO. */ register_buffered_io_handler( - d, 0xa0000, 0x10000, stdvga_intercept_mmio); + d, 0xa0000, 0x20000, stdvga_intercept_mmio); } } _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |