Alexandru Gagniuc (mr.nuke.me@gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/11785
-gerrit
commit bc563e2a34e90bdfc82a3726b9efde55624327df Author: Alexandru Gagniuc mr.nuke.me@gmail.com Date: Fri Oct 2 16:17:41 2015 -0700
arch/x86: Link walkcbfs.S instead on including it in bootblock.S
The code flow doesn't fall through to walkcbfs, as it does in the rest of bootblock.S. Instead, walkcbfs is called (albeit via a jmp). The linker cannot know this when walkcbfs.S is included directly.
When we use a CAR bootblock, we lose several hundred bytes because walkcbfs is not garbage-collected, yet it isn't used. This problem is solved by assembling walkcbfs.S separately, and linking it.
Change-Id: Ib3a976db09b9ff270b7677cb4f9db80b0b025e22 Signed-off-by: Alexandru Gagniuc mr.nuke.me@gmail.com --- src/arch/x86/Makefile.inc | 1 + src/arch/x86/bootblock.S | 2 -- src/arch/x86/walkcbfs.S | 2 ++ 3 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/arch/x86/Makefile.inc b/src/arch/x86/Makefile.inc index 7c07de2..95ebb6a 100644 --- a/src/arch/x86/Makefile.inc +++ b/src/arch/x86/Makefile.inc @@ -85,6 +85,7 @@ endif # the right order. Make sure the auto generated bootblock.inc is a proper # dependency. Make the same true for the linker sript. bootblock-y += bootblock.S +bootblock-y += walkcbfs.S $(obj)/arch/x86/bootblock.bootblock.o: $(objgenerated)/bootblock.inc
bootblock-y += bootblock.ld diff --git a/src/arch/x86/bootblock.S b/src/arch/x86/bootblock.S index 7276c7a..bea178d 100644 --- a/src/arch/x86/bootblock.S +++ b/src/arch/x86/bootblock.S @@ -47,5 +47,3 @@ * needs to come after bootblock.inc. */ #include <generated/bootblock.inc> - -#include <arch/x86/walkcbfs.S> diff --git a/src/arch/x86/walkcbfs.S b/src/arch/x86/walkcbfs.S index 9c26d3c..0b91f57 100644 --- a/src/arch/x86/walkcbfs.S +++ b/src/arch/x86/walkcbfs.S @@ -18,6 +18,8 @@
#define CBFS_FILE_STRUCTSIZE (CBFS_FILE_OFFSET + 4)
+.global walkcbfs_asm + /* * input %esi: filename * input %esp: return address (not pointer to return address!)