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

[Xen-devel] Re: [Qemu-devel] [PATCH 5/7] xen: add block device backend driver.

Paul Brook wrote:
> On Monday 04 August 2008, Gerd Hoffmann wrote:
>> Blue Swirl wrote:
>>> On 8/4/08, Gerd Hoffmann <kraxel@xxxxxxxxxx> wrote:
>>>>  +/* i386 protocol version */
>>>>  +#pragma pack(push, 4)
>>> What's wrong with __attribute__(__aligned__)?
>> That one is tricky because we must be binary compatible with xen.  And
>> the block driver protocol has a small design flaw:  It has a 64bit value
>>  which is not aligned on a 64bit border.  This leads to different struct
>> layouts on i386 and x86_64 due to different alignment rules.  Unless you
>> force them into something else, like we do in that header file to deal
>> with it.  Which is needed to run 32bit guests on 64bit hosts.
> qemu should be host independent. You need to use packed structures with 
> appropriate padding.

I think the current code is correct.  Ok, the verbose version.  The
struct in question looks like this:

   struct blkif_request {
           uint8_t        operation;
           uint8_t        nr_segments;
           blkif_vdev_t   handle;
           uint64_t       id;
           [ ... ]

The critical element is id.  blkif_vdev_t is uint16_t, which means id is
32bit aligned but not 64bit aligned.

On i386 64bit values get 32bit alignments by default.
On x86_64 64bit values get 64bit alignments by default.
Thus x86_64 has a 32bit padding hole just before id.  i386 hasn't.

So we define a i386 and a x86_64 version of the struct.  The i386
version is wrapped into a pragma like this ...

   #pragma pack(push, 4)
   struct blkif_x86_32_request {
           [ ... ]
   #pragma pack(pop)

... to enforce i386 alignment rules everythere.
The x86_64 version looks like this ...

   struct blkif_x86_64_request {
           [ ... ]
           uint64_t       __attribute__((__aligned__(8))) id;
           [ ... ]

... to make sure the id element is 64bit aligned everythere.

That gives us the correct struct layouts for both i386 and x86_64 builds.



Xen-devel mailing list



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