[U-Boot] [RFC PATCH v2] ARM: Avoid compiler optimization for usages of readb, writeb and friends.
Dirk Behme
dirk.behme at googlemail.com
Tue Dec 21 09:05:07 CET 2010
On 21.12.2010 08:21, Albert ARIBAUD wrote:
> Hi Dirk,
>
> Le 21/12/2010 08:11, Dirk Behme a écrit :
>
>> But the issue with drivers/mtd/nand/omap_gpmc.c (i.e. the additional
>> ldrb r3, [r3]) is still open? Has anybody tried to replace it with
>> a nop in the binary to be sure this is the root cause?
>
> Can you try and preprocess the C file for both the broken and working
> cases, then post the preprocessed C extract? Differences at the C level
> may help understanding differences at the asm level.
gcc version 4.5.1 (Sourcery G++ Lite 2010.09-50)
Work:
====
static void omap_nand_hwcontrol(struct mtd_info *mtd, int32_t cmd,
uint32_t ctrl)
{
register struct nand_chip *this = mtd->priv;
...
if (cmd != -1)
(*(volatile unsigned char *)(this->IO_ADDR_W) = (cmd));
}
if (cmd != NAND_CMD_NONE)
84: e3710001 cmn r1, #1
origwriteb(cmd, this->IO_ADDR_W);
88: 15933004 ldrne r3, [r3, #4]
8c: 120110ff andne r1, r1, #255 ; 0xff
90: 15c31000 strbne r1, [r3]
94: e12fff1e bx lr
...
Broken:
======
static void omap_nand_hwcontrol(struct mtd_info *mtd, int32_t cmd,
uint32_t ctrl)
{
register struct nand_chip *this = mtd->priv;
...
if (cmd != -1)
({ do { } while (0); (*(volatile unsigned char *)(this->IO_ADDR_W)
= (cmd)); });
}
if (cmd != NAND_CMD_NONE)
84: e3710001 cmn r1, #1
writeb(cmd, this->IO_ADDR_W);
88: 15933004 ldrne r3, [r3, #4]
8c: 120110ff andne r1, r1, #255 ; 0xff
90: 15c31000 strbne r1, [r3]
94: 15d33000 ldrbne r3, [r3]
98: e12fff1e bx lr
...
The issue seems to be the additional 'ldrbne r3, [r3]' added by the
compiler in the broken version.
Best regards
Dirk
More information about the U-Boot
mailing list