[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. cheers, Gerd -- http://kraxel.fedorapeople.org/xenner/ _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |