[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Re-enable VGA acceleration under the new phys_to_machine_mapping.
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID 40d7eef7d3f5e6e39b40ccb5ca34d8cbf871b30a # Parent 0d10fac284274733fe67cf5384fe032508c13766 Re-enable VGA acceleration under the new phys_to_machine_mapping. Signed-off-by: Yunhong Jiang <yunhong.jiang@xxxxxxxxx> Signed-off-by: Xin B Li <xin.b.li@xxxxxxxxx> Signed-off-by: Jun Nakajima <jun.nakajima@xxxxxxxxx> diff -r 0d10fac28427 -r 40d7eef7d3f5 tools/ioemu/hw/cirrus_vga.c --- a/tools/ioemu/hw/cirrus_vga.c Thu Feb 16 17:52:06 2006 +++ b/tools/ioemu/hw/cirrus_vga.c Thu Feb 16 18:04:33 2006 @@ -269,6 +269,7 @@ int last_hw_cursor_y_end; int real_vram_size; /* XXX: suppress that */ CPUWriteMemoryFunc **cirrus_linear_write; + int set_mapping; } CirrusVGAState; typedef struct PCICirrusVGAState { @@ -2431,7 +2432,6 @@ #endif } - static CPUReadMemoryFunc *cirrus_linear_bitblt_read[3] = { cirrus_linear_bitblt_readb, cirrus_linear_bitblt_readw, @@ -2448,9 +2448,9 @@ static void cirrus_update_memory_access(CirrusVGAState *s) { unsigned mode; - - extern void unset_vram_mapping(unsigned long addr, unsigned long end); - extern void set_vram_mapping(unsigned long addr, unsigned long end); + extern void * set_vram_mapping(unsigned long addr, unsigned long end); + + extern int unset_vram_mapping(unsigned long addr, unsigned long end); extern int vga_accelerate; if ((s->sr[0x17] & 0x44) == 0x44) { @@ -2466,15 +2466,36 @@ mode = s->gr[0x05] & 0x7; if (mode < 4 || mode > 5 || ((s->gr[0x0B] & 0x4) == 0)) { - if (vga_accelerate && s->cirrus_lfb_addr && s->cirrus_lfb_end) - set_vram_mapping(s->cirrus_lfb_addr, s->cirrus_lfb_end); + if (vga_accelerate && s->cirrus_lfb_addr && s->cirrus_lfb_end) { + if (!s->set_mapping) { + void * vram_pointer; + s->set_mapping = 1; + vram_pointer = set_vram_mapping(s->cirrus_lfb_addr ,s->cirrus_lfb_end); + if (!vram_pointer){ + fprintf(stderr, "NULL vram_pointer\n"); + } else + { + vga_update_vram((VGAState *)s, vram_pointer, + VGA_RAM_SIZE); + } + } + } s->cirrus_linear_write[0] = cirrus_linear_mem_writeb; s->cirrus_linear_write[1] = cirrus_linear_mem_writew; s->cirrus_linear_write[2] = cirrus_linear_mem_writel; } else { generic_io: - if (vga_accelerate && s->cirrus_lfb_addr && s->cirrus_lfb_end) - unset_vram_mapping(s->cirrus_lfb_addr, s->cirrus_lfb_end); + if (vga_accelerate && s->cirrus_lfb_addr && s->cirrus_lfb_end) { + if(s->set_mapping) { + int error; + s->set_mapping = 0; + error = unset_vram_mapping(s->cirrus_lfb_addr, + s->cirrus_lfb_end); + if (!error) + vga_update_vram((VGAState *)s, NULL, VGA_RAM_SIZE); + } + } + s->cirrus_linear_write[0] = cirrus_linear_writeb; s->cirrus_linear_write[1] = cirrus_linear_writew; s->cirrus_linear_write[2] = cirrus_linear_writel; diff -r 0d10fac28427 -r 40d7eef7d3f5 tools/ioemu/hw/vga.c --- a/tools/ioemu/hw/vga.c Thu Feb 16 17:52:06 2006 +++ b/tools/ioemu/hw/vga.c Thu Feb 16 18:04:33 2006 @@ -1974,6 +1974,31 @@ return 0; } +int vga_update_vram(VGAState *s, void *vga_ram_base, int vga_ram_size) +{ + if (s->vram_size != vga_ram_size) + { + fprintf(stderr, "No support to change vga_ram_size\n"); + return -1; + } + + if ( !vga_ram_base ) + { + vga_ram_base = qemu_malloc(vga_ram_size); + if (!vga_ram_base) + { + fprintf(stderr, "reallocate error\n"); + return -1; + } + } + + /* XXX lock needed? */ + memcpy(vga_ram_base, s->vram_ptr, vga_ram_size); + s->vram_ptr = vga_ram_base; + + return 0; +} + /********************************************************/ /* vga screen dump */ diff -r 0d10fac28427 -r 40d7eef7d3f5 tools/ioemu/hw/vga_int.h --- a/tools/ioemu/hw/vga_int.h Thu Feb 16 17:52:06 2006 +++ b/tools/ioemu/hw/vga_int.h Thu Feb 16 18:04:33 2006 @@ -164,5 +164,6 @@ unsigned int color0, unsigned int color1, unsigned int color_xor); +int vga_update_vram(VGAState *s, void *vga_ram_base, int vga_ram_size); extern const uint8_t sr_mask[8]; extern const uint8_t gr_mask[16]; diff -r 0d10fac28427 -r 40d7eef7d3f5 tools/ioemu/vl.c --- a/tools/ioemu/vl.c Thu Feb 16 17:52:06 2006 +++ b/tools/ioemu/vl.c Thu Feb 16 18:04:33 2006 @@ -2485,158 +2485,165 @@ #endif } -int -setup_mapping(int xc_handle, uint32_t dom, unsigned long toptab, - unsigned long *mem_page_array, unsigned long *page_table_array, - unsigned long v_start, unsigned long v_end) -{ - l1_pgentry_t *vl1tab=NULL, *vl1e=NULL; - l2_pgentry_t *vl2tab[4] = {NULL, NULL, NULL, NULL}; - l2_pgentry_t *vl2e=NULL, *vl2_table = NULL; - unsigned long l1tab; - unsigned long ppt_alloc = 0; - unsigned long count; - int i = 0; -#if _LEVEL_3_ - l3_pgentry_t *vl3tab = NULL; - unsigned long l2tab; - - if ( (vl3tab = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE, - PROT_READ|PROT_WRITE, - toptab >> PAGE_SHIFT)) == NULL ) - goto error_out; - for (i = 0; i < 4 ; i++) { - l2tab = vl3tab[i] & PAGE_MASK; - vl2tab[i] = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE, - PROT_READ|PROT_WRITE, - l2tab >> PAGE_SHIFT); - if(vl2tab[i] == NULL) - goto error_out; - } - munmap(vl3tab, PAGE_SIZE); - vl3tab = NULL; -#else - if ( (vl2tab[0] = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE, - PROT_READ|PROT_WRITE, - toptab >> PAGE_SHIFT)) == NULL ) - goto error_out; -#endif - - for ( count = 0; count < ((v_end-v_start)>>PAGE_SHIFT); count++ ) +/* FIXME Flush the shadow page */ +static int unset_mm_mapping(int xc_handle, + uint32_t domid, + unsigned long nr_pages, + unsigned int address_bits, + unsigned long *extent_start) +{ + int err = 0; + xc_dominfo_t info; + + err = xc_domain_memory_decrease_reservation(xc_handle, domid, + nr_pages, 0, extent_start); + + if ( err ) + fprintf(stderr, "Failed to decrease physmap\n"); + + xc_domain_getinfo(xc_handle, domid, 1, &info); + + if ( (info.nr_pages - nr_pages) <= 0 ) { - if ( ((unsigned long)vl1e & (PAGE_SIZE-1)) == 0 ) - { - vl2_table = vl2tab[get_vl2_table(count, v_start)]; - vl2e = &vl2_table[l2_table_offset(v_start + - (count << PAGE_SHIFT))]; - - l1tab = page_table_array[ppt_alloc++] << PAGE_SHIFT; - if ( vl1tab != NULL ) - munmap(vl1tab, PAGE_SIZE); - - if ( (vl1tab = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE, - PROT_READ|PROT_WRITE, - l1tab >> PAGE_SHIFT)) == NULL ) - { - goto error_out; - } - memset(vl1tab, 0, PAGE_SIZE); - vl1e = &vl1tab[l1_table_offset(v_start + (count<<PAGE_SHIFT))]; - *vl2e = l1tab | L2_PROT; - } - - *vl1e = (mem_page_array[count] << PAGE_SHIFT) | L1_PROT; - vl1e++; - } -error_out: - if (vl1tab) - munmap(vl1tab, PAGE_SIZE); - for(i = 0; i < 4; i++) - if(vl2tab[i]) munmap(vl2tab[i], PAGE_SIZE); - return ppt_alloc; -} - -void -unsetup_mapping(int xc_handle, uint32_t dom, unsigned long toptab, - unsigned long v_start, unsigned long v_end) -{ - l1_pgentry_t *vl1tab=NULL, *vl1e=NULL; - l2_pgentry_t *vl2tab[4], *vl2e=NULL, *vl2_table = NULL; - unsigned long l1tab; - unsigned long count; - int i = 0; -#if _LEVEL_3_ - l3_pgentry_t *vl3tab = NULL; - unsigned long l2tab; - - if ( (vl3tab = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE, - PROT_READ|PROT_WRITE, - toptab >> PAGE_SHIFT)) == NULL ) - goto error_out; - for (i = 0; i < 4 ; i ++) { - l2tab = vl3tab[i] & PAGE_MASK; - vl2tab[i] = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE, - PROT_READ|PROT_WRITE, - l2tab >> PAGE_SHIFT); - if (vl2tab[i] == NULL) - goto error_out; - } - munmap(vl3tab, PAGE_SIZE); - vl3tab = NULL; -#else - if ( (vl2tab[0] = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE, - PROT_READ|PROT_WRITE, - toptab >> PAGE_SHIFT)) == NULL ) - goto error_out; -#endif - - for ( count = 0; count < ((v_end-v_start)>>PAGE_SHIFT); count++ ) { - if ( ((unsigned long)vl1e & (PAGE_SIZE-1)) == 0 ) - { - vl2_table = vl2tab[get_vl2_table(count, v_start)]; - vl2e = &vl2_table[l2_table_offset(v_start + (count << PAGE_SHIFT))]; - l1tab = *vl2e & PAGE_MASK; - - if(l1tab == 0) - continue; - if ( vl1tab != NULL ) - munmap(vl1tab, PAGE_SIZE); - - if ( (vl1tab = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE, - PROT_READ|PROT_WRITE, - l1tab >> PAGE_SHIFT)) == NULL ) - { - goto error_out; - } - vl1e = &vl1tab[l1_table_offset(v_start + (count<<PAGE_SHIFT))]; - *vl2e = 0; - } - - *vl1e = 0; - vl1e++; - } - -error_out: - if (vl1tab) - munmap(vl1tab, PAGE_SIZE); - for(i = 0; i < 4; i++) - if (vl2tab[i]) - munmap(vl2tab[i], PAGE_SIZE); -} - -void set_vram_mapping(unsigned long addr, unsigned long end) -{ - end = addr + VGA_RAM_SIZE; - setup_mapping(xc_handle, domid, toptab, - vgapage_array, freepage_array, addr, end); -} - -void unset_vram_mapping(unsigned long addr, unsigned long end) -{ - end = addr + VGA_RAM_SIZE; - /* FIXME Flush the shadow page */ - unsetup_mapping(xc_handle, domid, toptab, addr, end); -} + fprintf(stderr, "unset_mm_mapping: error nr_pages\n"); + err = -1; + } + + if ( xc_domain_setmaxmem(xc_handle, domid, + (info.nr_pages - nr_pages) * PAGE_SIZE/1024) != 0) + { + fprintf(logfile, "set maxmem returned error %d\n", errno); + err = -1; + } + + return err; +} + +static int set_mm_mapping(int xc_handle, + uint32_t domid, + unsigned long nr_pages, + unsigned int address_bits, + unsigned long *extent_start) +{ + int i; + xc_dominfo_t info; + int err = 0; + + xc_domain_getinfo(xc_handle, domid, 1, &info); + + if ( xc_domain_setmaxmem(xc_handle, domid, + (info.nr_pages + nr_pages) * PAGE_SIZE/1024) != 0) + { + fprintf(logfile, "set maxmem returned error %d\n", errno); + return -1; + } + + err = xc_domain_memory_populate_physmap(xc_handle, domid, + nr_pages, 0, + address_bits, extent_start); + + if ( err ) + { + fprintf(stderr, "Failed to populate physmap\n"); + return -1; + } + + err = xc_domain_translate_gpfn_list(xc_handle, domid, + nr_pages, + extent_start, extent_start); + + if ( err ) + { + fprintf(stderr, "Failed to translate gpfn list\n"); + return -1; + } + + for (i = 0; i < nr_pages; i++) + fprintf(stderr, "set_map result i %x result %lx\n", i, extent_start[i]); + + return 0; +} + + +void * set_vram_mapping(unsigned long begin, unsigned long end) +{ + unsigned long * extent_start = NULL; + unsigned long nr_extents; + void *vram_pointer = NULL; + int i; + + /* align begin and end address */ + begin = begin & PAGE_MASK; + end = begin + VGA_RAM_SIZE; + end = (end + PAGE_SIZE -1 )& PAGE_MASK; + nr_extents = (end - begin) >> PAGE_SHIFT; + + extent_start = malloc(sizeof(unsigned long) * nr_extents ); + if (extent_start == NULL) + { + fprintf(stderr, "Failed malloc on set_vram_mapping\n"); + return NULL; + } + + memset(extent_start, 0, sizeof(unsigned long) * nr_extents); + + for (i = 0; i < nr_extents; i++) + { + extent_start[i] = (begin + i * PAGE_SIZE) >> PAGE_SHIFT; + } + + set_mm_mapping(xc_handle, domid, nr_extents, 0, extent_start); + + if ( (vram_pointer = xc_map_foreign_batch(xc_handle, domid, + PROT_READ|PROT_WRITE, + extent_start, + nr_extents)) == NULL) + { + fprintf(logfile, + "xc_map_foreign_batch vgaram returned error %d\n", errno); + return NULL; + } + + memset(vram_pointer, 0, nr_extents * PAGE_SIZE); + + free(extent_start); + + return vram_pointer; +} + +int unset_vram_mapping(unsigned long begin, unsigned long end) +{ + unsigned long * extent_start = NULL; + unsigned long nr_extents; + int i; + + /* align begin and end address */ + + end = begin + VGA_RAM_SIZE; + begin = begin & PAGE_MASK; + end = (end + PAGE_SIZE -1 ) & PAGE_MASK; + nr_extents = (end - begin) >> PAGE_SHIFT; + + extent_start = malloc(sizeof(unsigned long) * nr_extents ); + + if (extent_start == NULL) + { + fprintf(stderr, "Failed malloc on set_mm_mapping\n"); + return -1; + } + + memset(extent_start, 0, sizeof(unsigned long) * nr_extents); + + for (i = 0; i < nr_extents; i++) + extent_start[i] = (begin + (i * PAGE_SIZE)) >> PAGE_SHIFT; + + unset_mm_mapping(xc_handle, domid, nr_extents, 0, extent_start); + + free(extent_start); + + return 0; +} + #elif defined(__ia64__) void set_vram_mapping(unsigned long addr, unsigned long end) {} void unset_vram_mapping(unsigned long addr, unsigned long end) {} _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |