Patchwork [v2,RESEND] pc: e820 qemu_cfg tables need to be packed

login
register
mail settings
Submitter Alex Williamson
Date Nov. 5, 2010, 9:40 p.m.
Message ID <20101105214030.31799.12838.stgit@s20.home>
Download mbox | patch
Permalink /patch/70302/
State New
Headers show

Comments

Alex Williamson - Nov. 5, 2010, 9:40 p.m.
We can't let the compiler define the alignment for qemu_cfg data.

Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
---

 hw/pc.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
Blue Swirl - Nov. 7, 2010, 2:59 p.m.
On Fri, Nov 5, 2010 at 9:40 PM, Alex Williamson
<alex.williamson@redhat.com> wrote:
> We can't let the compiler define the alignment for qemu_cfg data.

Actually, whole e820_table implementation seems to be buggy. The
structure may not be passed directly to fw_cfg interface without
endianness conversions, otherwise the emulation will not work on big
endian host.
Alex Williamson - Nov. 10, 2010, 4:09 p.m.
On Sun, 2010-11-07 at 14:59 +0000, Blue Swirl wrote:
> On Fri, Nov 5, 2010 at 9:40 PM, Alex Williamson
> <alex.williamson@redhat.com> wrote:
> > We can't let the compiler define the alignment for qemu_cfg data.
> 
> Actually, whole e820_table implementation seems to be buggy. The
> structure may not be passed directly to fw_cfg interface without
> endianness conversions, otherwise the emulation will not work on big
> endian host.

I sent a patch for this a couple days ago:

http://lists.nongnu.org/archive/html/qemu-devel/2010-11/msg00481.html

I think that resolves your concern.  Thanks,

Alex
Anthony Liguori - Nov. 16, 2010, 10:24 p.m.
On 11/05/2010 04:40 PM, Alex Williamson wrote:
> We can't let the compiler define the alignment for qemu_cfg data.
>
> Signed-off-by: Alex Williamson<alex.williamson@redhat.com>
>    

Applied.  Thanks.

Regards,

Anthony Liguori
> ---
>
>   hw/pc.c |    4 ++--
>   1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/hw/pc.c b/hw/pc.c
> index 69b13bf..0264e3d 100644
> --- a/hw/pc.c
> +++ b/hw/pc.c
> @@ -75,12 +75,12 @@ struct e820_entry {
>       uint64_t address;
>       uint64_t length;
>       uint32_t type;
> -};
> +} __attribute((__packed__, __aligned__(4)));
>
>   struct e820_table {
>       uint32_t count;
>       struct e820_entry entry[E820_NR_ENTRIES];
> -};
> +} __attribute((__packed__, __aligned__(4)));
>
>   static struct e820_table e820_table;
>
>
>
>
>

Patch

diff --git a/hw/pc.c b/hw/pc.c
index 69b13bf..0264e3d 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -75,12 +75,12 @@  struct e820_entry {
     uint64_t address;
     uint64_t length;
     uint32_t type;
-};
+} __attribute((__packed__, __aligned__(4)));
 
 struct e820_table {
     uint32_t count;
     struct e820_entry entry[E820_NR_ENTRIES];
-};
+} __attribute((__packed__, __aligned__(4)));
 
 static struct e820_table e820_table;