|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 4/5] xen: Add V4V implementation
>>> On 18.07.12 at 22:09, Jean Guyader <jean.guyader@xxxxxxxxx> wrote:
> On 29 June 2012 11:36, Jan Beulich <JBeulich@xxxxxxxx> wrote:
>>>>> On 29.06.12 at 12:03, Jean Guyader <jean.guyader@xxxxxxxxx> wrote:
>>> On 29 June 2012 09:33, Jan Beulich <JBeulich@xxxxxxxx> wrote:
>>>>>>> On 28.06.12 at 18:26, Jean Guyader <jean.guyader@xxxxxxxxxx> wrote:
>>>>> +typedef struct v4v_ring_id
>>>>> +{
>>>>> + struct v4v_addr addr;
>>>>> + domid_t partner;
>>>>> +} V4V_PACKED v4v_ring_id_t;
>>>>> +
>>>
>>> This structure is really the one that cause trouble. domid_t is 16b
>>> and v4v_addr_t is used
>>> inside v4v_ring_t. I would like the structure to remind as close as we
>>> can from the original version
>>> as we already versions in the field. Having explicit padding will make
>>> all the structures different
>>> which will make much harder to write a driver that will support the
>>> two versions of the API.
>>
>> Oh, I see, "partner" would end up on a different offset if the
>> packed attribute was removed from v4v_addr_t. But that
>> could still be solved by making this type a union:
>>
>> typedef union v4v_ring_id
>> {
>> struct v4v_addr addr;
>> struct {
>> uint32_t port;
>> domid_t domain;
>> domid_t partner;
>> } full;
>> } v4v_ring_id_t;
>>
>> That would guarantee binary compatibility. And you could even
>> achieve source compatibility for gcc users by making the naming
>> of the second structure conditional upon __GNUC__ being
>> undefined (or adding a second instance of the same, just
>> unnamed structure within a respective #ifdef - that would make
>> it possible to write code that can be compiled by both gcc and
>> non-gcc, yet existing gcc-only code would need changing).
>>
>>> Also most all the consumer of those headers will have to rewrite the
>>> structure anyway, for instance
>>> the Linux kernel have it's own naming convention, macros definitions
>>> which are different, etc..
>>
>> Such can usually be done via scripts, so having a fully defined
>> public header is still worthwhile.
>>
>
> Hi,
>
> I've been working on this and it work for most of it apart from one case.
> Let's take this structure:
>
> struct a
> {
> uint64_t a;
> uint32_t b;
> uint16_t c;
> uint16_t d;
> uint32_t e;
> uint32_t f;
> uint32_t g;
> uint8_t h[32];
> uint8_t q[0];
> };
>
> On 32b with and without packing sizeof the struct a is 60 but on 64b the
> size of
> the struct a is 64 without packing and 60 with packing.
> However offset of q is 60 is all the case below.
>
> One option would be to replace in the code sizeof "struct q" with
> offset of "q" be
> I think there is probably something better that could be done.
Not sure what you're trying to tell me here, but I'd like to note
that sizeof() is mostly meaningless on a structure with a trailing
[0] member anyway, so all you're after is that all offsetof()-s
are identical, which you say they are.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |