All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: Gerd Hoffmann <kraxel@redhat.com>
Cc: David Gibson <dgibson@redhat.com>, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 2/3] vga: Add endian control register
Date: Fri, 26 Sep 2014 14:34:22 +1000	[thread overview]
Message-ID: <20140926043422.GA20209@voom.redhat.com> (raw)
In-Reply-To: <1411475457-10942-3-git-send-email-kraxel@redhat.com>

[-- Attachment #1: Type: text/plain, Size: 3908 bytes --]

On Tue, Sep 23, 2014 at 02:30:56PM +0200, Gerd Hoffmann wrote:
> From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> 
> Include the endian state in the migration stream as an optional
> subsection which we only include when the endian isn't the default,
> thus enabling backward compatibility of the common case.
> 
> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> 
> Changes by kraxel:
>  * Remove bochs dispi interface changes.  We'll do that in
>    a different way to make sure we don't conflict with
>    possible future bochs dispi interface changes.
>  * keep live migration bits.
> 
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  hw/display/vga.c     | 41 +++++++++++++++++++++++++++++++++++++----
>  hw/display/vga_int.h |  4 +++-
>  2 files changed, 40 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/display/vga.c b/hw/display/vga.c
> index 3f02984..fd16806 100644
> --- a/hw/display/vga.c
> +++ b/hw/display/vga.c
> @@ -1508,7 +1508,8 @@ static void vga_draw_graphic(VGACommonState *s, int full_update)
>      if (s->line_offset != s->last_line_offset ||
>          disp_width != s->last_width ||
>          height != s->last_height ||
> -        s->last_depth != depth) {
> +        s->last_depth != depth ||
> +        s->last_byteswap != byteswap) {
>          if (depth == 32 || (depth == 16 && !byteswap)) {
>              pixman_format_code_t format =
>                  qemu_default_pixman_format(depth, !byteswap);
> @@ -1526,6 +1527,7 @@ static void vga_draw_graphic(VGACommonState *s, int full_update)
>          s->last_height = height;
>          s->last_line_offset = s->line_offset;
>          s->last_depth = depth;
> +        s->last_byteswap = byteswap;
>          full_update = 1;
>      } else if (is_buffer_shared(surface) &&
>                 (full_update || surface_data(surface) != s->vram_ptr
> @@ -1789,6 +1791,7 @@ void vga_common_reset(VGACommonState *s)
>      s->cursor_start = 0;
>      s->cursor_end = 0;
>      s->cursor_offset = 0;
> +    s->big_endian_fb = s->default_endian_fb;
>      memset(s->invalidated_y_table, '\0', sizeof(s->invalidated_y_table));
>      memset(s->last_palette, '\0', sizeof(s->last_palette));
>      memset(s->last_ch_attr, '\0', sizeof(s->last_ch_attr));
> @@ -2020,6 +2023,28 @@ static int vga_common_post_load(void *opaque, int version_id)
>      return 0;
>  }
>  
> +static bool vga_endian_state_needed(void *opaque)
> +{
> +    VGACommonState *s = opaque;
> +
> +    /*
> +     * Only send the endian state if it's different from the
> +     * default one, thus ensuring backward compatibility for
> +     * migration of the common case
> +     */
> +    return s->default_endian_fb != s->big_endian_fb;
> +}
> +
> +const VMStateDescription vmstate_vga_endian = {
> +    .name = "vga.endian",
> +    .version_id = 1,
> +    .minimum_version_id = 1,
> +    .fields = (VMStateField[]) {
> +        VMSTATE_UINT8_EQUAL(big_endian_fb, VGACommonState),

I don't think this is right.  If I'm remembering how the vmstate
macros work, this will abort if big_endian_fb isn't equal on source
and destination.  Which means as soon as it's possible to actually
change the big_endian_fb value, migrations will start failing/

I think this should instead be VMSTATE_BOOL()

[snip]
> -    bool big_endian_fb;
> +    uint8_t big_endian_fb;
> +    uint8_t default_endian_fb;
>      /* hardware mouse cursor support */
>      uint32_t invalidated_y_table[VGA_MAX_HEIGHT / 32];
>      void (*cursor_invalidate)(struct VGACommonState *s);

In which case you also don't need to change the type of the
big_endian_fb field.

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: Type: application/pgp-signature, Size: 819 bytes --]

  reply	other threads:[~2014-09-26  4:56 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-23 12:30 [Qemu-devel] [PATCH 0/3] vga: add endianness switching support Gerd Hoffmann
2014-09-23 12:30 ` [Qemu-devel] [PATCH 1/3] vga: Make fb endian a common state variable Gerd Hoffmann
2014-09-26  4:28   ` David Gibson
2014-09-23 12:30 ` [Qemu-devel] [PATCH 2/3] vga: Add endian control register Gerd Hoffmann
2014-09-26  4:34   ` David Gibson [this message]
2014-09-23 12:30 ` [Qemu-devel] [PATCH 3/3] vga-pci: add qext region to mmio Gerd Hoffmann
2014-09-26  4:38   ` David Gibson
2014-09-29 16:18   ` Michael S. Tsirkin
2014-09-30 11:02     ` Gerd Hoffmann
2014-09-23 20:24 ` [Qemu-devel] [PATCH 0/3] vga: add endianness switching support Benjamin Herrenschmidt
2014-09-23 20:33   ` Alexander Graf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140926043422.GA20209@voom.redhat.com \
    --to=david@gibson.dropbear.id.au \
    --cc=dgibson@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.