Dear coreboot folks,
I submitted a bug report to GCC about the build failures we got with GCC 4.8.x¹. Björn Busse noticed that the ASUS M2V-MX SE did not build anymore. (This was probably not detected by Jenkins because its coreboot toolchain has to be updated manually.)
The code is in `src/cpu/amd/car/post_cache_as_ram.c` [1]
__asm__ volatile ( /* set new esp */ /* before CONFIG_RAMBASE */ "subl %0, %%esp\n\t" ::"a"( (CONFIG_DCACHE_RAM_BASE + CONFIG_DCACHE_RAM_SIZE)- (CONFIG_RAMTOP) ) /* discard all registers (eax is used for %0), so gcc redoes everything after the stack is moved */ : "cc", "memory", "%ebx", "%ecx", "%edx", "%esi", "%edi", "%ebp" ); printf("Done.\n");
and gcc throws the following error.
$ make V=1 […] CC romstage.inc /src/coreboot/util/crossgcc/xgcc/bin/i386-elf-gcc -Wa,--divide -fno-stack-protector -Wl,--build-id=none -MMD -Isrc -Isrc/include -Ibuild -Isrc/arch/x86/include -Isrc/device/oprom/include -include src/include/kconfig.h -Os -pipe -g -nostdinc -nostdlib -Wall -Wundef -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings -Wredundant-decls -Wno-trigraphs -Wstrict-aliasing -Wshadow -Werror -fno-common -ffreestanding -fno-builtin -fomit-frame-pointer -D__PRE_RAM__ -Isrc -I. -Ibuild -c -S src/mainboard/asus/m2v-mx_se/romstage.c -o build/mainboard/asus/m2v-mx_se/romstage.pre.inc src/mainboard/asus/m2v-mx_se/romstage.c: In function 'pci_locate_device': src/mainboard/asus/m2v-mx_se/romstage.c:196:1: internal compiler error: Illegal instruction Please submit a full bug report, with preprocessed source if appropriate. See http://gcc.gnu.org/bugs.html for instructions. make: *** [build/mainboard/asus/m2v-mx_se/romstage.pre.inc] Error 1
The verbose error is `error: bp cannot be used in asm here`.
The offending code lies in and therefore the patch was reverted by Patrick Georgi in commit c8883262 (buildgcc: Downgrade to gcc 4.7.3, handle armv7-a) [2].
My ticket 58758 [3] was closed right away as invalid by Andrew Pinski and he linked to bug 11807 [4]. Furthermore he replied the following about the code used in coreboot.
This code really should be written in pure asm rather than doing an inline-asm as GCC can do many different optimizations more than just rereading them from the stack.
So it looks like GCC is not going to be changed/fixed and, if we wanted to update coreboot’s toolchain, we would need to fix our code.
Thanks,
Paul
¹ Sometimes it fails for me with 4.7.3 too. I do not know why, but it might be related to `.xcompile` not having some flags it should have. This is another problem though.
[1] http://review.coreboot.org/3930 [2] http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58758 [3] http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11807