Introduce a set of CONFIG_LOADER_* configuration options to allow each architecture to specify the loaders that are to be used.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>


git-svn-id: svn://coreboot.org/openbios/trunk/openbios-devel@717 f158a5a8-5612-0410-a976-696ce0be7e32
This commit is contained in:
Mark Cave-Ayland
2010-03-28 20:18:30 +00:00
committed by Mark Cave-Ayland
parent 63db85036b
commit f78fec5713
16 changed files with 169 additions and 23 deletions

View File

@@ -11,6 +11,8 @@
#include "libopenbios/sys_info.h" #include "libopenbios/sys_info.h"
#include "libopenbios/elf_load.h" #include "libopenbios/elf_load.h"
#include "libopenbios/aout_load.h" #include "libopenbios/aout_load.h"
#include "libopenbios/fcode_load.h"
#include "libopenbios/forth_load.h"
#include "openprom.h" #include "openprom.h"
#include "boot.h" #include "boot.h"
@@ -33,22 +35,44 @@ static int try_path(const char *path, char *param, const void *romvec)
bootpath = pop_fstr_copy(); bootpath = pop_fstr_copy();
printk("Trying %s (%s)\n", path, bootpath); printk("Trying %s (%s)\n", path, bootpath);
#ifdef CONFIG_LOADER_ELF
/* ELF Boot loader */ /* ELF Boot loader */
elf_load(&sys_info, path, param, &boot_notes); elf_load(&sys_info, path, param, &boot_notes);
feval("state-valid @"); feval("state-valid @");
valid = POP(); valid = POP();
if (valid) if (valid)
goto start_image; goto start_image;
#endif
/* Linux loader (not using Forth) */ /* Linux loader (not using Forth) */
linux_load(&sys_info, path, param); linux_load(&sys_info, path, param);
#ifdef CONFIG_LOADER_AOUT
/* a.out loader */ /* a.out loader */
aout_load(&sys_info, path); aout_load(&sys_info, path);
feval("state-valid @"); feval("state-valid @");
valid = POP(); valid = POP();
if (valid) if (valid)
goto start_image; goto start_image;
#endif
#ifdef CONFIG_LOADER_FCODE
/* Fcode loader */
fcode_load(path);
feval("state-valid @");
valid = POP();
if (valid)
goto start_image;
#endif
#ifdef CONFIG_LOADER_FORTH
/* Forth loader */
forth_load(path);
feval("state-valid @");
valid = POP();
if (valid)
goto start_image;
#endif
return 0; return 0;
@@ -78,6 +102,23 @@ start_image:
image_retval = entry(romvec, 0, 0, 0, 0); image_retval = entry(romvec, 0, 0, 0, 0);
break; break;
case 0x10:
/* Start Fcode image */
printk("Evaluating FCode...\n");
PUSH(address);
PUSH(1);
fword("byte-load");
image_retval = 0;
break;
case 0x11:
/* Start Forth image */
PUSH(address);
PUSH(size);
fword("eval2");
image_retval = 0;
break;
} }
printk("Image returned with return value %#x\n", image_retval); printk("Image returned with return value %#x\n", image_retval);

View File

@@ -11,6 +11,7 @@
#include "libopenbios/elf_load.h" #include "libopenbios/elf_load.h"
#include "libopenbios/aout_load.h" #include "libopenbios/aout_load.h"
#include "libopenbios/fcode_load.h" #include "libopenbios/fcode_load.h"
#include "libopenbios/forth_load.h"
#include "boot.h" #include "boot.h"
struct sys_info sys_info; struct sys_info sys_info;
@@ -28,29 +29,44 @@ static int try_path(const char *path, char *param)
ucell valid, address, type, size; ucell valid, address, type, size;
int image_retval = 0; int image_retval = 0;
#ifdef CONFIG_LOADER_ELF
/* ELF Boot loader */ /* ELF Boot loader */
elf_load(&sys_info, path, param, &boot_notes); elf_load(&sys_info, path, param, &boot_notes);
feval("state-valid @"); feval("state-valid @");
valid = POP(); valid = POP();
if (valid) if (valid)
goto start_image; goto start_image;
#endif
/* Linux loader (not using Forth) */ /* Linux loader (not using Forth) */
linux_load(&sys_info, path, param); linux_load(&sys_info, path, param);
#ifdef CONFIG_LOADER_AOUT
/* a.out loader */ /* a.out loader */
aout_load(&sys_info, path); aout_load(&sys_info, path);
feval("state-valid @"); feval("state-valid @");
valid = POP(); valid = POP();
if (valid) if (valid)
goto start_image; goto start_image;
#endif
#ifdef CONFIG_LOADER_FCODE
/* Fcode loader */ /* Fcode loader */
fcode_load(path); fcode_load(path);
feval("state-valid @"); feval("state-valid @");
valid = POP(); valid = POP();
if (valid) if (valid)
goto start_image; goto start_image;
#endif
#ifdef CONFIG_LOADER_FORTH
/* Forth loader */
forth_load(path);
feval("state-valid @");
valid = POP();
if (valid)
goto start_image;
#endif
return 0; return 0;
@@ -85,6 +101,14 @@ start_image:
fword("byte-load"); fword("byte-load");
image_retval = 0; image_retval = 0;
break; break;
case 0x11:
/* Start Forth image */
PUSH(address);
PUSH(size);
fword("eval2");
image_retval = 0;
break;
} }
printk("Image returned with return value %#x\n", image_retval); printk("Image returned with return value %#x\n", image_retval);

View File

@@ -13,6 +13,8 @@
#include "libc/diskio.h" #include "libc/diskio.h"
#include "libopenbios/sys_info.h" #include "libopenbios/sys_info.h"
#include "libopenbios/elf_load.h" #include "libopenbios/elf_load.h"
#include "libopenbios/aout_load.h"
#include "libopenbios/fcode_load.h"
#include "libopenbios/forth_load.h" #include "libopenbios/forth_load.h"
#include "boot.h" #include "boot.h"
@@ -24,22 +26,44 @@ static int try_path(const char *path, char *param)
ucell valid, address, type, size; ucell valid, address, type, size;
int image_retval = 0;; int image_retval = 0;;
#ifdef CONFIG_LOADER_ELF
/* ELF Boot loader */ /* ELF Boot loader */
elf_load(&sys_info, path, param, &boot_notes); elf_load(&sys_info, path, param, &boot_notes);
feval("state-valid @"); feval("state-valid @");
valid = POP(); valid = POP();
if (valid) if (valid)
goto start_image; goto start_image;
#endif
/* Linux loader (not using Forth) */ /* Linux loader (not using Forth) */
linux_load(&sys_info, path, param); linux_load(&sys_info, path, param);
#ifdef CONFIG_LOADER_AOUT
/* a.out loader */
aout_load(&sys_info, path);
feval("state-valid @");
valid = POP();
if (valid)
goto start_image;
#endif
#ifdef CONFIG_LOADER_FCODE
/* Fcode loader */
fcode_load(path);
feval("state-valid @");
valid = POP();
if (valid)
goto start_image;
#endif
#ifdef CONFIG_LOADER_FORTH
/* Forth loader */ /* Forth loader */
forth_load(path); forth_load(path);
feval("state-valid @"); feval("state-valid @");
valid = POP(); valid = POP();
if (valid) if (valid)
goto start_image; goto start_image;
#endif
return 0; return 0;
@@ -61,6 +85,20 @@ start_image:
image_retval = start_elf(address, (uint32_t)NULL); image_retval = start_elf(address, (uint32_t)NULL);
break; break;
case 0x5:
/* Start a.out image */
image_retval = start_elf(address, (uint32_t)NULL);
break;
case 0x10:
/* Start Fcode image */
printk("Evaluating FCode...\n");
PUSH(address);
PUSH(1);
fword("byte-load");
image_retval = 0;
break;
case 0x11: case 0x11:
/* Start Forth image */ /* Start Forth image */
PUSH(address); PUSH(address);

View File

@@ -35,6 +35,11 @@
<option name="CONFIG_DEBLOCKER" type="boolean" value="true"/> <option name="CONFIG_DEBLOCKER" type="boolean" value="true"/>
<option name="CONFIG_FONT_8X8" type="boolean" value="true"/> <option name="CONFIG_FONT_8X8" type="boolean" value="true"/>
<option name="CONFIG_FONT_8X16" type="boolean" value="false"/> <option name="CONFIG_FONT_8X16" type="boolean" value="false"/>
<option name="CONFIG_LOADER_AOUT" type="boolean" value="false"/>
<option name="CONFIG_LOADER_ELF" type="boolean" value="true"/>
<option name="CONFIG_LOADER_FCODE" type="boolean" value="false"/>
<option name="CONFIG_LOADER_FORTH" type="boolean" value="false"/>
<option name="CONFIG_LOADER_XCOFF" type="boolean" value="false"/>
<!-- Filesystem Configuration --> <!-- Filesystem Configuration -->
<option name="CONFIG_DISK_LABEL" type="boolean" value="true"/> <option name="CONFIG_DISK_LABEL" type="boolean" value="true"/>

View File

@@ -40,6 +40,11 @@
<option name="CONFIG_VGA_WIDTH" type="integer" value="800"/> <option name="CONFIG_VGA_WIDTH" type="integer" value="800"/>
<option name="CONFIG_VGA_HEIGHT" type="integer" value="600"/> <option name="CONFIG_VGA_HEIGHT" type="integer" value="600"/>
<option name="CONFIG_VGA_DEPTH" type="integer" value="8"/> <option name="CONFIG_VGA_DEPTH" type="integer" value="8"/>
<option name="CONFIG_LOADER_AOUT" type="boolean" value="false"/>
<option name="CONFIG_LOADER_ELF" type="boolean" value="false"/>
<option name="CONFIG_LOADER_FCODE" type="boolean" value="false"/>
<option name="CONFIG_LOADER_FORTH" type="boolean" value="false"/>
<option name="CONFIG_LOADER_XCOFF" type="boolean" value="true"/>
<!-- Filesystem Configuration --> <!-- Filesystem Configuration -->
<option name="CONFIG_DISK_LABEL" type="boolean" value="true"/> <option name="CONFIG_DISK_LABEL" type="boolean" value="true"/>

View File

@@ -41,6 +41,11 @@
<option name="CONFIG_DEBLOCKER" type="boolean" value="true"/> <option name="CONFIG_DEBLOCKER" type="boolean" value="true"/>
<option name="CONFIG_FONT_8X8" type="boolean" value="true"/> <option name="CONFIG_FONT_8X8" type="boolean" value="true"/>
<option name="CONFIG_FONT_8X16" type="boolean" value="false"/> <option name="CONFIG_FONT_8X16" type="boolean" value="false"/>
<option name="CONFIG_LOADER_AOUT" type="boolean" value="true"/>
<option name="CONFIG_LOADER_ELF" type="boolean" value="true"/>
<option name="CONFIG_LOADER_FCODE" type="boolean" value="false"/>
<option name="CONFIG_LOADER_FORTH" type="boolean" value="false"/>
<option name="CONFIG_LOADER_XCOFF" type="boolean" value="false"/>
<!-- Filesystem Configuration --> <!-- Filesystem Configuration -->
<option name="CONFIG_DISK_LABEL" type="boolean" value="true"/> <option name="CONFIG_DISK_LABEL" type="boolean" value="true"/>

View File

@@ -41,6 +41,11 @@
<option name="CONFIG_FONT_8X16" type="boolean" value="false"/> <option name="CONFIG_FONT_8X16" type="boolean" value="false"/>
<option name="CONFIG_OFMEM" type="boolean" value="true"/> <option name="CONFIG_OFMEM" type="boolean" value="true"/>
<option name="CONFIG_OFMEM_MALLOC_ALIGN" type="integer" value="8"/> <option name="CONFIG_OFMEM_MALLOC_ALIGN" type="integer" value="8"/>
<option name="CONFIG_LOADER_AOUT" type="boolean" value="true"/>
<option name="CONFIG_LOADER_ELF" type="boolean" value="true"/>
<option name="CONFIG_LOADER_FCODE" type="boolean" value="true"/>
<option name="CONFIG_LOADER_FORTH" type="boolean" value="false"/>
<option name="CONFIG_LOADER_XCOFF" type="boolean" value="false"/>
<!-- Filesystem Configuration --> <!-- Filesystem Configuration -->
<option name="CONFIG_DISK_LABEL" type="boolean" value="true"/> <option name="CONFIG_DISK_LABEL" type="boolean" value="true"/>

View File

@@ -36,6 +36,11 @@
<option name="CONFIG_DEBLOCKER" type="boolean" value="true"/> <option name="CONFIG_DEBLOCKER" type="boolean" value="true"/>
<option name="CONFIG_FONT_8X8" type="boolean" value="true"/> <option name="CONFIG_FONT_8X8" type="boolean" value="true"/>
<option name="CONFIG_FONT_8X16" type="boolean" value="false"/> <option name="CONFIG_FONT_8X16" type="boolean" value="false"/>
<option name="CONFIG_LOADER_AOUT" type="boolean" value="false"/>
<option name="CONFIG_LOADER_ELF" type="boolean" value="true"/>
<option name="CONFIG_LOADER_FCODE" type="boolean" value="false"/>
<option name="CONFIG_LOADER_FORTH" type="boolean" value="true"/>
<option name="CONFIG_LOADER_XCOFF" type="boolean" value="false"/>
<!-- Filesystem Configuration --> <!-- Filesystem Configuration -->
<option name="CONFIG_DISK_LABEL" type="boolean" value="true"/> <option name="CONFIG_DISK_LABEL" type="boolean" value="true"/>

View File

@@ -40,7 +40,11 @@
<option name="CONFIG_VGA_WIDTH" type="integer" value="800"/> <option name="CONFIG_VGA_WIDTH" type="integer" value="800"/>
<option name="CONFIG_VGA_HEIGHT" type="integer" value="600"/> <option name="CONFIG_VGA_HEIGHT" type="integer" value="600"/>
<option name="CONFIG_VGA_DEPTH" type="integer" value="8"/> <option name="CONFIG_VGA_DEPTH" type="integer" value="8"/>
<option name="CONFIG_LOADER_AOUT" type="boolean" value="false"/>
<option name="CONFIG_LOADER_ELF" type="boolean" value="false"/>
<option name="CONFIG_LOADER_FCODE" type="boolean" value="false"/>
<option name="CONFIG_LOADER_FORTH" type="boolean" value="false"/>
<option name="CONFIG_LOADER_XCOFF" type="boolean" value="true"/>
<!-- Filesystem Configuration --> <!-- Filesystem Configuration -->
<option name="CONFIG_DISK_LABEL" type="boolean" value="true"/> <option name="CONFIG_DISK_LABEL" type="boolean" value="true"/>

View File

@@ -41,6 +41,11 @@
<option name="CONFIG_DEBLOCKER" type="boolean" value="true"/> <option name="CONFIG_DEBLOCKER" type="boolean" value="true"/>
<option name="CONFIG_FONT_8X8" type="boolean" value="true"/> <option name="CONFIG_FONT_8X8" type="boolean" value="true"/>
<option name="CONFIG_FONT_8X16" type="boolean" value="false"/> <option name="CONFIG_FONT_8X16" type="boolean" value="false"/>
<option name="CONFIG_LOADER_AOUT" type="boolean" value="true"/>
<option name="CONFIG_LOADER_ELF" type="boolean" value="true"/>
<option name="CONFIG_LOADER_FCODE" type="boolean" value="false"/>
<option name="CONFIG_LOADER_FORTH" type="boolean" value="false"/>
<option name="CONFIG_LOADER_XCOFF" type="boolean" value="false"/>
<!-- Filesystem Configuration --> <!-- Filesystem Configuration -->
<option name="CONFIG_DISK_LABEL" type="boolean" value="true"/> <option name="CONFIG_DISK_LABEL" type="boolean" value="true"/>

View File

@@ -41,6 +41,11 @@
<option name="CONFIG_FONT_8X16" type="boolean" value="false"/> <option name="CONFIG_FONT_8X16" type="boolean" value="false"/>
<option name="CONFIG_OFMEM" type="boolean" value="true"/> <option name="CONFIG_OFMEM" type="boolean" value="true"/>
<option name="CONFIG_OFMEM_MALLOC_ALIGN" type="integer" value="8"/> <option name="CONFIG_OFMEM_MALLOC_ALIGN" type="integer" value="8"/>
<option name="CONFIG_LOADER_AOUT" type="boolean" value="true"/>
<option name="CONFIG_LOADER_ELF" type="boolean" value="true"/>
<option name="CONFIG_LOADER_FCODE" type="boolean" value="true"/>
<option name="CONFIG_LOADER_FORTH" type="boolean" value="false"/>
<option name="CONFIG_LOADER_XCOFF" type="boolean" value="false"/>
<!-- Filesystem Configuration --> <!-- Filesystem Configuration -->
<option name="CONFIG_DISK_LABEL" type="boolean" value="true"/> <option name="CONFIG_DISK_LABEL" type="boolean" value="true"/>

View File

@@ -36,6 +36,11 @@
<option name="CONFIG_DEBLOCKER" type="boolean" value="true"/> <option name="CONFIG_DEBLOCKER" type="boolean" value="true"/>
<option name="CONFIG_FONT_8X8" type="boolean" value="true"/> <option name="CONFIG_FONT_8X8" type="boolean" value="true"/>
<option name="CONFIG_FONT_8X16" type="boolean" value="false"/> <option name="CONFIG_FONT_8X16" type="boolean" value="false"/>
<option name="CONFIG_LOADER_AOUT" type="boolean" value="false"/>
<option name="CONFIG_LOADER_ELF" type="boolean" value="true"/>
<option name="CONFIG_LOADER_FCODE" type="boolean" value="false"/>
<option name="CONFIG_LOADER_FORTH" type="boolean" value="true"/>
<option name="CONFIG_LOADER_XCOFF" type="boolean" value="false"/>
<!-- Filesystem Configuration --> <!-- Filesystem Configuration -->
<option name="CONFIG_DISK_LABEL" type="boolean" value="true"/> <option name="CONFIG_DISK_LABEL" type="boolean" value="true"/>

View File

@@ -1,24 +1,16 @@
<build> <build>
<library name="openbios" type="static" target="target"> <library name="openbios" type="static" target="target">
<object source="aout_load.c" condition="SPARC32"/> <object source="aout_load.c" condition="LOADER_AOUT"/>
<object source="aout_load.c" condition="SPARC64"/>
<object source="bindings.c"/> <object source="bindings.c"/>
<object source="client.c"/> <object source="client.c"/>
<object source="console_common.c"/> <object source="console_common.c"/>
<object source="elf_info.c" condition="X86"/> <object source="elf_info.c" />
<object source="elf_info.c" condition="AMD64"/> <object source="elf_load.c" condition="LOADER_ELF"/>
<object source="elf_info.c" condition="SPARC32"/>
<object source="elf_info.c" condition="SPARC64"/>
<object source="elf_info.c" condition="PPC"/>
<object source="elf_load.c" condition="X86"/>
<object source="elf_load.c" condition="SPARC32"/>
<object source="elf_load.c" condition="SPARC64"/>
<object source="elf_load.c" condition="AMD64"/>
<object source="font_8x8.c" condition="FONT_8X8"/> <object source="font_8x8.c" condition="FONT_8X8"/>
<object source="font_8x16.c" condition="FONT_8X16"/> <object source="font_8x16.c" condition="FONT_8X16"/>
<object source="fcode_load.c" condition="SPARC64"/> <object source="fcode_load.c" condition="LOADER_FCODE"/>
<object source="forth_load.c" condition="X86"/> <object source="forth_load.c" condition="LOADER_FORTH"/>
<object source="ipchecksum.c"/> <object source="ipchecksum.c"/>
<object source="linuxbios_info.c" condition="LINUXBIOS"/> <object source="linuxbios_info.c" condition="LINUXBIOS"/>
<object source="ofmem_common.c" condition="OFMEM"/> <object source="ofmem_common.c" condition="OFMEM"/>

View File

@@ -5,8 +5,7 @@
<object source="cmdline.c" condition="CMDLINE"/> <object source="cmdline.c" condition="CMDLINE"/>
<object source="deblocker.c" condition="DEBLOCKER"/> <object source="deblocker.c" condition="DEBLOCKER"/>
<object source="disk-label.c" condition="DISK_LABEL"/> <object source="disk-label.c" condition="DISK_LABEL"/>
<object source="elf-loader.c" condition="PPC"/> <object source="elf-loader.c" condition="LOADER_ELF"/>
<object source="elf-loader.c" condition="SPARC64"/>
<object source="init.c"/> <object source="init.c"/>
<object source="mac-parts.c" condition="MAC_PARTS"/> <object source="mac-parts.c" condition="MAC_PARTS"/>
<object source="misc-files.c" condition="FS"/> <object source="misc-files.c" condition="FS"/>
@@ -14,7 +13,7 @@
<object source="pc-parts.c" condition="PC_PARTS"/> <object source="pc-parts.c" condition="PC_PARTS"/>
<object source="sun-parts.c" condition="SUN_PARTS"/> <object source="sun-parts.c" condition="SUN_PARTS"/>
<object source="video.c"/> <object source="video.c"/>
<object source="xcoff-loader.c" condition="PPC"/> <object source="xcoff-loader.c" condition="LOADER_XCOFF"/>
</library> </library>
<dictionary name="openbios" target="forth"> <dictionary name="openbios" target="forth">

View File

@@ -49,6 +49,7 @@ elf_loader_init_program( void *dummy )
Elf_phdr *phdr; Elf_phdr *phdr;
size_t size; size_t size;
char *addr; char *addr;
cell tmp;
feval("0 state-valid !"); feval("0 state-valid !");
@@ -67,11 +68,16 @@ elf_loader_init_program( void *dummy )
size = MIN(phdr[i].p_filesz, phdr[i].p_memsz); size = MIN(phdr[i].p_filesz, phdr[i].p_memsz);
if (!size) if (!size)
continue; continue;
#if 0
if( ofmem_claim( phdr[i].p_vaddr, phdr[i].p_memsz, 0 ) == -1 ) { if( ofmem_claim( phdr[i].p_vaddr, phdr[i].p_memsz, 0 ) == -1 ) {
printk("Claim failed!\n"); printk("Claim failed!\n");
return; return;
} }
addr = (char*)phdr[i].p_vaddr; #endif
/* Workaround for archs where sizeof(int) != pointer size */
tmp = phdr[i].p_vaddr;
addr = (char *)tmp;
memcpy(addr, base + phdr[i].p_offset, size); memcpy(addr, base + phdr[i].p_offset, size);
#ifdef CONFIG_PPC #ifdef CONFIG_PPC
flush_icache_range( addr, addr + size ); flush_icache_range( addr, addr + size );

View File

@@ -42,12 +42,14 @@ modules_init( void )
#ifdef CONFIG_SUN_PARTS #ifdef CONFIG_SUN_PARTS
sunparts_init(); sunparts_init();
#endif #endif
#ifdef CONFIG_PPC #ifdef CONFIG_LOADER_XCOFF
elf_loader_init();
xcoff_loader_init(); xcoff_loader_init();
#endif
#ifdef CONFIG_LOADER_ELF
elf_loader_init();
#endif
#ifdef CONFIG_PPC
bootinfo_loader_init(); bootinfo_loader_init();
#endif #endif
#ifdef CONFIG_SPARC64
elf_loader_init();
#endif
} }