From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KQGsU-00018F-OF for qemu-devel@nongnu.org; Tue, 05 Aug 2008 03:22:42 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KQGsT-000182-9i for qemu-devel@nongnu.org; Tue, 05 Aug 2008 03:22:41 -0400 Received: from [199.232.76.173] (port=56331 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KQGsT-00017z-3u for qemu-devel@nongnu.org; Tue, 05 Aug 2008 03:22:41 -0400 Received: from mx20.gnu.org ([199.232.41.8]:7478) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KQGsT-000230-0X for qemu-devel@nongnu.org; Tue, 05 Aug 2008 03:22:41 -0400 Received: from mx1.redhat.com ([66.187.233.31]) by mx20.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KQGsR-0000lx-Sc for qemu-devel@nongnu.org; Tue, 05 Aug 2008 03:22:40 -0400 Message-ID: <4897FEC9.1000709@redhat.com> Date: Tue, 05 Aug 2008 09:18:33 +0200 From: Gerd Hoffmann MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH 5/7] xen: add block device backend driver. References: <1217865045-10722-1-git-send-email-kraxel@redhat.com> <48975D9A.7070109@redhat.com> <200808042104.16383.paul@codesourcery.com> In-Reply-To: <200808042104.16383.paul@codesourcery.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paul Brook Cc: Blue Swirl , xen-devel@lists.xensource.com, qemu-devel@nongnu.org Paul Brook wrote: > On Monday 04 August 2008, Gerd Hoffmann wrote: >> Blue Swirl wrote: >>> On 8/4/08, Gerd Hoffmann 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/