lkml.org 
[lkml]   [2006]   [Nov]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH 09/13] Core WQE/CQE Types
    From
    Date
    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 linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2006-11-17 18:07    [W:0.025 / U:23.492 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site