
Hello Daniel,
I'm hunting weird behaviours with the gd_t global data pointer on my PXA300 board board. The pointer gets set up fine in lib_arm/boot.c and gd->bd is filled in my board specific code. However, after the tftp download is finished, the content of these structures have been destroyed and overwritten with garbage.
I suspect a stack corruption to be the culprit, an overflow or overlap, as it seems to happen randomly, after a while and some function calls. Any hints about that?
Hook up a JTAG (or preferable an ETM) debugger and start tracing?
Also, I wonder why the pointer to this struct is not placed *after* U-Boot's own code as shown in the patch below. This works fine for me now. Any oppinion on that?
Aren't you just hiding the symptoms here? It seems that there is something really wrong and by moving the global structures probably a different memory area is overwritten, but the problem should still be there...
Kind Regards,
Remy
Thanks and best regards, Daniel
diff --git a/lib_arm/board.c b/lib_arm/board.c index 4ba1f5e..90ad5f7 100644 --- a/lib_arm/board.c +++ b/lib_arm/board.c @@ -282,12 +282,12 @@ void start_armboot (void) #endif
/* Pointer is writable since we allocated a register for it */
gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));
gd = (gd_t*) _bss_end; /* compiler optimization barrier needed for GCC >= 3.4 */ __asm__ __volatile__("": : :"memory"); memset ((void*)gd, 0, sizeof (gd_t));
gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
gd->bd = (bd_t*)((char*)gd + sizeof(gd_t)); memset (gd->bd, 0, sizeof (bd_t)); gd->flags |= GD_FLG_RELOC;
U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot