Hello, Am 22.12.2010 09:02, schrieb Wolfgang Denk:
> In message<1292711230-3234-1-git-send-email-hol...@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 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot