[OpenBIOS] r584 - in trunk/openbios-devel: arch/ppc/qemu config/scripts forth/debugging modules

svn at openbios.org svn at openbios.org
Sun Sep 20 22:15:47 CEST 2009


Author: laurent
Date: 2009-09-20 22:15:46 +0200 (Sun, 20 Sep 2009)
New Revision: 584

Added:
   trunk/openbios-devel/modules/bootinfo-loader.c
Modified:
   trunk/openbios-devel/arch/ppc/qemu/main.c
   trunk/openbios-devel/config/scripts/switch-arch
   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:
Add bootinfo-loader.

Signed-off-by: Laurent Vivier <Laurent at vivier.eu>



Modified: trunk/openbios-devel/arch/ppc/qemu/main.c
===================================================================
--- trunk/openbios-devel/arch/ppc/qemu/main.c	2009-09-20 19:32:30 UTC (rev 583)
+++ trunk/openbios-devel/arch/ppc/qemu/main.c	2009-09-20 20:15:46 UTC (rev 584)
@@ -229,27 +229,13 @@
     /* won't come here */
 }
 
-/*
-  Parse SGML structure like:
-  <chrp-boot>
-  <description>Debian/GNU Linux Installation on IBM CHRP hardware</description>
-  <os-name>Debian/GNU Linux for PowerPC</os-name>
-  <boot-script>boot &device;:\install\yaboot</boot-script>
-  <icon size=64,64 color-space=3,3,2>
-
-  CHRP system bindings are described at:
-  http://playground.sun.com/1275/bindings/chrp/chrp1_7a.ps
-*/
 static void
 try_chrp_script(const char *of_path, const char *param, const char *script_path)
 {
-    int tag, taglen, script, scriptlen, entity, chrp;
-    char tagbuf[128], path[1024], c;
+    char  path[1024];
     char *device, *filename, *directory;
     int partition;
-    int current, size;
-    char *base;
-    char *bootscript;
+    int size;
 
     device = get_device(of_path);
     partition = get_partition(of_path);
@@ -274,98 +260,7 @@
         ELF_DPRINTF("Can't open %s\n", of_path);
         return;
     }
-    bootscript = malloc(size);
-    if (bootscript == NULL) {
-        ELF_DPRINTF("Can't malloc %d bytes\n", size);
-        return;
-    }
-    feval("load-base");
-    base = (char*)POP();
-
-    chrp = 0;
-    tag = 0;
-    taglen = 0;
-    script = 0;
-    scriptlen = 0;
-    entity = 0;
-    current = 0;
-    while (current < size) {
-
-        c = base[current++];
-
-        if (c == '<') {
-            script = 0;
-            tag = 1;
-            taglen = 0;
-        } else if (c == '>') {
-            tag = 0;
-            tagbuf[taglen] = '\0';
-            if (strcasecmp(tagbuf, "chrp-boot") == 0) {
-                chrp = 1;
-            } else if (chrp == 1) {
-                if (strcasecmp(tagbuf, "boot-script") == 0) {
-                    script = 1;
-                    scriptlen = 0;
-                } else if (strcasecmp(tagbuf, "/boot-script") == 0) {
-
-                    script = 0;
-                    bootscript[scriptlen] = '\0';
-
-                    CHRP_DPRINTF("got bootscript %s\n", bootscript);
-
-                    encode_bootpath(of_path, param);
-
-                    feval(bootscript);
-
-                    break;
-                } else if (strcasecmp(tagbuf, "/chrp-boot") == 0)
-		    break;
-            }
-        } else if (tag && taglen < sizeof(tagbuf)) {
-            tagbuf[taglen++] = c;
-        } else if (script && c == '&') {
-            entity = 1;
-            taglen = 0;
-        } else if (entity && c ==';') {
-            entity = 0;
-            tagbuf[taglen] = '\0';
-            if (strcasecmp(tagbuf, "lt") == 0) {
-                bootscript[scriptlen++] = '<';
-            } else if (strcasecmp(tagbuf, "gt") == 0) {
-                bootscript[scriptlen++] = '>';
-            } else if (strcasecmp(tagbuf, "device") == 0) {
-                strcpy(bootscript + scriptlen, device);
-                scriptlen += strlen(device);
-            } else if (strcasecmp(tagbuf, "partition") == 0) {
-                if (partition != -1)
-		    sprintf(bootscript + scriptlen, "%d", partition);
-                else
-                    *(bootscript + scriptlen) = 0;
-                scriptlen = strlen(bootscript);
-            } else if (strcasecmp(tagbuf, "directory") == 0) {
-                strcpy(bootscript + scriptlen, directory);
-                scriptlen += strlen(directory);
-            } else if (strcasecmp(tagbuf, "filename") == 0) {
-                strcpy(bootscript + scriptlen, filename);
-                scriptlen += strlen(filename);
-            } else if (strcasecmp(tagbuf, "full-path") == 0) {
-                strcpy(bootscript + scriptlen, of_path);
-                scriptlen += strlen(of_path);
-            } else { /* unknown, keep it */
-                bootscript[scriptlen] = '&';
-                strcpy(bootscript + scriptlen + 1, tagbuf);
-                scriptlen += taglen + 1;
-                bootscript[scriptlen] = ';';
-                scriptlen++;
-            }
-        } else if (entity && taglen < sizeof(tagbuf)) {
-            tagbuf[taglen++] = c;
-        } else if (script && scriptlen < size) {
-            bootscript[scriptlen++] = c;
-        }
-    }
-
-    free(bootscript);
+    feval("go");
 }
 
 #define OLDWORLD_BOOTCODE_BASEADDR	(0x3f4000)

Modified: trunk/openbios-devel/config/scripts/switch-arch
===================================================================
--- trunk/openbios-devel/config/scripts/switch-arch	2009-09-20 19:32:30 UTC (rev 583)
+++ trunk/openbios-devel/config/scripts/switch-arch	2009-09-20 20:15:46 UTC (rev 584)
@@ -122,7 +122,7 @@
         ;;
 
         sparc32)
-        TARGET="sparc-elf-"
+        TARGET="sparc-linux-gnu-"
         CFLAGS="-Wa,-xarch=v8 -Wa,-32 -m32 -mcpu=supersparc -fno-builtin"
         AS_FLAGS="-Wa,-xarch=v8 -Wa,-32"
         ;;

Modified: trunk/openbios-devel/forth/debugging/client.fs
===================================================================
--- trunk/openbios-devel/forth/debugging/client.fs	2009-09-20 19:32:30 UTC (rev 583)
+++ trunk/openbios-devel/forth/debugging/client.fs	2009-09-20 20:15:46 UTC (rev 584)
@@ -181,6 +181,8 @@
 
 variable elf-entry
 variable xcoff-entry
+variable bootinfo-entry
+variable bootinfo-size
 
 : init-program-elf
   elf file-type !
@@ -317,7 +319,15 @@
       ." go is not yet implemented"
 [THEN]
     else
-      ." go is not yet implemented"
+        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
     then
   then
   ;

Added: trunk/openbios-devel/modules/bootinfo-loader.c
===================================================================
--- trunk/openbios-devel/modules/bootinfo-loader.c	                        (rev 0)
+++ trunk/openbios-devel/modules/bootinfo-loader.c	2009-09-20 20:15:46 UTC (rev 584)
@@ -0,0 +1,242 @@
+/*
+ *
+ *       <bootinfo-loader.c>
+ *
+ *       bootinfo file loader
+ *
+ *   Copyright (C) 2009 Laurent Vivier (Laurent at vivier.eu)
+ *
+ *   Original XML parser by Blue Swirl <blauwirbel at gmail.com>
+ *
+ *   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 "openbios/config.h"
+#include "openbios/bindings.h"
+#include "modules.h"
+#include "ofmem.h"
+#include "stdio.h"
+
+//#define DEBUG_BOOTINFO
+
+#ifdef DEBUG_BOOTINFO
+#define DPRINTF(fmt, args...) \
+    do { printk("%s: " fmt, __func__ , ##args); } while (0)
+#else
+#define DPRINTF(fmt, args...) \
+    do { } while (0)
+#endif
+
+DECLARE_NODE(bootinfo_loader, INSTALL_OPEN, 0, "+/packages/bootinfo-loader" );
+
+static char *
+get_device( const char *path )
+{
+	int i;
+	static char buf[1024];
+
+	for (i = 0; i < sizeof(buf) && path[i] && path[i] != ':'; i++)
+		buf[i] = path[i];
+	buf[i] = 0;
+
+	return buf;
+}
+
+static int
+get_partition( const char *path )
+{
+	while ( *path && *path != ':' )
+		path++;
+
+	if (!*path)
+		return -1;
+	path++;
+
+	if (!strchr(path, ',')) /* check if there is a ',' */
+		return -1;
+
+	return atol(path);
+}
+
+static char *
+get_filename( const char * path , char **dirname)
+{
+        static char buf[1024];
+        char *filename;
+
+        while ( *path && *path != ':' )
+                path++;
+
+        if (!*path) {
+                *dirname = NULL;
+                return NULL;
+        }
+        path++;
+
+        while ( *path && isdigit(*path) )
+                path++;
+
+        if (*path == ',')
+                path++;
+
+        strncpy(buf, path, sizeof(buf));
+        buf[sizeof(buf) - 1] = 0;
+
+        filename = strrchr(buf, '\\');
+        if (filename) {
+                *dirname = buf;
+                (*filename++) = 0;
+        } else {
+                *dirname = NULL;
+                filename = buf;
+        }
+
+        return filename;
+}
+
+/*
+  Parse SGML structure like:
+  <chrp-boot>
+  <description>Debian/GNU Linux Installation on IBM CHRP hardware</description>
+  <os-name>Debian/GNU Linux for PowerPC</os-name>
+  <boot-script>boot &device;:\install\yaboot</boot-script>
+  <icon size=64,64 color-space=3,3,2>
+
+  CHRP system bindings are described at:
+  http://playground.sun.com/1275/bindings/chrp/chrp1_7a.ps
+*/
+
+static void
+bootinfo_loader_init_program( void *dummy )
+{
+	char *base;
+	int proplen;
+	phandle_t chosen;
+	int tag, taglen, script, scriptlen, entity, chrp;
+	char tagbuf[128], c;
+	char *device, *filename, *directory;
+	int partition;
+	int current, size;
+	char *bootscript;
+        char *tmp;
+	char bootpath[1024];
+
+	chosen = find_dev("/chosen");
+	tmp = get_property(chosen, "bootpath", &proplen);
+	memcpy(bootpath, tmp, proplen);
+	bootpath[proplen] = 0;
+
+	DPRINTF("bootpath %s\n", bootpath);
+
+	device = get_device(bootpath);
+	partition = get_partition(bootpath);
+	filename = get_filename(bootpath, &directory);
+
+	feval("load-base");
+	base = (char*)POP();
+
+	feval("load-size");
+	size = POP();
+
+	bootscript = malloc(size);
+	if (bootscript == NULL) {
+		DPRINTF("Can't malloc %d bytes\n", size);
+		return;
+	}
+
+	chrp = 0;
+	tag = 0;
+	taglen = 0;
+	script = 0;
+	scriptlen = 0;
+	entity = 0;
+	current = 0;
+	while (current < size) {
+
+		c = base[current++];
+
+		if (c == '<') {
+			script = 0;
+			tag = 1;
+			taglen = 0;
+		} else if (c == '>') {
+			tag = 0;
+			tagbuf[taglen] = '\0';
+			if (strcasecmp(tagbuf, "chrp-boot") == 0) {
+				chrp = 1;
+			} else if (chrp == 1) {
+				if (strcasecmp(tagbuf, "boot-script") == 0) {
+					script = 1;
+					scriptlen = 0;
+				} else if (strcasecmp(tagbuf, "/boot-script") == 0) {
+
+					script = 0;
+					bootscript[scriptlen] = '\0';
+
+					DPRINTF("got bootscript %s\n",
+						bootscript);
+
+					/* FIXME: should initialize saved-program-state. */
+					push_str(bootscript);
+					feval("bootinfo-size ! bootinfo-entry !");
+
+					break;
+				} else if (strcasecmp(tagbuf, "/chrp-boot") == 0)
+					break;
+			}
+		} else if (tag && taglen < sizeof(tagbuf)) {
+			tagbuf[taglen++] = c;
+		} else if (script && c == '&') {
+			entity = 1;
+			taglen = 0;
+		} else if (entity && c ==';') {
+			entity = 0;
+			tagbuf[taglen] = '\0';
+			if (strcasecmp(tagbuf, "lt") == 0) {
+				bootscript[scriptlen++] = '<';
+			} else if (strcasecmp(tagbuf, "gt") == 0) {
+				bootscript[scriptlen++] = '>';
+			} else if (strcasecmp(tagbuf, "device") == 0) {
+				strcpy(bootscript + scriptlen, device);
+				scriptlen += strlen(device);
+			} else if (strcasecmp(tagbuf, "partition") == 0) {
+				if (partition != -1)
+			sprintf(bootscript + scriptlen, "%d", partition);
+				else
+					*(bootscript + scriptlen) = 0;
+				scriptlen = strlen(bootscript);
+			} else if (strcasecmp(tagbuf, "directory") == 0) {
+				strcpy(bootscript + scriptlen, directory);
+				scriptlen += strlen(directory);
+			} else if (strcasecmp(tagbuf, "filename") == 0) {
+				strcpy(bootscript + scriptlen, filename);
+				scriptlen += strlen(filename);
+			} else if (strcasecmp(tagbuf, "full-path") == 0) {
+				strcpy(bootscript + scriptlen, bootpath);
+				scriptlen += strlen(bootpath);
+			} else { /* unknown, keep it */
+				bootscript[scriptlen] = '&';
+				strcpy(bootscript + scriptlen + 1, tagbuf);
+				scriptlen += taglen + 1;
+				bootscript[scriptlen] = ';';
+				scriptlen++;
+			}
+		} else if (entity && taglen < sizeof(tagbuf)) {
+			tagbuf[taglen++] = c;
+		} else if (script && scriptlen < size) {
+			bootscript[scriptlen++] = c;
+		}
+	}
+}
+
+NODE_METHODS( bootinfo_loader ) = {
+	{ "init-program", bootinfo_loader_init_program },
+};
+
+void bootinfo_loader_init( void )
+{
+	REGISTER_NODE( bootinfo_loader );
+}

Modified: trunk/openbios-devel/modules/build.xml
===================================================================
--- trunk/openbios-devel/modules/build.xml	2009-09-20 19:32:30 UTC (rev 583)
+++ trunk/openbios-devel/modules/build.xml	2009-09-20 20:15:46 UTC (rev 584)
@@ -26,6 +26,7 @@
   <object source="ofmem_common.c" condition="OFMEM"/>
   <object source="elf-loader.c" condition="PPC"/>
   <object source="xcoff-loader.c" condition="PPC"/>
+  <object source="bootinfo-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-20 19:32:30 UTC (rev 583)
+++ trunk/openbios-devel/modules/init.c	2009-09-20 20:15:46 UTC (rev 584)
@@ -45,5 +45,6 @@
 #ifdef CONFIG_PPC
 	elf_loader_init();
 	xcoff_loader_init();
+	bootinfo_loader_init();
 #endif
 }

Modified: trunk/openbios-devel/modules/modules.h
===================================================================
--- trunk/openbios-devel/modules/modules.h	2009-09-20 19:32:30 UTC (rev 583)
+++ trunk/openbios-devel/modules/modules.h	2009-09-20 20:15:46 UTC (rev 584)
@@ -26,5 +26,6 @@
 extern void	cmdline_init( void );
 extern void	elf_loader_init( void );
 extern void	xcoff_loader_init( void );
+extern void	bootinfo_loader_init( void );
 
 #endif   /* _H_MODULES */




More information about the OpenBIOS mailing list