lkml.org 
[lkml]   [2007]   [May]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH] ubi: kill homegrown endian macros
    Hi,

    David Woodhouse wrote:
    > On Thu, 2007-05-17 at 20:30 +0000, Matthieu CASTET wrote:
    >> On arch that don't support aligned access, packed struct access will be
    >> done byte per byte (but it could be the expected behavior if there
    >> unaligned access).
    >
    > When I tested this on ARM, the output for je32_to_cpu et al was fine.
    > For _other_ structures where I'd used __attribute__((packed)) to be
    > safe, gcc would emit code to handle unaligned loads. But not in the
    > simple case where the struct has only one member.
    >
    > Are you suggesting that this has changed since I did my testing?
    >
    here a small example I made and try with a sourcery 2006q3-27


    /tmp/arm-2006q3/bin/arm-none-linux-gnueabi-gcc -S test.c -O3 -o
    test.s.packed
    /tmp/arm-2006q3/bin/arm-none-linux-gnueabi-gcc -S test.c -DNOP -O3 -o test.s

    $diff test.s test.s.packed 19,23c19,34
    < @ link register save eliminated.
    < ldrh r2, [r1, #0]
    < ldrh r1, [r0, #2]
    < ldr r0, [r0, #4]
    < @ lr needed for prologue
    ---
    > stmfd sp!, {r4, r5, r6, lr}
    > ldrb r2, [r0, #5] @ zero_extendqisi2
    > ldrb r3, [r0, #4] @ zero_extendqisi2
    > mov lr, r1
    > ldrb r4, [r0, #6] @ zero_extendqisi2
    > ldrb r5, [r0, #3] @ zero_extendqisi2
    > ldrb r6, [r1, #1] @ zero_extendqisi2
    > orr r3, r3, r2, asl #8
    > ldrb r1, [r0, #2] @ zero_extendqisi2
    > ldrb ip, [r0, #7] @ zero_extendqisi2
    > ldrb r2, [lr, #0] @ zero_extendqisi2
    > orr r3, r3, r4, asl #16
    > orr r0, r3, ip, asl #24
    > orr r1, r1, r5, asl #8
    > orr r2, r2, r6, asl #8
    > ldmfd sp!, {r4, r5, r6, lr}


    Matthieu
    #include <stdint.h>
    #ifdef NOP
    #define jint32_t uint32_t
    #define jint16_t uint16_t

    #define je16_to_cpu(x) ((x))
    #define je32_to_cpu(x) ((x))
    #else

    typedef struct {
    uint32_t v32;
    } __attribute__((packed)) jint32_t;

    typedef struct {
    uint16_t v16;
    } __attribute__((packed)) jint16_t;
    #define je16_to_cpu(x) ((x).v16)
    #define je32_to_cpu(x) ((x).v32)
    #endif
    struct jffs2_sum_unknown_flash
    {
    jint16_t nodetype; /* node type */
    };

    struct jffs2_unknown_node
    {
    /* All start like this */
    jint16_t magic;
    jint16_t nodetype;
    jint32_t totlen; /* So we can skip over nodes we don't grok */
    jint32_t hdr_crc;
    };


    int boo(struct jffs2_unknown_node *node, void *sp)
    {

    foo(je32_to_cpu(node->totlen), je16_to_cpu(node->nodetype), je16_to_cpu(((struct jffs2_sum_unknown_flash *)sp)->nodetype));
    }
    \
     
     \ /
      Last update: 2007-05-18 22:33    [W:0.021 / U:125.112 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site