[coreboot] LAR TODO
Carl-Daniel Hailfinger
c-d.hailfinger.devel.2006 at gmx.net
Thu Mar 13 01:00:13 CET 2008
On 11.03.2008 21:52, Myles Watson wrote:
>> >> Myles? Could you prepare a patch which #ifdefs the code instead of
>> >> removing it?
>>
>
> This patch is a hopefully less controversial version of a previous patch which
> removed the ELF loader from coreboot v3. This adds a Kconfig option
> PAYLOAD_ELF_LOADER which builds the loader into v3. In order to make it a
> little safer, I changed PAYLOAD_PREPARSE_ELF to PAYLOAD_NO_PREPARSE_ELF and
> made that option depend on PAYLOAD_ELF_LOADER so that no one adds an unparsed
> ELF without the loader.
>
> One part that was strange to me was that I first tried adding elfboot.o and
> archelfboot.o to the beginning of the list of object files. This broke
> coreboot. It still finished building, but would not boot on QEMU. I was
> surprised that it broke it, but didn't investigate further.
>
Did you make distclean in between? v3 dependency handling is something
between screwed and nonexistent. It does work sometimes, though.
> Myles
>
> Signed-off-by: Myles Watson <mylesgw at gmail.com>
>
> Index: Kconfig
> ===================================================================
> --- Kconfig (revision 638)
> +++ Kconfig (working copy)
> @@ -92,6 +92,12 @@
>
> menu "Payload"
>
> +config PAYLOAD_ELF_LOADER
> + bool "Include ELF payload loader"
> + default n
> + help
> + This option allows an unparsed ELF paylaod to be added and loaded.
> +
> choice
> prompt "Payload type"
> default PAYLOAD_NONE
> @@ -125,10 +131,10 @@
> help
> The path and filename of the ELF executable file to use as payload.
>
> -config PAYLOAD_PREPARSE_ELF
> - bool "Pre-parse ELF file and convert ELF segments to LAR entries"
> - depends PAYLOAD_ELF
> - default y
> +config PAYLOAD_NO_PREPARSE_ELF
> + bool "Add ELF without parsing and converting to LAR entries"
> + depends PAYLOAD_ELF && PAYLOAD_ELF_LOADER
> + default n
> help
> Until now, coreboot has used ELF for the payload. There are many
> problems with this, not least being the inefficiency -- the ELF has
> @@ -142,7 +148,7 @@
> flashed the FLASH and rebooted the machine. Boot time is really
> not the time you want to find out your ELF payload is broken.
>
> - With this option, coreboot will direct lar to break each ELF
> + Without this option, coreboot will direct lar to break each ELF
> segment into a LAR entry. ELF will not be used at all. Note that
> (for now) coreboot is not backward compatible -- if you put an ELF
> payload in, coreboot can not parse it. We hope to remove ELF
> Index: arch/x86/stage1.c
> ===================================================================
> --- arch/x86/stage1.c (revision 638)
> +++ arch/x86/stage1.c (working copy)
> @@ -28,10 +28,12 @@
> #include <mc146818rtc.h>
> #include <cpu.h>
>
> +#ifdef CONFIG_PAYLOAD_ELF_LOADER
> /* ah, well, what a mess! This is a hard code. FIX ME but how?
> * By getting rid of ELF ...
> */
> #define UNCOMPRESS_AREA (0x400000)
> +#endif /* CONFIG_PAYLOAD_ELF_LOADER */
>
> /* these prototypes should go into headers */
> void uart_init(void);
> @@ -86,6 +88,8 @@
> return;
> }
>
> +
> +#ifdef CONFIG_PAYLOAD_ELF_LOADER
> /* until we get rid of elf */
> int legacy(struct mem_file *archive, char *name, void *where, struct lb_memory *mem)
> {
> @@ -101,6 +105,7 @@
> printk(BIOS_ERR, "elfboot_mem returns %d\n", ret);
> return -1;
> }
> +#endif /* CONFIG_PAYLOAD_ELF_LOADER */
>
> /*
> * This function is called from assembler code with its argument on the
> @@ -110,7 +115,9 @@
> {
> int ret;
> struct mem_file archive, result;
> +#ifdef CONFIG_PAYLOAD_ELF_LOADER
> int elfboot_mem(struct lb_memory *mem, void *where, int size);
> +#endif /* CONFIG_PAYLOAD_ELF_LOADER */
> void *entry;
>
> /* we can't statically init this hack. */
> @@ -202,9 +209,11 @@
>
> printk(BIOS_DEBUG, "Stage2 code done.\n");
>
> +#ifdef CONFIG_PAYLOAD_ELF_LOADER
> ret = find_file(&archive, "normal/payload", &result);
> if (! ret)
> legacy(&archive, "normal/payload", (void *)UNCOMPRESS_AREA, mem);
> +#endif /* CONFIG_PAYLOAD_ELF_LOADER */
>
> entry = load_file_segments(&archive, "normal/payload");
> if (entry != (void*)-1) {
>
OK so far.
> Index: arch/x86/Makefile
> ===================================================================
> --- arch/x86/Makefile (revision 638)
> +++ arch/x86/Makefile (working copy)
> @@ -115,9 +115,20 @@
> # initram module and the various stages and payload files.
> #
>
> -STAGE0_LIB_OBJ = uart8250.o mem.o elfboot.o lar.o delay.o vtxprintf.o \
> +STAGE0_LIB_OBJ = uart8250.o mem.o
> +STAGE0_ARCH_X86_OBJ = stage1.o serial.o
> +
> +ifeq ($(CONFIG_PAYLOAD_ELF_LOADER),y)
> +STAGE0_LIB_OBJ += elfboot.o
> +STAGE0_ARCH_X86_OBJ += archelfboot.o
> +else
> +STAGE0_LIB_OBJ +=
> +STAGE0_ARCH_X86_OBJ +=
> +endif
> +
> +STAGE0_LIB_OBJ += lar.o delay.o vtxprintf.o \
> vsprintf.o console.o string.o $(DECOMPRESSORS)
> -STAGE0_ARCH_X86_OBJ = stage1.o serial.o archelfboot.o speaker.o \
> +STAGE0_ARCH_X86_OBJ += speaker.o \
> udelay_io.o mc146818rtc.o post_code.o
>
> ifeq ($(CONFIG_CPU_I586),y)
>
Sorry, but the chunk above is a real mess. Can't you move the
conditional chunk to the end and avoid the else path completely?
> @@ -132,10 +143,10 @@
> endif
> endif
>
> -ifeq ($(CONFIG_PAYLOAD_PREPARSE_ELF), y)
> +ifeq ($(CONFIG_PAYLOAD_NO_PREPARSE_ELF), y)
> + PARSEELF =
> +else
> PARSEELF = -e
> -else
> - PARSEELF =
> endif
>
> STAGE0_OBJ := $(patsubst %,$(obj)/lib/%,$(STAGE0_LIB_OBJ)) \
>
The patch would get my Ack except for the Makefile chunk I complained
about. Please rework that.
Regards,
Carl-Daniel
--
http://www.hailfinger.org/
More information about the coreboot
mailing list