[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] ioemu/qemu vga: save and restore vram buffer (revised)



andrzej zaborowski writes ("Re: [Qemu-devel] [PATCH] ioemu/qemu vga: save and 
restore vram buffer"):
> On 10/12/2007, Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> wrote:
> > I have reinterpreted the `is_vbe' byte, which is related to
> > CONFIG_BOCHS_VBE, as a general flags word.  This enables my code to
> > allow old images to be restored (albeit with loss of VGA memory), by
> > using another bit in that word to indicate whether the VGA memory dump
> > is present.
> 
> You can use the version_id parameter for that. Increase the value
> passed to register_savevm and load the vram only if version_id >= 2.

Oh!  That's much better.  Thanks.  Below are two patches:

The first one (stdvga-save-vram-update.patch) is against current
xen-unstable tip (which now includes my previous version) and should
be applied there.

The second (stdvga-save-vram-take2.patch) is a fresh diff against the
same qemu as before and should be regarded as replacing my previous
submission.

Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>

Ian.

diff -r f2f7c92bf1c1 tools/ioemu/hw/vga.c
--- a/tools/ioemu/hw/vga.c      Wed Dec 12 11:08:21 2007 +0000
+++ b/tools/ioemu/hw/vga.c      Wed Dec 12 11:27:24 2007 +0000
@@ -1742,7 +1742,6 @@ static void vga_save(QEMUFile *f, void *
 static void vga_save(QEMUFile *f, void *opaque)
 {
     VGAState *s = opaque;
-    unsigned save_format_flags;
     uint32_t vram_size;
 #ifdef CONFIG_BOCHS_VBE
     int i;
@@ -1774,9 +1773,8 @@ static void vga_save(QEMUFile *f, void *
     qemu_put_buffer(f, s->palette, 768);
 
     qemu_put_be32s(f, &s->bank_offset);
-    save_format_flags = VGA_SAVE_FORMAT_FLAG_VRAM_DATA;
 #ifdef CONFIG_BOCHS_VBE
-    qemu_put_byte(f, save_format_flags | VGA_SAVE_FORMAT_FLAG_BOCHS_VBE);
+    qemu_put_byte(f, 1);
     qemu_put_be16s(f, &s->vbe_index);
     for(i = 0; i < VBE_DISPI_INDEX_NB; i++)
         qemu_put_be16s(f, &s->vbe_regs[i]);
@@ -1784,7 +1782,7 @@ static void vga_save(QEMUFile *f, void *
     qemu_put_be32s(f, &s->vbe_line_offset);
     qemu_put_be32s(f, &s->vbe_bank_mask);
 #else
-    qemu_put_byte(f, save_format_flags);
+    qemu_put_byte(f, 0);
 #endif
     vram_size = s->vram_size;
     qemu_put_be32s(f, &vram_size); 
@@ -1794,11 +1792,13 @@ static int vga_load(QEMUFile *f, void *o
 static int vga_load(QEMUFile *f, void *opaque, int version_id)
 {
     VGAState *s = opaque;
-    int ret;
-    unsigned int save_format_flags;
+    int is_vbe, ret;
     uint32_t vram_size;
-
-    if (version_id > 2)
+#ifdef CONFIG_BOCHS_VBE
+    int i;
+#endif
+
+    if (version_id > 3)
         return -EINVAL;
 
     if (s->pci_dev && version_id >= 2) {
@@ -1830,9 +1830,9 @@ static int vga_load(QEMUFile *f, void *o
     qemu_get_buffer(f, s->palette, 768);
 
     qemu_get_be32s(f, &s->bank_offset);
-    save_format_flags = qemu_get_byte(f);
+    is_vbe = qemu_get_byte(f);
 #ifdef CONFIG_BOCHS_VBE
-    if (!(save_format_flags & VGA_SAVE_FORMAT_FLAG_BOCHS_VBE))
+    if (!is_vbe)
         return -EINVAL;
     qemu_get_be16s(f, &s->vbe_index);
     for(i = 0; i < VBE_DISPI_INDEX_NB; i++)
@@ -1841,10 +1841,10 @@ static int vga_load(QEMUFile *f, void *o
     qemu_get_be32s(f, &s->vbe_line_offset);
     qemu_get_be32s(f, &s->vbe_bank_mask);
 #else
-    if (save_format_flags & VGA_SAVE_FORMAT_FLAG_BOCHS_VBE)
+    if (is_vbe)
         return -EINVAL;
 #endif
-    if (save_format_flags & VGA_SAVE_FORMAT_FLAG_VRAM_DATA) {
+    if (version_id >= 3) {
        /* people who restore old images may be lucky ... */
        qemu_get_be32s(f, &vram_size);
        if (vram_size != s->vram_size)
@@ -2064,7 +2064,7 @@ static void vga_init(VGAState *s)
 {
     int vga_io_memory;
 
-    register_savevm("vga", 0, 2, vga_save, vga_load, s);
+    register_savevm("vga", 0, 3, vga_save, vga_load, s);
 
     register_ioport_write(0x3c0, 16, 1, vga_ioport_write, s);
 
diff -r f2f7c92bf1c1 tools/ioemu/hw/vga_int.h
--- a/tools/ioemu/hw/vga_int.h  Wed Dec 12 11:08:21 2007 +0000
+++ b/tools/ioemu/hw/vga_int.h  Wed Dec 12 11:27:54 2007 +0000
@@ -157,9 +157,6 @@ static inline int c6_to_8(int v)
     return (v << 2) | (b << 1) | b;
 }
 
-#define VGA_SAVE_FORMAT_FLAG_BOCHS_VBE  0x01
-#define VGA_SAVE_FORMAT_FLAG_VRAM_DATA  0x02
-
 void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base, 
                      unsigned long vga_ram_offset, int vga_ram_size);
 uint32_t vga_mem_readb(void *opaque, target_phys_addr_t addr);

h--99eSOG+WoR
Content-Type: text/plain
Content-Description: vga save vram (revised)
Content-Disposition: inline;
        filename="stdvga-save-vram-take2.patch"
Content-Transfer-Encoding: 7bit

diff -r 4054cd60895b tools/ioemu/hw/vga.c
--- a/tools/ioemu/hw/vga.c      Mon Dec 10 13:49:22 2007 +0000
+++ b/tools/ioemu/hw/vga.c      Wed Dec 12 11:27:24 2007 +0000
@@ -1742,6 +1742,7 @@ static void vga_save(QEMUFile *f, void *
 static void vga_save(QEMUFile *f, void *opaque)
 {
     VGAState *s = opaque;
+    uint32_t vram_size;
 #ifdef CONFIG_BOCHS_VBE
     int i;
 #endif
@@ -1783,17 +1784,21 @@ static void vga_save(QEMUFile *f, void *
 #else
     qemu_put_byte(f, 0);
 #endif
+    vram_size = s->vram_size;
+    qemu_put_be32s(f, &vram_size); 
+    qemu_put_buffer(f, s->vram_ptr, s->vram_size); 
 }
 
 static int vga_load(QEMUFile *f, void *opaque, int version_id)
 {
     VGAState *s = opaque;
     int is_vbe, ret;
+    uint32_t vram_size;
 #ifdef CONFIG_BOCHS_VBE
     int i;
 #endif
 
-    if (version_id > 2)
+    if (version_id > 3)
         return -EINVAL;
 
     if (s->pci_dev && version_id >= 2) {
@@ -1839,6 +1844,13 @@ static int vga_load(QEMUFile *f, void *o
     if (is_vbe)
         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;
+       qemu_get_buffer(f, s->vram_ptr, s->vram_size); 
+    }
 
     /* force refresh */
     s->graphic_mode = -1;
@@ -2052,7 +2064,7 @@ static void vga_init(VGAState *s)
 {
     int vga_io_memory;
 
-    register_savevm("vga", 0, 2, vga_save, vga_load, s);
+    register_savevm("vga", 0, 3, vga_save, vga_load, s);
 
     register_ioport_write(0x3c0, 16, 1, vga_ioport_write, s);
 
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.