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

2007-12-17 Thread Paul Brook
> In any case, vl.c's saving arrangements do save the buffer in
> phys_ram_base - but that isn't what the guest sees in the VGA memory

It doesn't matter what the guest physical mappings (if any) are.

> area.  The guest sees the vga memory-mapped IO registers (whose
> meaning _is_ generally saved by vga.c), plus it can use the VGA memory
> area and those control registers to access the whole of s->vram_ptr in
> a bank-switched way.  And it is that whole VGA memory buffer which is
> `displayed' to (eg) vlc clients.

If you look closer, you'll find that s->vram_ptr actually points to an offset 
from phys_ram_base. So the VGA framebuffer is already saved by ram_save.

If the xen patches have changed this then you may need your patch. It has no 
business in mainstream qemu though.

Paul




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

2007-12-17 Thread Ian Jackson
andrzej zaborowski writes ("Re: [Qemu-devel] [PATCH] ioemu/qemu vga: save and 
restore vram buffer (revised)"):
> On a second look there's something else I don't understand. The vram
> window is in RAM in stdvga, it's inside phys_ram_base, and the entire
> chunk pointed to by phys_ram_base is saved in vl.c. It's also
> saved/loaded as one of the first things that are loaded so at the time
> stdvga resumes, the vram should already have the correct contents.

(You seem to be talking about the qemu case, rather than the Xen case,
but the principles are the same:)

phys_ram_base is used by qemu to store the guest's ordinary RAM.  It
is accessed by the guest when the guest does memory operations on
physical memory addresses referring to emulated RAM.

However, the emulated stdvga adaptor is not emulated RAM in that
sense.  It registers itself via cpu_register_io_memory, arranging that
references to its memory range of [0xa,0xc) are diverted to
vga_mem_{read,write}{b,w,l}.  Those functions provide access to the
VGA memory RAM buffer, which on a real video card is a separate set of
RAM chips and in qemu is a separate buffer (s->vram_*).

The access arrangements do not provide direct access to the whole of
the (emulated) VGA RAM.  The VGA RAM is VGA_RAM_SIZE long, ie
generally 8Mby.  That obviously doesn't fit in the available 128Kby of
address space.  Instead, depending on the vga mode a banking
arrangement is used.  See vga_mem_readb, for example.

In any case, vl.c's saving arrangements do save the buffer in
phys_ram_base - but that isn't what the guest sees in the VGA memory
area.  The guest sees the vga memory-mapped IO registers (whose
meaning _is_ generally saved by vga.c), plus it can use the VGA memory
area and those control registers to access the whole of s->vram_ptr in
a bank-switched way.  And it is that whole VGA memory buffer which is
`displayed' to (eg) vlc clients.

The area of phys_ram_base corresponding to the VGA memory area, which
is indeed saved and restored, is not used by anything.  But that's
only 128kby and in any case qemu compresses it.

For guests which make modest use of the vga facilities not saving the
buffer is at most a bit annoying - you just have to ask the guest to
repaint its screen, which is often easy and depending on circumstances
may happen anyway.  But guests which make fuller use of vga (for a
typical example, consider a graphical OS installer or bootloader) that
workaround isn't effective.

Ian.




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

2007-12-16 Thread andrzej zaborowski
Hi,

On 12/12/2007, Ian Jackson <[EMAIL PROTECTED]> wrote:
> 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.

On a second look there's something else I don't understand. The vram
window is in RAM in stdvga, it's inside phys_ram_base, and the entire
chunk pointed to by phys_ram_base is saved in vl.c. It's also
saved/loaded as one of the first things that are loaded so at the time
stdvga resumes, the vram should already have the correct contents.
Regards




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

2007-12-12 Thread Ian Jackson
andrzej zaborowski writes ("Re: [Qemu-devel] [PATCH] ioemu/qemu vga: save and 
restore vram buffer"):
> On 10/12/2007, Ian Jackson <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]>

Ian.

diff -r f2f7c92bf1c1 tools/ioemu/hw/vga.c
--- a/tools/ioemu/hw/vga.c  Wed Dec 12 11:08:21 2007 +
+++ b/tools/ioemu/hw/vga.c  Wed Dec 12 11:27:24 2007 +
@@ -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 +
+++ b/tools/ioemu/hw/vga_int.h  Wed Dec 12 11:27:54 2007 +
@@ -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 +
+++ b/tools/ioemu/hw/vga.c  Wed Dec 12 11:27:24 2007 +
@@ -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 vo