[U-Boot] [RFC PATCH v2] ARM: Avoid compiler optimization for usages of readb, writeb and friends.

Alexander Holler
2010-12-22T11:23:32Z

Hello,

Am 22.12.2010 09:02, schrieb Wolfgang Denk:

> In message<1292711230-3234-1-git-send-email-holler@ahsoftware.de> you wrote:
>> gcc 4.5.1 seems to ignore (at least some) volatile definitions,
>> avoid that as done in the kernel.
> ...
>> +#define writeb(v,c) ({ __iowmb(); __arch_putb(v,c); })
>> +#define writew(v,c) ({ __iowmb(); __arch_putw(v,c); })
>> +#define writel(v,c) ({ __iowmb(); __arch_putl(v,c); })
>
> http://www.codesourcery.com/archives/arm-gnu/msg03990.html explains
> why this construct is causing errors in cases where an additional read
> from the address is unsupported.
>
> Can you please try the following patch instead?

Indeed. Using do {} while (0) instead of that "GCC statement-expression"
fixes the problem with the read after write.

I didn't know about that "GCC statement-expression" and my usage of
({...}) was based on the writeb in the kernel-headers. But they (seem
to) expand to something returning (void) which might avoid the problem.

Good that I've added the sentence that using the kernel-headers instead
of that patch might be a better solution. But this might bring in much
more changes, including real memory barriers. ;)

Anyway, now the master (including the GLOBAL...-patch) + patch v3 for
read*/write* is good here. Just tested with both gcc 4.3.5 and gcc 4.5.1
using binutils 2.20.1.

Regards,

Alexander