[OpenBIOS] [PATCHv2 21/25] fcode: implement load/init-program as per IEEE-1275 specification

Mark Cave-Ayland mark.cave-ayland at ilande.co.uk
Thu Sep 8 09:01:00 CEST 2016


load should place the file at load-base, whilst init-program should parse
the memory at load-base and set up the context accordingly.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
---
 libopenbios/fcode_load.c |   26 ++++++++------------------
 libopenbios/load.c       |    9 +++------
 2 files changed, 11 insertions(+), 24 deletions(-)

diff --git a/libopenbios/fcode_load.c b/libopenbios/fcode_load.c
index 5258357..3d2da2f 100644
--- a/libopenbios/fcode_load.c
+++ b/libopenbios/fcode_load.c
@@ -6,6 +6,7 @@
 #include "kernel/kernel.h"
 #include "libopenbios/bindings.h"
 #include "libopenbios/fcode_load.h"
+#include "libopenbios/initprogram.h"
 #include "libopenbios/sys_info.h"
 #include "libc/diskio.h"
 #define printf printk
@@ -76,14 +77,10 @@ fcode_load(ihandle_t dev)
     debug("entry point is %#lx\n", start);
     
     // Initialise load-state
-    PUSH(start);
-    feval("load-state >ls.entry !");
     PUSH(size);
     feval("load-state >ls.file-size !");
     feval("fcode load-state >ls.file-type !");
 
-    feval("-1 state-valid !");
-
 out:
     close_io(fd);
     return retval;
@@ -92,18 +89,11 @@ out:
 void 
 fcode_init_program(void)
 {
-	/* If the payload is Fcode then we execute it immediately */
-	ucell address;
-
-	fword("load-base");
-	address = POP();
-
-	if (!is_fcode((unsigned char *)address)) {
-		debug("Not a valid Fcode memory image\n");
-		return;
-	}
-
-	PUSH(address);
-	PUSH(1);
-	fword("byte-load");
+    /* Use trampoline context to execute FCode */
+    PUSH((ucell)&init_fcode_context);
+    feval("load-state >ls.entry !");
+    
+    arch_init_program();
+    
+    feval("-1 state-valid !");
 }
diff --git a/libopenbios/load.c b/libopenbios/load.c
index edc95cb..1d64cc7 100644
--- a/libopenbios/load.c
+++ b/libopenbios/load.c
@@ -85,12 +85,9 @@ void load(ihandle_t dev)
 #endif
 
 #ifdef CONFIG_LOADER_FCODE
-	fcode_load(dev);
-        feval("state-valid @");
-        valid = POP();
-        if (valid) {
-                feval("load-state >ls.file-size @");
-                return;
+	if (fcode_load(dev) != LOADER_NOT_SUPPORT) {
+            feval("load-state >ls.file-size @");
+            return;
         }
 #endif
 
-- 
1.7.10.4




More information about the OpenBIOS mailing list