[OpenBIOS] [commit] r1105 - in trunk/openbios-devel: config/examples forth/debugging include/libopenbios libopenbios packages

repository service svn at openbios.org
Fri Apr 5 11:35:12 CEST 2013


Author: mcayland
Date: Fri Apr  5 11:35:08 2013
New Revision: 1105
URL: http://tracker.coreboot.org/trac/openbios/changeset/1105

Log:
loader: implement new loader type for CHRP/Apple partition bootcode (%BOOT)

One of the primary reasons that issues with the quik bootloader were not
detected earlier was because arch/ppc/qemu/main.c has a separate code path
for forcing an old-world boot when -boot c is passed to QEMU.

This commit implements the bootcode loader as a core OpenBIOS loader which
enables old-world payloads such as quik to be executed using:

load hd:,%BOOT
go

Note that we also fix a bug in mac-parts.c to ensure that we don't try and
interpose a filesystem package when %BOOT is passed as a filename.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
CC: Alexander Graf <agraf at suse.de>
CC: Andreas Färber <afaerber at suse.de>

Added:
   trunk/openbios-devel/include/libopenbios/bootcode_load.h
   trunk/openbios-devel/libopenbios/bootcode_load.c
Modified:
   trunk/openbios-devel/config/examples/ppc_config.xml
   trunk/openbios-devel/forth/debugging/client.fs
   trunk/openbios-devel/libopenbios/build.xml
   trunk/openbios-devel/libopenbios/load.c
   trunk/openbios-devel/packages/mac-parts.c

Modified: trunk/openbios-devel/config/examples/ppc_config.xml
==============================================================================
--- trunk/openbios-devel/config/examples/ppc_config.xml	Thu Apr  4 13:26:41 2013	(r1104)
+++ trunk/openbios-devel/config/examples/ppc_config.xml	Fri Apr  5 11:35:08 2013	(r1105)
@@ -26,6 +26,7 @@
   <option name="CONFIG_VGA_DEPTH" type="integer" value="8"/>
   <option name="CONFIG_LOADER_AOUT" type="boolean" value="false"/>
   <option name="CONFIG_LOADER_BOOTINFO" type="boolean" value="true"/>
+  <option name="CONFIG_LOADER_BOOTCODE" type="boolean" value="true"/>  
   <option name="CONFIG_LOADER_ELF" type="boolean" value="true"/>
   <option name="CONFIG_LOADER_FCODE" type="boolean" value="false"/>
   <option name="CONFIG_LOADER_FORTH" type="boolean" value="false"/>

Modified: trunk/openbios-devel/forth/debugging/client.fs
==============================================================================
--- trunk/openbios-devel/forth/debugging/client.fs	Thu Apr  4 13:26:41 2013	(r1104)
+++ trunk/openbios-devel/forth/debugging/client.fs	Fri Apr  5 11:35:08 2013	(r1105)
@@ -27,6 +27,9 @@
 variable state-valid
 0 state-valid !
 
+variable want-bootcode
+0 want-bootcode !
+
 variable file-size
 
 : !load-size file-size ! ;
@@ -44,6 +47,7 @@
 5  constant aout
 10 constant fcode
 11 constant forth
+12 constant bootcode
 
 
 : init-program    ( -- )

Added: trunk/openbios-devel/include/libopenbios/bootcode_load.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/openbios-devel/include/libopenbios/bootcode_load.h	Fri Apr  5 11:35:08 2013	(r1105)
@@ -0,0 +1,22 @@
+/*
+ *   Creation Date: <2010/03/22 18:00:00 mcayland>
+ *   Time-stamp: <2010/03/22 18:00:00 mcayland>
+ *
+ *	<bootcode_load.h>
+ *
+ *	Raw bootcode (%BOOT) loader
+ *
+ *   Copyright (C) 2013 Mark Cave-Ayland (mark.cave-ayland at ilande.co.uk)
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation
+ *
+ */
+
+#ifndef _H_BOOTCODELOAD
+#define _H_BOOTCODELOAD
+
+extern int bootcode_load(ihandle_t dev);
+
+#endif   /* _H__H_BOOTCODELOAD */

Added: trunk/openbios-devel/libopenbios/bootcode_load.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/openbios-devel/libopenbios/bootcode_load.c	Fri Apr  5 11:35:08 2013	(r1105)
@@ -0,0 +1,71 @@
+/* 
+ * Raw bootcode loader (CHRP/Apple %BOOT)
+ * Written by Mark Cave-Ayland 2013
+ */
+
+#include "config.h"
+#include "kernel/kernel.h"
+#include "libopenbios/bindings.h"
+#include "libopenbios/bootcode_load.h"
+#include "libc/diskio.h"
+#include "drivers/drivers.h"
+#define printf printk
+#define debug printk
+
+#define OLDWORLD_BOOTCODE_BASEADDR	(0x3f4000)
+
+int 
+bootcode_load(ihandle_t dev)
+{
+    int retval = -1, count = 0, fd;
+    unsigned long bootcode, loadbase, offset;
+
+    /* Mark the saved-program-state as invalid */
+    feval("0 state-valid !");
+
+    fd = open_ih(dev);
+    if (fd == -1) {
+        goto out;
+    }
+
+    /* Default to loading at load-base */
+    fword("load-base");
+    loadbase = POP();
+    
+#ifdef CONFIG_PPC
+    /* However Old World Macs need to load to a different address */
+    if (is_oldworld()) {
+        loadbase = OLDWORLD_BOOTCODE_BASEADDR;
+    }
+#endif
+    
+    bootcode = loadbase;
+    offset = 0;
+    
+    while(1) {
+        if (seek_io(fd, offset) == -1)
+            break;
+        count = read_io(fd, (void *)bootcode, 512);
+        offset += count;
+        bootcode += count;
+    }
+
+    /* If we didn't read anything then exit */
+    if (!count) {
+        goto out;
+    }
+    
+    /* Initialise saved-program-state */
+    PUSH(loadbase);
+    feval("saved-program-state >sps.entry !");
+    PUSH(offset);
+    feval("saved-program-state >sps.file-size !");
+    feval("bootcode saved-program-state >sps.file-type !");
+
+    feval("-1 state-valid !");
+
+out:
+    close_io(fd);
+    return retval;
+}
+

Modified: trunk/openbios-devel/libopenbios/build.xml
==============================================================================
--- trunk/openbios-devel/libopenbios/build.xml	Thu Apr  4 13:26:41 2013	(r1104)
+++ trunk/openbios-devel/libopenbios/build.xml	Fri Apr  5 11:35:08 2013	(r1105)
@@ -3,6 +3,7 @@
  <library name="openbios" type="static" target="target">
   <object source="aout_load.c" condition="LOADER_AOUT"/>
   <object source="bindings.c"/>
+  <object source="bootcode_load.c" condition="LOADER_BOOTCODE"/>
   <object source="bootinfo_load.c" condition="LOADER_BOOTINFO"/>
   <object source="client.c"/>
   <object source="console_common.c"/>

Modified: trunk/openbios-devel/libopenbios/load.c
==============================================================================
--- trunk/openbios-devel/libopenbios/load.c	Thu Apr  4 13:26:41 2013	(r1104)
+++ trunk/openbios-devel/libopenbios/load.c	Fri Apr  5 11:35:08 2013	(r1105)
@@ -36,6 +36,10 @@
 #include "libopenbios/forth_load.h"
 #endif
 
+#ifdef CONFIG_LOADER_BOOTCODE
+#include "libopenbios/bootcode_load.h"
+#endif
+
 
 struct sys_info sys_info;
 void *elf_boot_notes = NULL;
@@ -92,4 +96,13 @@
         }
 #endif
 
+#ifdef CONFIG_LOADER_BOOTCODE
+	/* Check for a "raw" %BOOT bootcode payload */
+	feval("want-bootcode @");
+	valid = POP();
+	if (valid) {
+                bootcode_load(dev);
+	}
+#endif
+
 }

Modified: trunk/openbios-devel/packages/mac-parts.c
==============================================================================
--- trunk/openbios-devel/packages/mac-parts.c	Thu Apr  4 13:26:41 2013	(r1104)
+++ trunk/openbios-devel/packages/mac-parts.c	Fri Apr  5 11:35:08 2013	(r1105)
@@ -89,8 +89,12 @@
 		    parnum = atol(parstr);
 
 		/* Detect if we are looking for the bootcode */
-		if (strcmp(argstr, "%BOOT") == 0)
+		if (strcmp(argstr, "%BOOT") == 0) {
 		    want_bootcode = 1;
+		    feval("1 want-bootcode !");
+		} else {
+		    feval("0 want-bootcode !");
+		}
 	}
 
 	DPRINTF("parstr: %s  argstr: %s  parnum: %d\n", parstr, argstr, parnum);
@@ -285,16 +289,10 @@
 			
 			set_property(chosen_ph, "bootpath", bootpath, strlen(bootpath) + 1);
 		    }
-		    
-		    /* If the filename was %BOOT then it's not a real filename, so clear argstr before
-		    attempting interpose */
-		    if (want_bootcode) {
-			    argstr = strdup("");
-		    }
-		    
+		
 		    /* If we have been asked to open a particular file, interpose the filesystem package with 
 		    the passed filename as an argument */
-		    if (strlen(argstr)) {
+		    if (!want_bootcode && strlen(argstr)) {
 			    push_str( argstr );
 			    PUSH_ph( ph );
 			    fword("interpose");



More information about the OpenBIOS mailing list