[OpenBIOS] r578 - in trunk/openbios-devel: arch/ppc/qemu forth/debugging modules
svn at openbios.org
svn at openbios.org
Sat Sep 19 00:59:31 CEST 2009
Author: laurent
Date: 2009-09-19 00:59:30 +0200 (Sat, 19 Sep 2009)
New Revision: 578
Modified:
trunk/openbios-devel/arch/ppc/qemu/init.c
trunk/openbios-devel/forth/debugging/client.fs
trunk/openbios-devel/modules/build.xml
trunk/openbios-devel/modules/init.c
trunk/openbios-devel/modules/modules.h
Log:
Allows to boot openSUSE from install CD-ROM
Implements "init-program" using loader packages
Write a first loader package: elf-loader
Signed-off-by: Laurent Vivier <Laurent at vivier.eu>
Modified: trunk/openbios-devel/arch/ppc/qemu/init.c
===================================================================
--- trunk/openbios-devel/arch/ppc/qemu/init.c 2009-09-02 22:25:44 UTC (rev 577)
+++ trunk/openbios-devel/arch/ppc/qemu/init.c 2009-09-18 22:59:30 UTC (rev 578)
@@ -439,6 +439,18 @@
for (;;);
}
+static void go( void );
+
+static void
+go( void )
+{
+ ucell addr;
+
+ addr = POP();
+
+ call_elf( 0, 0, addr);
+}
+
void
arch_of_init( void )
{
@@ -688,4 +700,5 @@
device_end();
bind_func("platform-boot", boot );
+ bind_func("(go)", go);
}
Modified: trunk/openbios-devel/forth/debugging/client.fs
===================================================================
--- trunk/openbios-devel/forth/debugging/client.fs 2009-09-02 22:25:44 UTC (rev 577)
+++ trunk/openbios-devel/forth/debugging/client.fs 2009-09-18 22:59:30 UTC (rev 578)
@@ -23,8 +23,268 @@
: load-size file-size @ ;
+variable file-type
+
+0 constant elf
+1 constant bootinfo
+2 constant xcoff
+3 constant pe
+
+\ 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
+
+: 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
+ ;
+
+: 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
+ ;
+
+: encode-bootpath ( str len -- )
+ \ FIXME: need to extract bootargs from bootpath and set it in /chosen
+ " /chosen" (find-dev) if
+ " bootpath" rot (property)
+ then
+;
+
: load ( "{params}<cr>" -- )
linefeed parse ( str len )
+ 2dup encode-bootpath
open-dev ( ihandle )
dup 0= if
drop
@@ -35,19 +295,23 @@
dup ihandle>phandle " load" rot find-method ( xt 0|1 )
if swap call-package !load-size else cr ." Cannot find load for this package" 2drop then
r> close-dev
+ init-program
;
: go ( -- )
- ." go is not yet implemented"
+ elf file-type @ = if
+[IFDEF] CONFIG_PPC
+ elf-entry @ " (go)" evaluate
+[THEN]
+ else
+ ." go is not yet implemented"
+ then
;
: state-valid ( -- a-addr )
;
-: init-program ( -- )
- ;
-
\ 7.6.3 Abort and resume
\ already defined !?
Modified: trunk/openbios-devel/modules/build.xml
===================================================================
--- trunk/openbios-devel/modules/build.xml 2009-09-02 22:25:44 UTC (rev 577)
+++ trunk/openbios-devel/modules/build.xml 2009-09-18 22:59:30 UTC (rev 578)
@@ -24,6 +24,7 @@
<object source="font_8x8.c" condition="FONT_8X8"/>
<object source="font_8x16.c" condition="FONT_8X16"/>
<object source="ofmem_common.c" condition="OFMEM"/>
+ <object source="elf-loader.c" condition="PPC"/>
</library>
<dictionary name="openbios" target="forth">
Modified: trunk/openbios-devel/modules/init.c
===================================================================
--- trunk/openbios-devel/modules/init.c 2009-09-02 22:25:44 UTC (rev 577)
+++ trunk/openbios-devel/modules/init.c 2009-09-18 22:59:30 UTC (rev 578)
@@ -42,4 +42,5 @@
#ifdef CONFIG_SUN_PARTS
sunparts_init();
#endif
+ elf_loader_init();
}
Modified: trunk/openbios-devel/modules/modules.h
===================================================================
--- trunk/openbios-devel/modules/modules.h 2009-09-02 22:25:44 UTC (rev 577)
+++ trunk/openbios-devel/modules/modules.h 2009-09-18 22:59:30 UTC (rev 578)
@@ -24,5 +24,6 @@
extern void pcparts_init( void );
extern void sunparts_init( void );
extern void cmdline_init( void );
+extern void elf_loader_init( void );
#endif /* _H_MODULES */
More information about the OpenBIOS
mailing list