Dear Reinhard Meyer, In message <4ca9be94.6000...@emk-elektronik.de> you wrote: > > Do you imply that the code is really different when the pointer gets > its value by assigning it NOT to a packed entity? Hard to believe.
This is a special "feature" of GCC on ARM. -> cat foo.c #define writel(v,a) (*(volatile unsigned int *)(a) = (v)) struct p { int n; } __attribute__ ((packed)); struct q { int n; }; void foo() { struct p *pp = (struct p *)0x1000; pp->n = 5; } void bar() { struct q *qq = (struct q *)0x1000; qq->n = 5; } -> arm-linux-gcc -O -S foo.c -> cat foo.s .file "foo.c" .text .align 2 .global foo .type foo, %function foo: @ Function supports interworking. @ args = 0, pretend = 0, frame = 0 @ frame_needed = 0, uses_anonymous_args = 0 @ link register save eliminated. @ lr needed for prologue mov r3, #4096 mov r2, #0 orr r1, r2, #5 strb r1, [r3, #0] strb r2, [r3, #1] strb r2, [r3, #2] strb r2, [r3, #3] bx lr .size foo, .-foo .align 2 .global bar .type bar, %function bar: @ Function supports interworking. @ args = 0, pretend = 0, frame = 0 @ frame_needed = 0, uses_anonymous_args = 0 @ link register save eliminated. @ lr needed for prologue mov r2, #5 mov r3, #4096 str r2, [r3, #0] bx lr .size bar, .-bar .ident "GCC: (GNU) 4.2.2" Note that this is with GCC 4.2.2. Even GCC 4.0.0 behaves the same, so this is *not* an issue with very recent tool chains. > 2. the culprit on ARM is that unaligned accesses do not raise any signal > but silently IGNORE the "unused" adress lines which leads to very > undesirable effects that are hard to find. Well, the compiler turning a single 32 bit access silently into 4 x 8 bit accesses can also lead to very undesirable effects that are hard to find, especially when accessing hardware that performs auto-incrementing or any kind of (IRQ or similar) ACK for each access. > *((int *)0x10000) = 5 is the same as *((int *)0x10003) = 5 ! > Both write 5 to the word at adress 0x10000 ! > > So, MAYBE, in newer toolchains it was decided to circumvent that problem > by always assuming unaligned pointers unless clearly instructed otherwise. No, AFAICT this behaviour has not changed in the last few months / years. > Nope. It does not have to do with packed. It would have to do with the fact > that I/O registers cannot be safely written byte-wise. Yes, it has to do with pcked. See above. Best regards, Wolfgang Denk -- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: w...@denx.de If a person (a) is poorly, (b) receives treatment intended to make him better, and (c) gets better, then no power of reasoning known to medical science can convince him that it may not have been the treatment that restored his health. - Sir Peter Medawar, The Art of the Soluble _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot