On 01/20/2016 09:23 AM, Andrey Korolyov wrote:
Hello,
during initial bootstrap of an ancient Geode board I found that the romstage hangs at
After observing several issues with romcc, when the same code worked as expected with GCC, our team decided to discontinue use of ROMCC. It was determined it would be less effort to write all of the bootblock in assembly than to work around romcc issues. romcc was issuing nonsensical instructions, like "mov eax, eax".
You could try to disassemble your bootblock with "objdump -d" and see if the resulting code makes sense.
src/northbridge/amd/lx/raminit.c:
750 volatile unsigned long *ptr;
751 for (i = 0; i < 5; i++) { 752 ptr = (void *)i; 753 *ptr = (unsigned long)i;
Well, the first iteration of the loop causes a NULL pointer dereference. If that's not enough, you also have three unaligned 32-bit writes. I'm not sure how well romcc understands undefined behavior, but disassemby is your best friend here. Make sure the resulting asm does what you think the C code tells it to do.
Alex