|   | 
      | 
  
  
      | 
      | 
  
 
     | 
    | 
  
  
     | 
    | 
  
  
    |   | 
      | 
  
  
    | 
         
xen-devel
[Xen-devel] Re: [Qemu-devel] [PATCH 5/7] xen: add block device	backend d
 
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
 |   
 
 | 
    | 
  
  
    |   | 
    |