[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