* [U-Boot] U-Boot and gcc 4.9.0
@ 2014-06-18 11:10 Renaud Barbier
0 siblings, 0 replies; only message in thread
From: Renaud Barbier @ 2014-06-18 11:10 UTC (permalink / raw)
To: u-boot
I compiled the P1010RDB boot loader using the PowerPC gcc version 4.9.0.
The binary failed to boot with a DATA TLB exception. After investigating
and producing an objdump, I saw the following in the function
cpu_init_early_f:
void cpu_init_early_f(void *fdt)
{
...
#ifdef CONFIG_A003399_NOR_WORKAROUND
ccsr_l2cache_t *l2cache = (void *)CONFIG_SYS_MPC85xx_L2_ADDR;
u32 *dst, *src;
void (*setup_ifc_sram)(void);
#endif
...
init_laws();
...
setup_ifc_sram = (void *)SRAM_BASE_ADDR;
dst = (u32 *) SRAM_BASE_ADDR;
src = (u32 *) setup_ifc;
for (i = 0; i < 1024; i++)
*dst++ = *src++;
setup_ifc_sram();
/* CLEANUP */
clrbits_be32(&l2cache->l2ctl,
(MPC85xx_L2CTL_L2E |
MPC85xx_L2CTL_L2SRAM_ENTIRE));
out_be32(&l2cache->l2srbar0, 0x0);
#endif
invalidate_tlb(1);
...
init_tlbs();
}
The GCC powerpc objdump gives:
eff433f4: 4b ff ec 0d bl eff42000 <init_laws>
eff433f8: 3c 80 80 00 lis r4,-32768
eff433fc: 3c 60 10 09 lis r3,4105
eff43400: 60 84 15 00 ori r4,r4,5376
eff43404: 38 a0 00 08 li r5,8
eff43408: 38 c0 00 15 li r6,21
eff4340c: 38 e0 00 00 li r7,0
eff43410: 4b ff e0 91 bl eff414a0 <write_tlb>
eff43414: 3d 40 ff e2 lis r10,-30
eff43418: 39 20 00 00 li r9,0
eff4341c: 61 4a 01 00 ori r10,r10,256
eff43420: 7c 00 04 ac msync
eff43424: 91 2a 00 00 stw r9,0(r10)
eff43428: 39 00 00 0c li r8,12
eff4342c: 7c 00 04 ac msync
eff43430: 91 0a 0d 44 stw r8,3396(r10)
eff43434: 3d 00 80 01 lis r8,-32767
eff43438: 3d 40 ff e2 lis r10,-30
eff4343c: 7c 00 04 ac msync
eff43440: 91 0a 00 00 stw r8,0(r10)
eff43444: 91 29 00 00 stw r9,0(r9)
eff43448: 7f e0 00 08 trap
invalidate_tlb and init_tlbs are NOT present and the function ends with
a trap instruction instead of blr.
The line of code "dst = (u32 *) SRAM_BASE_ADDR;" seems to be the
problem. If removed, the object dump shows the call for the last two
functions and returns.
Also the compiler options -fno-delete-null-pointer-checks or using
memcpy fixes the problem.
Likely related to the following options found in the documentation
https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
Maybe related to the following:
-fisolate-erroneous-paths-attribute
Detect paths which trigger erroneous or undefined behaviour due a NULL
value being used in a way which is forbidden by a returns_nonnull or
nonnull attribute. Isolate those paths from the main control flow and
turn the statement with erroneous or undefined behaviour into a trap.
This is not currently enabled, but may be enabled by -O2 in the future.
Any thoughts?
Renaud
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2014-06-18 11:10 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-06-18 11:10 [U-Boot] U-Boot and gcc 4.9.0 Renaud Barbier
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.