On Thu, 2006-11-16 at 20:45 -0800, Roland Dreier wrote:
>  > +struct t3_send_wr {
>  > +  struct fw_riwrh wrh;    /* 0 */
>  > +  union t3_wrid wrid;     /* 1 */
>  > +
>  > +  enum t3_rdma_opcode rdmaop:8;
>  > +  u32 reserved:24;        /* 2 */
> 
> Does this do the right thing wrt endianness?  I'd be more comfortable
> with something like
> 
>       u8 rdmaop;
>         u8 reserved[3];
> 
> (although the __attribute__((packed)) on enum t3_rdma_opcode does make
> it OK to use here, I guess)
> 
>  > +  u32 rem_stag;           /* 2 */
>  > +  u32 plen;               /* 3 */
>  > +  u32 num_sgle;
>  > +  struct t3_sge sgl[T3_MAX_SGE];  /* 4+ */
>  > +};


I don't really like the bit fields either. I inherited these structs and
I'm not adverse to changing them as you suggest to get rid of bit
fields.  But I think they are correct wrt endianness.  I wrote a test
program and on a LE machine it put the u8 first in memory followed by
the 24 bit reserved.  However, I think if you use bit fields less than 8
bits its not endian safe.

BTW:  I don't have a PPC system (yet) to test this code on BE...

Here's a dumb program that plays around with bit fields...

#include <sys/types.h>
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>

struct foo {
        uint32_t        a:8;
        uint32_t        b:24;
        uint32_t        c:16;
        uint32_t        d:8;
        uint32_t        e:8;
};

struct bar {
        uint8_t         a;
        uint8_t         b[3];
        uint16_t        c;
        uint8_t         d;
        uint8_t         e;
};

struct bits {
#if 0 /* BE */
        uint32_t        a:4;
        uint32_t        b:4;
#else /* LE */
        uint32_t        b:4;
        uint32_t        a:4;
#endif
        uint32_t        c:8;
        uint32_t        d:8;
        uint32_t        e:8;
};

main()
{
        struct foo foo;
        struct bar bar;
        struct bits bits;
        uint8_t *cp;
        int i;

        foo.a = 0x01;
        foo.b = 0x020304;
        foo.c = 0x0506;
        foo.d = 0x07;
        foo.e = 0x08;

        printf("foo cpu: 0x%" PRIx64 "\n", *(uint64_t *)&foo);
        printf("foo mem: ");
        cp = (uint8_t *)&foo;
        for (i=0; i<8; i++)
                printf("%02x", *cp++);
        printf("\n");

        bar.a = 0x01;
        bar.b[0] = 0x02;
        bar.b[1] = 0x03;
        bar.b[2] = 0x04;
        bar.c = 0x0506;
        bar.d = 0x07;
        bar.e = 0x08;

        printf("bar cpu: 0x%" PRIx64 "\n", *(uint64_t *)&bar);
        printf("bar mem: ");
        cp = (uint8_t *)&bar;
        for (i=0; i<8; i++)
                printf("%02x", *cp++);
        printf("\n");


        bits.a = 0x1;
        bits.b = 0x2;
        bits.c = 0x3;
        bits.d = 0x4;
        bits.e = 0x5;
        
        printf("bits cpu: 0x%08x\n", *(uint32_t *)&bits);
        printf("bar mem: ");
        cp = (uint8_t *)&bits;
        for (i=0; i<4; i++)
                printf("%02x", *cp++);
        printf("\n");
}




-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to