[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