[OpenBIOS] [commit] r726 - in trunk/openbios-devel: forth/debugging include/libopenbios libopenbios
repository service
svn at openbios.org
Fri Apr 2 15:01:11 CEST 2010
Author: mcayland
Date: Fri Apr 2 15:01:10 2010
New Revision: 726
URL: http://tracker.coreboot.org/trac/openbios/changeset/726
Log:
The new loader APIs in libopenbios already have routines to detect the type of executable at a given address and react
accordingly. Hence since the loaders are currently written in C, it makes more sense to drop down into C and re-use the same
code rather than have a second implementation in Forth.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at siriusit.co.uk>
Added:
trunk/openbios-devel/include/libopenbios/initprogram.h
trunk/openbios-devel/libopenbios/initprogram.c
Modified:
trunk/openbios-devel/forth/debugging/client.fs
trunk/openbios-devel/libopenbios/aout_load.c
trunk/openbios-devel/libopenbios/build.xml
trunk/openbios-devel/libopenbios/init.c
Modified: trunk/openbios-devel/forth/debugging/client.fs
==============================================================================
--- trunk/openbios-devel/forth/debugging/client.fs Fri Apr 2 13:41:35 2010 (r725)
+++ trunk/openbios-devel/forth/debugging/client.fs Fri Apr 2 15:01:10 2010 (r726)
@@ -16,6 +16,7 @@
\ 7.6.2 Program download and execute
+
struct ( saved-program-state )
/n field >sps.entry
/n field >sps.file-size
@@ -32,7 +33,8 @@
: load-size file-size @ ;
-variable file-type
+
+\ File types identified by (init-program)
0 constant elf-boot
1 constant elf
@@ -43,289 +45,13 @@
10 constant fcode
11 constant forth
-\ Array indexes and values for e_type
-
-d# 16 constant EI_NIDENT
-
-0 constant EI_MAG0
- h# 7f constant ELFMAG0
-
-1 constant EI_MAG1
- [CHAR] E constant ELFMAG1
-
-2 constant EI_MAG2
- [CHAR] L constant ELFMAG2
-
-3 constant EI_MAG3
- [CHAR] F constant ELFMAG3
-
-4 constant EI_CLASS
- 0 constant ELFCLASSNONE
- 1 constant ELFCLASS32
- 2 constant ELFCLASS64
-
-5 constant EI_DATA
- 0 constant ELFDATANONE
- 1 constant ELFDATA2LSB
- 2 constant ELFDATA2MSB
-
-6 constant EI_VERSION
- 0 constant EV_NONE
- 1 constant EV_CURRENT
-
-\ Values for e_type
-
-0 constant ET_NONE
-1 constant ET_REL
-2 constant ET_EXEC
-3 constant ET_DYN
-4 constant ET_CORE
-
-\ Values for e_machine
-
-d# 2 constant EM_SPARC
-d# 3 constant EM_386
-d# 6 constant EM_486
-d# 18 constant EM_SPARC32PLUS
-d# 20 constant EM_PPC
-d# 43 constant EM_SPARCV9
-
-/l constant Elf32_Addr
-/w constant Elf32_Half
-/l constant Elf32_Off
-/l constant Elf32_Sword
-/l constant Elf32_Word
-/l constant Elf32_Size
-
-struct ( ELF header )
- EI_NIDENT field >Elf32_Ehdr.e_ident ( File identification )
- Elf32_Half field >Elf32_Ehdr.e_type ( File type )
- Elf32_Half field >Elf32_Ehdr.e_machine ( Machine archicture )
- Elf32_Word field >Elf32_Ehdr.e_version ( ELF format version )
- Elf32_Addr field >Elf32_Ehdr.e_entry ( Entry point )
- Elf32_Off field >Elf32_Ehdr.e_phoff ( Program header file offset )
- Elf32_Off field >Elf32_Ehdr.e_shoff ( Section header file offset )
- Elf32_Word field >Elf32_Ehdr.e_flags ( Architecture specific flags )
- Elf32_Half field >Elf32_Ehdr.e_ehsize ( Size of ELF header in bytes )
- Elf32_Half field >Elf32_Ehdr.e_phentsize ( Size of program header entries )
- Elf32_Half field >Elf32_Ehdr.e_phnum ( Number of program header entry )
- Elf32_Half field >Elf32_Ehdr.e_shentsize ( Size of section header entry )
- Elf32_Half field >Elf32_Ehdr.e_shnum ( Number of section header entries )
- Elf32_Half field >Elf32_Ehdr.e_shstrndx ( Section name strings section )
-constant /Elf32_Ehdr
-
-: @e_ident ( base index -- byte )
- swap >Elf32_Ehdr.e_ident + c@
-;
-
-: @e_type ( base -- type )
- >Elf32_Ehdr.e_type w@
-;
-
-: @e_machine ( base -- type )
- >Elf32_Ehdr.e_machine w@
-;
-
-: @e_entry ( base -- entry )
- >Elf32_Ehdr.e_entry l@
-;
-
-: @e_phoff ( base -- poffset )
- >Elf32_Ehdr.e_phoff l@
-;
-
-: @e_phnum ( base -- pnum )
- >Elf32_Ehdr.e_phnum w@
-;
-
-: elf?
- " load-base" evaluate
- dup EI_MAG0 @e_ident
- ELFMAG0 <> if drop false exit then
- dup EI_MAG1 @e_ident
- ELFMAG1 <> if drop false exit then
- dup EI_MAG2 @e_ident
- ELFMAG2 <> if drop false exit then
- dup EI_MAG3 @e_ident
- ELFMAG3 <> if drop false exit then
- dup EI_CLASS @e_ident
-[IFDEF] CONFIG_SPARC64
- ELFCLASS64 <> if drop false exit then
-[ELSE]
- ELFCLASS32 <> if drop false exit then
-[THEN]
- dup EI_DATA @e_ident
- " little-endian?" evaluate if
- ELFDATA2LSB <> if drop false exit then
- else
- ELFDATA2MSB <> if drop false exit then
- then
- dup @e_type
- ET_EXEC <> if drop false exit then ( not executable )
- @e_machine
-[IFDEF] CONFIG_PPC
- EM_PPC <> if false exit then
-[THEN]
-[IFDEF] CONFIG_X86
- dup
- EM_386 <> if
- EM_486 <> if
- false exit
- then
- else
- drop
- then
-[THEN]
-[IFDEF] CONFIG_SPARC32
- dup
- EM_SPARC <> if
- EM_SPARC32PLUS <> if
- false exit
- then
- else
- drop
- then
-[THEN]
-[IFDEF] CONFIG_SPARC64
- EM_SPARCV9 <> if false exit then
-[THEN]
- true
- ;
-
-variable elf-entry
-variable xcoff-entry
-variable bootinfo-entry
-variable bootinfo-size
-
-: init-program-elf
- elf file-type !
- " /packages/elf-loader" open-dev dup if
- dup
- " init-program" rot $call-method
- close-dev
- else
- drop
- ." /packages/elf-loader is missing" cr
- then
-;
-
-: xcoff?
- " load-base" evaluate w@
- h# 1df <> if
- false
- exit
- then
- true
- ;
-
-: init-program-xcoff
- xcoff file-type !
- " /packages/xcoff-loader" open-dev dup if
- dup
- " init-program" rot $call-method
- close-dev
- else
- drop
- ." /packages/xcoff-loader is missing" cr
- then
- ;
-
-: pe?
- false
-;
-
-: init-program-pe
- pe file-type !
- " /packages/pe-loader" open-dev dup if
- dup
- " init-program" rot $call-method
- close-dev
- else
- drop
- ." /packages/pe-loader is missing" cr
- then
- ;
-
-: bootinfo?
- " load-base" evaluate dup
- " <CHRP-BOOT>" comp 0= if
- drop
- true
- exit
- then
- " <chrp-boot>" comp 0= if
- true
- exit
- then
- false
- ;
-
-: init-program-bootinfo
- bootinfo file-type !
- " /packages/bootinfo-loader" open-dev dup if
- dup
- " init-program" rot $call-method
- close-dev
- else
- drop
- ." /packages/bootinfo-loader is missing" cr
- then
- ;
-
-: fcode?
- " load-base" evaluate c@
- dup h# f0 = if \ start0
- drop
- true
- exit
- then
- dup h# f1 = if \ start1
- drop
- true
- exit
- then
- dup h# f2 = if \ start2
- drop
- true
- exit
- then
- dup h# f3 = if \ start4
- drop
- true
- exit
- then
- h# fd = if \ version1
- true
- exit
- then
- false
- ;
-
-: init-program-fcode
- " load-base" evaluate 8 +
- 1 byte-load
- ;
: init-program ( -- )
- elf? if
- init-program-elf
- exit
- then
- xcoff? if
- init-program-xcoff
- exit
- then
- pe? if
- init-program-pe
- exit
- then
- bootinfo? if
- init-program-bootinfo
- exit
- then
- fcode? if
- init-program-fcode
- exit
+ \ Call down to the lower level for relocation etc.
+ s" (init-program)" $find if
+ execute
+ else
+ s" Unable to locate (init-program)!" type cr
then
;
@@ -372,29 +98,21 @@
: go ( -- )
state-valid @ not if exit then
- elf file-type @ = if
+ elf saved-program-state >sps.file-type @ = if
[IFDEF] CONFIG_PPC
- elf-entry @ " (go)" evaluate
+ saved-program-state >sps.entry @ " (go)" evaluate
[ELSE]
." go is not yet implemented"
[THEN]
else
- xcoff file-type @ = if
+ xcoff saved-program-state >sps.file-type @ = if
[IFDEF] CONFIG_PPC
- xcoff-entry @ " (go)" evaluate
+ saved-program-state >sps.entry @ " (go)" evaluate
[ELSE]
." go is not yet implemented"
[THEN]
else
- bootinfo file-type @ = if
-[IFDEF] CONFIG_PPC
- bootinfo-entry @ bootinfo-size @ evaluate
-[ELSE]
- ." go is not yet implemented"
-[THEN]
- else
- ." go is not yet implemented"
- then
+ ." go is not yet implemented"
then
then
;
Added: trunk/openbios-devel/include/libopenbios/initprogram.h
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ trunk/openbios-devel/include/libopenbios/initprogram.h Fri Apr 2 15:01:10 2010 (r726)
@@ -0,0 +1,22 @@
+/*
+ * Creation Date: <2010/04/02 13:00:00 mcayland>
+ * Time-stamp: <2010/04/02 13:00:00 mcayland>
+ *
+ * <initprogram.h>
+ *
+ * C implementation of (init-program) word
+ *
+ * Copyright (C) 2010 Mark Cave-Ayland (mark.cave-ayland at siriusit.co.uk)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2
+ *
+ */
+
+#ifndef _H_INITPROGRAM
+#define _H_INITPROGRAM
+
+extern void init_program(void);
+
+#endif /* _H_INITPROGRAM */
Modified: trunk/openbios-devel/libopenbios/aout_load.c
==============================================================================
--- trunk/openbios-devel/libopenbios/aout_load.c Fri Apr 2 13:41:35 2010 (r725)
+++ trunk/openbios-devel/libopenbios/aout_load.c Fri Apr 2 15:01:10 2010 (r726)
@@ -10,7 +10,6 @@
#define CONFIG_SPARC64_PAGE_SIZE_8KB
#endif
-#include "arch/common/a.out.h"
#include "libopenbios/sys_info.h"
#include "libopenbios/bindings.h"
#include "libopenbios/aout_load.h"
Modified: trunk/openbios-devel/libopenbios/build.xml
==============================================================================
--- trunk/openbios-devel/libopenbios/build.xml Fri Apr 2 13:41:35 2010 (r725)
+++ trunk/openbios-devel/libopenbios/build.xml Fri Apr 2 15:01:10 2010 (r726)
@@ -13,6 +13,7 @@
<object source="fcode_load.c" condition="LOADER_FCODE"/>
<object source="forth_load.c" condition="LOADER_FORTH"/>
<object source="init.c"/>
+ <object source="initprogram.c"/>
<object source="ipchecksum.c"/>
<object source="linuxbios_info.c" condition="LINUXBIOS"/>
<object source="ofmem_common.c" condition="OFMEM"/>
Modified: trunk/openbios-devel/libopenbios/init.c
==============================================================================
--- trunk/openbios-devel/libopenbios/init.c Fri Apr 2 13:41:35 2010 (r725)
+++ trunk/openbios-devel/libopenbios/init.c Fri Apr 2 15:01:10 2010 (r726)
@@ -16,9 +16,12 @@
#include "config.h"
#include "libopenbios/openbios.h"
+#include "libopenbios/bindings.h"
+#include "libopenbios/initprogram.h"
void
openbios_init( void )
{
- // TODO
+ // Bind the C implementation of (init-program) into Forth
+ bind_func("(init-program)", init_program);
}
Added: trunk/openbios-devel/libopenbios/initprogram.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ trunk/openbios-devel/libopenbios/initprogram.c Fri Apr 2 15:01:10 2010 (r726)
@@ -0,0 +1,85 @@
+/*
+ * Creation Date: <2010/04/02 13:00:00 mcayland>
+ * Time-stamp: <2010/04/02 13:00:00 mcayland>
+ *
+ * <initprogram.c>
+ *
+ * C implementation of (init-program) word
+ *
+ * Copyright (C) 2010 Mark Cave-Ayland (mark.cave-ayland at siriusit.co.uk)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2
+ *
+ */
+
+#include "config.h"
+#include "kernel/kernel.h"
+#include "libopenbios/bindings.h"
+#include "libopenbios/initprogram.h"
+
+/* Because the a.out loader requires platform-specific headers */
+#ifdef CONFIG_LOADER_AOUT
+#include "libopenbios/aout_load.h"
+#endif
+
+#include "libopenbios/bootinfo_load.h"
+#include "libopenbios/elf_load.h"
+#include "libopenbios/fcode_load.h"
+#include "libopenbios/forth_load.h"
+#include "libopenbios/xcoff_load.h"
+
+
+void init_program(void)
+{
+ /* Get the value of load-base and use it to determine the correct loader
+ to use */
+ ucell addr;
+
+ feval("load-base");
+ addr = POP();
+
+#ifdef CONFIG_LOADER_AOUT
+ if (is_aout((struct exec *)addr)) {
+ aout_init_program();
+ return;
+ }
+#endif
+
+#ifdef CONFIG_LOADER_BOOTINFO
+ if (is_bootinfo((char *)addr)) {
+ bootinfo_init_program();
+ return;
+ }
+#endif
+
+#ifdef CONFIG_LOADER_ELF
+ if (is_elf((Elf_ehdr *)addr)) {
+ elf_init_program();
+ return;
+ }
+#endif
+
+#ifdef CONFIG_LOADER_FCODE
+ if (is_fcode((unsigned char *)addr)) {
+ fcode_init_program();
+ return;
+ }
+#endif
+
+#ifdef CONFIG_LOADER_FORTH
+ if (is_forth((char *)addr)) {
+ forth_init_program();
+ return;
+ }
+#endif
+
+#ifdef CONFIG_LOADER_XCOFF
+ if (is_xcoff((COFF_filehdr_t *)addr)) {
+ xcoff_init_program();
+ return;
+ }
+#endif
+
+}
More information about the OpenBIOS
mailing list