[OpenBIOS] r213 - openbios-devel/arch/sparc64

svn at openbios.org svn at openbios.org
Mon Jul 21 09:50:53 CEST 2008


Author: blueswirl
Date: 2008-07-21 09:50:53 +0200 (Mon, 21 Jul 2008)
New Revision: 213

Added:
   openbios-devel/arch/sparc64/fcodeload.c
Modified:
   openbios-devel/arch/sparc64/boot.c
   openbios-devel/arch/sparc64/boot.h
   openbios-devel/arch/sparc64/build.xml
Log:
Add FCode boot loader for Solaris etc.

Modified: openbios-devel/arch/sparc64/boot.c
===================================================================
--- openbios-devel/arch/sparc64/boot.c	2008-07-21 07:48:11 UTC (rev 212)
+++ openbios-devel/arch/sparc64/boot.c	2008-07-21 07:50:53 UTC (rev 213)
@@ -68,15 +68,22 @@
 
 	if (elf_load(&sys_info, path, param) == LOADER_NOT_SUPPORT)
             if (linux_load(&sys_info, path, param) == LOADER_NOT_SUPPORT)
-                if (aout_load(&sys_info, path, param) == LOADER_NOT_SUPPORT) {
+                if (aout_load(&sys_info, path, param) == LOADER_NOT_SUPPORT)
+                    if (fcode_load(&sys_info, path, param)
+                        == LOADER_NOT_SUPPORT) {
 
-                    sprintf(altpath, "%s:d", path);
+                        sprintf(altpath, "%s:d", path);
 
-                    if (elf_load(&sys_info, altpath, param) == LOADER_NOT_SUPPORT)
-                        if (linux_load(&sys_info, altpath, param) == LOADER_NOT_SUPPORT)
-                            if (aout_load(&sys_info, altpath, param) == LOADER_NOT_SUPPORT)
-                                printk("Unsupported image format\n");
-                }
+                        if (elf_load(&sys_info, altpath, param)
+                            == LOADER_NOT_SUPPORT)
+                            if (linux_load(&sys_info, altpath, param)
+                                == LOADER_NOT_SUPPORT)
+                                if (aout_load(&sys_info, altpath, param)
+                                    == LOADER_NOT_SUPPORT)
+                                    if (fcode_load(&sys_info, path, param)
+                                        == LOADER_NOT_SUPPORT)
+                                        printk("Unsupported image format\n");
+                    }
 
 	free(path);
 }

Modified: openbios-devel/arch/sparc64/boot.h
===================================================================
--- openbios-devel/arch/sparc64/boot.h	2008-07-21 07:48:11 UTC (rev 212)
+++ openbios-devel/arch/sparc64/boot.h	2008-07-21 07:50:53 UTC (rev 213)
@@ -10,6 +10,8 @@
 int elf_load(struct sys_info *info, const char *filename, const char *cmdline);
 int linux_load(struct sys_info *info, const char *file, const char *cmdline);
 int aout_load(struct sys_info *info, const char *filename, const char *cmdline);
+int fcode_load(struct sys_info *info, const char *filename,
+               const char *cmdline);
 
 uint64_t start_elf(uint64_t entry_point, uint64_t param);
 

Modified: openbios-devel/arch/sparc64/build.xml
===================================================================
--- openbios-devel/arch/sparc64/build.xml	2008-07-21 07:48:11 UTC (rev 212)
+++ openbios-devel/arch/sparc64/build.xml	2008-07-21 07:50:53 UTC (rev 213)
@@ -17,6 +17,7 @@
   <object source="elfload.c"/>
   <object source="aoutload.c"/>
   <object source="forthload.c"/>
+  <object source="fcodeload.c"/>
   <object source="loadfs.c"/>
  </library>
 

Added: openbios-devel/arch/sparc64/fcodeload.c
===================================================================
--- openbios-devel/arch/sparc64/fcodeload.c	                        (rev 0)
+++ openbios-devel/arch/sparc64/fcodeload.c	2008-07-21 07:50:53 UTC (rev 213)
@@ -0,0 +1,76 @@
+/*
+ * FCode boot loader
+ */
+
+#include "openbios/config.h"
+#include "openbios/kernel.h"
+#include "openbios/bindings.h"
+#include "sys_info.h"
+#include "loadfs.h"
+#include "boot.h"
+#define printf printk
+#define debug printk
+
+int fcode_load(struct sys_info *info, const char *filename,
+               const char *cmdline)
+{
+    int retval = -1;
+    uint8_t fcode_header[8];
+    unsigned long start, size;
+    unsigned int offset;
+
+    if (!file_open(filename))
+        goto out;
+
+    for (offset = 0; offset < 16 * 512; offset += 512) {
+        file_seek(offset);
+        if (lfile_read(&fcode_header, sizeof(fcode_header))
+            != sizeof(fcode_header)) {
+            debug("Can't read FCode header from file %s\n", filename);
+            retval = LOADER_NOT_SUPPORT;
+            goto out;
+        }
+        switch (fcode_header[0]) {
+        case 0xf0: // start0
+        case 0xf1: // start1
+        case 0xf2: // start2
+        case 0xf3: // start4
+        case 0xfd: // version1
+            goto found;
+        }
+    }
+
+    debug("Not a bootable FCode image\n");
+    retval = LOADER_NOT_SUPPORT;
+    goto out;
+
+ found:
+    size = (fcode_header[4] << 24) | (fcode_header[5] << 16) |
+        (fcode_header[6] << 8) | fcode_header[7];
+
+    start = 0x4000;
+
+    printf("Loading FCode image...\n");
+
+    file_seek(offset + sizeof(fcode_header));
+
+    if ((unsigned long)lfile_read((void *)start, size) != size) {
+        printf("Can't read file (size 0x%lx)\n", size);
+        goto out;
+    }
+
+    debug("Loaded %lu bytes\n", size);
+
+    debug("entry point is %#lx\n", start);
+    printf("Evaluating FCode...\n");
+
+    PUSH(start);
+    PUSH(1);
+    fword("byte-load");
+
+    retval = 0;
+
+out:
+    file_close();
+    return retval;
+}




More information about the OpenBIOS mailing list