On Sat, Sep 17, 2016 at 7:59 AM, David Kiarie <davidkiar...@gmail.com>
wrote:

>
>
> On 16/09/16 21:58, Michael S. Tsirkin wrote:
>
>> On Wed, Aug 31, 2016 at 07:17:42PM +0300, David Kiarie wrote:
>>
> Hi Michael,
>
> +
>> +/* issue a PCIe completion packet for devid */
>> +typedef struct QEMU_PACKED {
>> +    uint32_t reserved_1:16;
>> +    uint32_t devid:16;
>> +
>> +#ifdef HOST_WORDS_BIGENDIAN
>> +    uint32_t type:4;              /* command type       */
>> +    uint32_t reserved_2:8;
>> +    uint32_t pasid_19_0:20
>> +#else
>> +    uint32_t pasid_19_0:20;
>> +    uint32_t reserved_2:8;
>> +    uint32_t type:4;
>> +#endif /* __BIG_ENDIAN_BITFIELD */
>> +
>> +#ifdef HOST_WORDS_BIGENDIAN
>> +    uint32_t reserved_3:29;
>> +    uint32_t guest:1;
>> +    uint32_t reserved_4:2;
>> +#else
>> +    uint32_t reserved_3:2;
>> +    uint32_t guest:1;
>> +    uint32_t reserved_4:29;
>> +#endif /* __BIG_ENDIAN_BITFIELD */
>> +
>> +    uint32_t completion_tag:16;  /* PCIe PRI information */
>> +    uint32_t reserved_5:16;
>> +} CMDCompletePPR;
>> So as Peter points, out, we don't do this kind of
>> thing. Pls drop this ifdefery and rework using
>> masks and cpu_to_le. E.g.
>>
>>      > +#ifdef HOST_WORDS_BIGENDIAN
>>      > +    uint32_t reserved_3:29;
>>      > +    uint32_t guest:1;
>>      > +    uint32_t reserved_4:2;
>>      > +#else
>>      > +    uint32_t reserved_3:2;
>>      > +    uint32_t guest:1;
>>      > +    uint32_t reserved_4:29;
>>      > +#endif /* __BIG_ENDIAN_BITFIELD */
>>
>>      guest = 1;
>>
>> ->
>>
>> #define GUEST cpu_to_le32(0x1 << 2)
>> uint32_t guest;
>>
>> guest = GUEST;
>>
>
> This might not solve the problem we are encountering here. I don't intent
> to write any values to these fields. I only intend to read.
>
> I read into these structs using 'dma_memory_read' which gives me a memory
> order dependent on the host. Byte swapping the read buffer will lead into
> some of the fields being permanently corrupted since they span across byte
> boundaries. I actually didn't have any bitfields(and was not taking care of
> BE) but then there were some complains that the code was barely readable
> hence the bitfields and later the ifdefinery but I've never checked that
> the BE code complies.


'extract64' seems to solve everything though so I can get rid of all the
host dependent defines: didn't know we had this before.


>

Reply via email to