[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |