# 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
|