[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 5/7] xen: add block device backend driver.
From: |
Gerd Hoffmann |
Subject: |
Re: [Qemu-devel] [PATCH 5/7] xen: add block device backend driver. |
Date: |
Tue, 05 Aug 2008 09:18:33 +0200 |
User-agent: |
Thunderbird 2.0.0.14 (X11/20080501) |
Paul Brook wrote:
> On Monday 04 August 2008, Gerd Hoffmann wrote:
>> Blue Swirl wrote:
>>> On 8/4/08, Gerd Hoffmann <address@hidden> 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.
cheers,
Gerd
--
http://kraxel.fedorapeople.org/xenner/
- Re: [Qemu-devel] [PATCH 1/7] xen: groundwork for xen support, (continued)
- [Qemu-devel] [PATCH 5/7] xen: add block device backend driver., Gerd Hoffmann, 2008/08/04
- Re: [Xen-devel] Re: [Qemu-devel] [PATCH 5/7] xen: add block device backend driver., Samuel Thibault, 2008/08/04
- Re: [Xen-devel] Re: [Qemu-devel] [PATCH 5/7] xen: add block device backend driver., Gerd Hoffmann, 2008/08/05
- Re: [Xen-devel] Re: [Qemu-devel] [PATCH 5/7] xen: add block device backend driver., Samuel Thibault, 2008/08/05
- Re: [Xen-devel] Re: [Qemu-devel] [PATCH 5/7] xen: add block device backend driver., Gerd Hoffmann, 2008/08/05
- Re: [Xen-devel] Re: [Qemu-devel] [PATCH 5/7] xen: add block device backend driver., Samuel Thibault, 2008/08/05
[Qemu-devel] [PATCH 2/7] xen: backend driver core, Gerd Hoffmann, 2008/08/04
[Qemu-devel] [PATCH 3/7] xen: add console backend driver., Gerd Hoffmann, 2008/08/04