[OpenBIOS] [PATCH 22/24] forth: implement load/init-program as per IEEE-1275 specification

Mark Cave-Ayland mark.cave-ayland at ilande.co.uk
Tue Sep 6 00:01:38 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/forth_load.c |   26 +++++++++++++-------------
 libopenbios/load.c       |   13 +++----------
 2 files changed, 16 insertions(+), 23 deletions(-)

diff --git a/libopenbios/forth_load.c b/libopenbios/forth_load.c
index 35835fb..4433635 100644
--- a/libopenbios/forth_load.c
+++ b/libopenbios/forth_load.c
@@ -9,6 +9,7 @@
 #include "config.h"
 #include "kernel/kernel.h"
 #include "libopenbios/bindings.h"
+#include "libopenbios/initprogram.h"
 #include "libopenbios/sys_info.h"
 #include "libc/diskio.h"
 #include "libopenbios/forth_load.h"
@@ -16,7 +17,6 @@
 #define debug printk
 
 static int fd;
-static char *forthtext=NULL;
 
 int is_forth(char *forth)
 {
@@ -27,6 +27,7 @@ int forth_load(ihandle_t dev)
 {
     char magic[2];
     unsigned long forthsize;
+    ucell *forthtext;
     int retval = -1;
 
     /* Mark the saved-program-state as invalid */
@@ -52,37 +53,36 @@ int forth_load(ihandle_t dev)
     /* Calculate the file size by seeking to the end of the file */
     seek_io(fd, -1);
     forthsize = tell(fd);
-    forthtext = malloc(forthsize+1);
     seek_io(fd, 0);
 
+    fword("load-base");
+    forthtext = (void *)POP();
+    
     printk("Loading forth source ...");
     if ((size_t)read_io(fd, forthtext, forthsize) != forthsize) {
 	printk("Can't read forth text\n");
 	goto out;
     }
-    forthtext[forthsize]=0;
+    forthtext[(forthsize / sizeof(ucell)) + 1]=0;
     printk("ok\n");
 
     // Initialise saved-program-state
-    PUSH((ucell)forthtext);
-    feval("load-state >ls.entry !");
     PUSH((ucell)forthsize);
     feval("load-state >ls.file-size !");
     feval("forth load-state >ls.file-type !");
 
-    feval("-1 state-valid !");
-
-    retval=0;
-
 out:
-    //if (forthtext)
-    //	free(forthtext);
     return retval;
 }
 
 void 
 forth_init_program(void)
 {
-	// Currently not implemented
-	feval("0 state-valid !");
+    /* Use trampoline context to execute Forth */
+    PUSH((ucell)&init_forth_context);
+    feval("load-state >ls.entry !");
+    
+    arch_init_program();
+    
+    feval("-1 state-valid !");
 }
diff --git a/libopenbios/load.c b/libopenbios/load.c
index 1d64cc7..048f459 100644
--- a/libopenbios/load.c
+++ b/libopenbios/load.c
@@ -51,15 +51,11 @@ void load(ihandle_t dev)
 {
 	/* Invoke the loaders on the specified device */
 	char *param;
-	ucell valid = 0;
 
 	/* TODO: Currently the internal loader APIs use load-base directly, so
 	   drop the address */
 	POP();
 
-	/* Temporarily keep compiler quiet during transition */
-	valid = valid;
-
 #ifdef CONFIG_LOADER_ELF
 
 	/* Grab the boot arguments */
@@ -92,12 +88,9 @@ void load(ihandle_t dev)
 #endif
 
 #ifdef CONFIG_LOADER_FORTH
-	forth_load(dev);
-        feval("state-valid @");
-        valid = POP();
-        if (valid) {
-                feval("load-state >ls.file-size @");
-                return;
+	if (forth_load(dev) != LOADER_NOT_SUPPORT) {
+            feval("load-state >ls.file-size @");
+            return;
         }
 #endif
 
-- 
1.7.10.4




More information about the OpenBIOS mailing list