]> xenbits.xensource.com Git - xenclient/ioemu.git/commitdiff
vga_highres updates
authorStefano Stabellini <sstabellini@kaball-desktop.(none)>
Thu, 4 Dec 2008 14:20:10 +0000 (14:20 +0000)
committerStefano Stabellini <sstabellini@kaball-desktop.(none)>
Thu, 4 Dec 2008 14:20:10 +0000 (14:20 +0000)
hw/cirrus_vga.c
hw/vga.c
hw/vga_int.h
qemu-xen.h

index 4ca6b99efac92eb63303b0193d257b64f2159bd1..69885f51c855b2002a3d275396d76f691b1e223c 100644 (file)
@@ -291,8 +291,6 @@ typedef struct CirrusVGAState {
     int last_hw_cursor_y_end;
     int real_vram_size; /* XXX: suppress that */
     CPUWriteMemoryFunc **cirrus_linear_write;
-    uint32_t map_addr;
-    uint32_t map_end;
 } CirrusVGAState;
 
 typedef struct PCICirrusVGAState {
@@ -2641,70 +2639,6 @@ static CPUWriteMemoryFunc *cirrus_linear_bitblt_write[3] = {
     cirrus_linear_bitblt_writel,
 };
 
-
-static void set_vram_mapping(CirrusVGAState *s, unsigned long begin, unsigned long end)
-{
-    unsigned long i;
-    struct xen_add_to_physmap xatp;
-    int rc;
-
-    if (end > begin + video_ram_size)
-        end = begin + video_ram_size;
-
-    fprintf(logfile,"mapping vram to %lx - %lx\n", begin, end);
-
-    if (!s->vram_mfns)
-        return;
-
-    xatp.domid = domid;
-    xatp.space = XENMAPSPACE_mfn;
-
-    for (i = 0; i < (end - begin) >> TARGET_PAGE_BITS; i++) {
-        xatp.idx = s->vram_mfns[i];
-        xatp.gpfn = (begin >> TARGET_PAGE_BITS) + i;
-        rc = xc_memory_op(xc_handle, XENMEM_add_to_physmap, &xatp);
-        if (rc) {
-            fprintf(stderr, "add_to_physmap MFN %"PRI_xen_pfn" to PFN %"PRI_xen_pfn" failed: %d\n", xatp.idx, xatp.gpfn, rc);
-            return;
-        }
-    }
-
-    (void)xc_domain_pin_memory_cacheattr(
-        xc_handle, domid,
-        begin >> TARGET_PAGE_BITS,
-        end >> TARGET_PAGE_BITS,
-        XEN_DOMCTL_MEM_CACHEATTR_WB);
-}
-
-static void unset_vram_mapping(CirrusVGAState *s, unsigned long begin, unsigned long end)
-{
-    if (s->stolen_vram_addr) {
-        /* We can put it there for xend to save it efficiently */
-        set_vram_mapping(s, s->stolen_vram_addr, s->stolen_vram_addr + video_ram_size);
-    } else {
-        /* Old image, we have to unmap them completely */
-        struct xen_remove_from_physmap xrfp;
-        unsigned long i;
-        int rc;
-
-        if (end > begin + video_ram_size)
-            end = begin + video_ram_size;
-
-        fprintf(logfile,"unmapping vram from %lx - %lx\n", begin, end);
-
-        xrfp.domid = domid;
-
-        for (i = 0; i < (end - begin) >> TARGET_PAGE_BITS; i++) {
-            xrfp.gpfn = (begin >> TARGET_PAGE_BITS) + i;
-            rc = xc_memory_op(xc_handle, XENMEM_remove_from_physmap, &xrfp);
-            if (rc) {
-                fprintf(stderr, "remove_from_physmap PFN %"PRI_xen_pfn" failed: %d\n", xrfp.gpfn, rc);
-                return;
-            }
-        }
-    }
-}
-
 void cirrus_restart_acc(CirrusVGAState *s)
 {
     set_vram_mapping(s, s->lfb_addr, s->lfb_end);
@@ -3214,6 +3148,7 @@ static int cirrus_vga_load(QEMUFile *f, void *opaque, int version_id)
     qemu_get_be32s(f, &s->lfb_end);
     /* XXX throwing away 32 bits */
     qemu_get_be32(f);
+    video_ram_size = s->lfb_end - s->lfb_addr;
     if (version_id >= 3) {
         qemu_get_be64s(f, &s->stolen_vram_addr);
         if (!s->stolen_vram_addr && !vga_acc) {
index e59880659aa65a779d45809085034e7fa3e37756..152a7a630f4254e06129cb53ad0924672675eb7b 100644 (file)
--- a/hw/vga.c
+++ b/hw/vga.c
@@ -157,8 +157,6 @@ static uint8_t expand4to8[16];
 
 static void vga_screen_dump(void *opaque, const char *filename);
 
-static void set_vram_mapping(VGAState *s, unsigned long begin, unsigned long end);
-
 static uint32_t vga_ioport_read(void *opaque, uint32_t addr)
 {
     VGAState *s = opaque;
@@ -474,8 +472,12 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val)
                 !(s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED)) {
                 int h, shift_control;
                 static int firsttime=0;
-
-                set_vram_mapping(s, s->lfb_addr, s->lfb_end);
+                
+                if(s->map_addr != s->lfb_addr || s->map_end != s->lfb_end) {
+                    set_vram_mapping(s, s->lfb_addr, s->lfb_end);
+                    s->map_addr = s->lfb_addr;
+                    s->map_end = s->lfb_end;
+                }
 
                 s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] =
                     s->vbe_regs[VBE_DISPI_INDEX_XRES];
@@ -1745,11 +1747,42 @@ static CPUWriteMemoryFunc *vga_mem_write[3] = {
     vga_mem_writel,
 };
 
-static void set_vram_mapping(VGAState *s, unsigned long begin, unsigned long end)
+void unset_vram_mapping(void *opaque, unsigned long begin, unsigned long end)
+{
+    VGAState *s = (VGAState *) opaque;
+    if (s->stolen_vram_addr) {
+        /* We can put it there for xend to save it efficiently */
+        set_vram_mapping(s, s->stolen_vram_addr, s->stolen_vram_addr + video_ram_size);
+    } else {
+        /* Old image, we have to unmap them completely */
+        struct xen_remove_from_physmap xrfp;
+        unsigned long i;
+        int rc;
+
+        if (end > begin + video_ram_size)
+            end = begin + video_ram_size;
+
+        fprintf(logfile,"unmapping vram from %lx - %lx\n", begin, end);
+
+        xrfp.domid = domid;
+
+        for (i = 0; i < (end - begin) >> TARGET_PAGE_BITS; i++) {
+            xrfp.gpfn = (begin >> TARGET_PAGE_BITS) + i;
+            rc = xc_memory_op(xc_handle, XENMEM_remove_from_physmap, &xrfp);
+            if (rc) {
+                fprintf(stderr, "remove_from_physmap PFN %"PRI_xen_pfn" failed: %d\n", xrfp.gpfn, rc);
+                return;
+            }
+        }
+    }
+}
+
+void set_vram_mapping(void *opaque, unsigned long begin, unsigned long end)
 {
     unsigned long i;
     struct xen_add_to_physmap xatp;
     int rc;
+    VGAState *s = (VGAState *) opaque;
 
     if (end > begin + video_ram_size)
         end = begin + video_ram_size;
@@ -1826,8 +1859,10 @@ static void vga_save(QEMUFile *f, void *opaque)
 #endif
     vram_size = s->vram_size;
     qemu_put_be32s(f, &vram_size);
+    qemu_put_be32(f, s->map_addr);
+    qemu_put_be32(f, s->map_end);
     qemu_put_be64s(f, &s->stolen_vram_addr);
-    if (!s->stolen_vram_addr)
+    if (!s->stolen_vram_addr && !s->map_addr)
         /* Old guest: VRAM is not mapped, we have to save it ourselves */
         qemu_put_buffer(f, s->vram_ptr, video_ram_size);
 }
@@ -1841,7 +1876,7 @@ static int vga_load(QEMUFile *f, void *opaque, int version_id)
     int i;
 #endif
 
-    if (version_id > 4)
+    if (version_id > 5)
         return -EINVAL;
 
     if (s->pci_dev && version_id >= 2) {
@@ -1888,18 +1923,23 @@ static int vga_load(QEMUFile *f, void *opaque, int version_id)
         return -EINVAL;
 #endif
     if (version_id >= 3) {
-        /* people who restore old images may be lucky ... */
-        qemu_get_be32s(f, &vram_size);
-        if (vram_size != s->vram_size)
-            return -EINVAL;
+       /* people who restore old images may be lucky ... */
+       qemu_get_be32s(f, &vram_size);
+       if (vram_size != s->vram_size)
+           return -EINVAL;
+        if (version_id >= 5) {
+            qemu_get_be32s(f, &s->map_addr);
+            qemu_get_be32s(f, &s->map_end);
+        }
         if (version_id >= 4) {
             qemu_get_be64s(f, &s->stolen_vram_addr);
-            if (s->stolen_vram_addr)
-                xen_vga_vram_map(s->stolen_vram_addr, 0);
+            if (s->stolen_vram_addr || s->map_addr) {
+                xen_vga_vram_map(s->map_addr ? s->map_addr : s->stolen_vram_addr, 0);
+            } else {
+                qemu_get_buffer(f, s->vram_ptr, s->vram_size); 
+                xen_vga_populate_vram(s->lfb_addr);
+            }
         }
-        /* Old guest, VRAM is not mapped, we have to restore it ourselves */
-        if (!s->stolen_vram_addr)
-            qemu_get_buffer(f, s->vram_ptr, s->vram_size);
     }
 
     /* force refresh */
@@ -2228,7 +2268,7 @@ static void vga_init(VGAState *s)
 {
     int vga_io_memory;
 
-    register_savevm("vga", 0, 4, vga_save, vga_load, s);
+    register_savevm("vga", 0, 5, vga_save, vga_load, s);
 
     register_ioport_write(0x3c0, 16, 1, vga_ioport_write, s);
 
index 0b441192cfc60031cfa9d1cb9f86f474bb8058f9..8afbe622566834875ad1c9547d8b708be0687879 100644 (file)
@@ -92,6 +92,8 @@
     unsigned int bios_size;                                             \
     uint32_t lfb_addr;                                                  \
     uint32_t lfb_end;                                                   \
+    uint32_t map_addr;                                                  \
+    uint32_t map_end;                                                   \
     PCIDevice *pci_dev;                                                 \
     uint32_t latch;                                                     \
     uint8_t sr_index;                                                   \
index c73fafe32c7dd886ebdf22e0f44d628c542ab391..f751a4a8e111056fbd8d3896952f7bc7795b3468 100644 (file)
@@ -24,6 +24,8 @@ void pci_xen_platform_init(PCIBus *bus);
 void xen_vga_stolen_vram_addr(uint64_t vram_addr);
 void xen_vga_populate_vram(uint64_t vram_addr);
 void xen_vga_vram_map(uint64_t vram_addr, int copy);
+void set_vram_mapping(void *opaque, unsigned long begin, unsigned long end);
+void unset_vram_mapping(void *opaque, unsigned long begin, unsigned long end);
 #endif
 
 void ide_unplug_harddisks(void);