Re: [PATCH] ubi: kill homegrown endian macros

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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));
}

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux