cbfstool: autocreate trampoline

Add the code necessary to create the linux trampoline blob.
Don't enforce this for the in-coreboot build or use objcopy
to produce linux_trampoline.o as it is a bit trickier to get
all the details right than I had hoped:
 - you have to know the elf architecture of the host machine
 - you might have to have more tools (xxd, perl, etc) installed

Change-Id: I9b7877c58d90f9fb21d16e0061a31e19fffa2470
Signed-off-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Reviewed-on: https://review.coreboot.org/12505
Tested-by: build bot (Jenkins)
Reviewed-by: Martin Roth <martinroth@google.com>
diff --git a/util/cbfstool/Makefile b/util/cbfstool/Makefile
index 085a19a..b595297 100644
--- a/util/cbfstool/Makefile
+++ b/util/cbfstool/Makefile
@@ -4,6 +4,7 @@
 CONFIG_FMD_GENPARSER := y
 
 HOSTCC ?= $(CC)
+OBJCOPY ?= objcopy
 
 .PHONY: all
 all: $(objutil)/cbfstool/cbfstool \
@@ -17,6 +18,18 @@
 	$(RM) $(objutil)/cbfstool/fmaptool $(fmapobj)
 	$(RM) $(objutil)/cbfstool/rmodtool $(rmodobj)
 
+linux_trampoline.c: linux_trampoline.S
+	rm -f linux_trampoline.c
+	$(CC) -m32 -o linux_trampoline linux_trampoline.S -ffreestanding -nostdlib -nostdinc -Wl,--defsym=_start=0
+	$(OBJCOPY) -Obinary -j .data linux_trampoline trampoline
+	echo "/* This file is automatically generated. Do not manually change */" > trampoline.c
+	xxd -c 16 -i trampoline >> trampoline.c
+	perl -pi -e 's,unsigned int.*$$,,g;s,unsigned char,const unsigned char,g' trampoline.c
+	echo "const void * const trampoline_start = &trampoline;" >> trampoline.c
+	echo "const unsigned long trampoline_size = sizeof trampoline;" >> trampoline.c
+	mv trampoline.c linux_trampoline.c
+	rm linux_trampoline trampoline
+
 .SILENT:
 
 include Makefile.inc