From 09b3820e9311abc0a7e096c1beded54fa2448130 Mon Sep 17 00:00:00 2001 From: Carl-Daniel Hailfinger Date: Tue, 27 Nov 2007 14:44:54 +0000 Subject: [PATCH] Convert stage2 handling from binary blob to multi-segment LAR which is created by parsing the ELF file linuxbios.stage2.o. That way, we avoid manual specification of the entry point for stage2 code. A few LAR functions are now unused and can be removed in a following cleanup session. Another suggested cleanup would be factoring out a load_all_segments function, resulting in less code duplication. Ron says: > This is great. We killed the blob. In the movie, it was impossible. > FYI, the new approach works on real hardware, I am getting nice printk > messages from stage1! Signed-off-by: Carl-Daniel Hailfinger Acked-by: Ronald G. Minnich git-svn-id: svn://coreboot.org/repository/LinuxBIOSv3@524 f3766cd6-281f-0410-b1cd-43a5c92072e9 --- arch/x86/Makefile | 10 ++++------ arch/x86/stage1.c | 7 ++++++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/arch/x86/Makefile b/arch/x86/Makefile index c48a4faac4..67660dec2d 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile @@ -36,7 +36,7 @@ SILENT := >/dev/null 2>&1 ROM_SIZE := $(shell expr $(CONFIG_LINUXBIOS_ROMSIZE_KB) \* 1024) -LARFILES := nocompress:normal/initram.o normal/stage2 nocompress:normal/option_table +LARFILES := nocompress:normal/initram.o normal/stage2.o nocompress:normal/option_table ifneq ($(CONFIG_PAYLOAD_NONE),y) LARFILES += normal/payload endif @@ -57,12 +57,12 @@ ifeq ($(CONFIG_DEFAULT_COMPRESSION_NRV2B),y) COMPRESSFLAG := -C nrv2b endif -$(obj)/linuxbios.rom $(obj)/linuxbios.map: $(obj)/linuxbios.bootblock $(obj)/util/lar/lar lzma nrv2b $(obj)/linuxbios.initram.o $(obj)/linuxbios.stage2 $(obj)/option_table +$(obj)/linuxbios.rom $(obj)/linuxbios.map: $(obj)/linuxbios.bootblock $(obj)/util/lar/lar lzma nrv2b $(obj)/linuxbios.initram.o $(obj)/linuxbios.stage2.o $(obj)/option_table $(Q)rm -rf $(obj)/lar.tmp $(Q)mkdir $(obj)/lar.tmp $(Q)mkdir $(obj)/lar.tmp/normal $(Q)cp $(obj)/linuxbios.initram.o $(obj)/lar.tmp/normal/initram.o - $(Q)cp $(obj)/linuxbios.stage2 $(obj)/lar.tmp/normal/stage2 + $(Q)cp $(obj)/linuxbios.stage2.o $(obj)/lar.tmp/normal/stage2.o $(Q)cp $(obj)/option_table $(obj)/lar.tmp/normal/option_table ifeq ($(CONFIG_PAYLOAD_NONE),y) $(Q)printf " PAYLOAD none (as specified by user)\n" @@ -198,13 +198,11 @@ endif STAGE2_OBJ += $(obj)/util/x86emu/libx86emu.a $(LIBGCC_FILE_NAME) endif -$(obj)/linuxbios.stage2 $(obj)/linuxbios.stage2.map: $(obj)/stage0.init $(STAGE2_OBJ) +$(obj)/linuxbios.stage2.o $(obj)/linuxbios.stage2.map: $(obj)/stage0.init $(STAGE2_OBJ) $(Q)# leave a .o with full symbols in it for debugging. $(Q)printf " LD $(subst $(shell pwd)/,,$(@))\n" $(Q)$(LD) -R $(obj)/stage0.o -Ttext 0x1000 --entry=stage2 \ -o $(obj)/linuxbios.stage2.o $(STAGE2_OBJ) - $(Q)printf " OBJCOPY $(subst $(shell pwd)/,,$(@))\n" - $(Q)$(OBJCOPY) -O binary $(obj)/linuxbios.stage2.o $(obj)/linuxbios.stage2 $(Q)$(NM) $(obj)/linuxbios.stage2.o | sort -u > $(obj)/linuxbios.stage2.map # diff --git a/arch/x86/stage1.c b/arch/x86/stage1.c index 966c6223c8..752cdcb5aa 100644 --- a/arch/x86/stage1.c +++ b/arch/x86/stage1.c @@ -161,7 +161,12 @@ void __attribute__((stdcall)) stage1_main(u32 bist) /* Turn off Cache-As-Ram */ disable_car(); - ret = run_file(&archive, "normal/stage2", (void *)0x1000); + entry = load_file(&archive, "normal/stage2.o/segment0"); + if (entry == (void *)-1) + die("FATAL: Failed loading stage2 segment0."); + if (load_file(&archive, "normal/stage2.o/segment1") == (void *)-1) + die("FATAL: Failed loading stage2 segment1."); + ret = run_address(entry); if (ret) die("FATAL: Failed in stage2 code.");