[prev in list] [next in list] [prev in thread] [next in thread]
List: openbios
Subject: [OpenBIOS] [commit] r709 - in trunk/openbios-devel: arch/sparc32
From: repository service <svn () openbios ! org>
Date: 2010-03-26 22:33:50
Message-ID: E1NvI6A-00056r-Qq () ra ! coresystems ! de
[Download RAW message or body]
Author: mcayland
Date: Fri Mar 26 23:33:50 2010
New Revision: 709
URL: http://tracker.coreboot.org/trac/openbios/changeset/709
Log:
Switch the loaders for x86, sparc64 and sparc32 over to use the new \
saved-program-state in boot() rather than try to execute the device payload \
directly. This is the first stage in isolating the OF "load" and "go" words, and in \
preparation for moving the majority of the loaders into libopenbios.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>
Modified:
trunk/openbios-devel/arch/sparc32/aoutload.c
trunk/openbios-devel/arch/sparc32/boot.c
trunk/openbios-devel/arch/sparc32/elfload.c
trunk/openbios-devel/arch/sparc32/forthload.c
trunk/openbios-devel/arch/sparc64/aoutload.c
trunk/openbios-devel/arch/sparc64/boot.c
trunk/openbios-devel/arch/sparc64/elfload.c
trunk/openbios-devel/arch/sparc64/fcodeload.c
trunk/openbios-devel/arch/sparc64/forthload.c
trunk/openbios-devel/arch/x86/boot.c
trunk/openbios-devel/arch/x86/elfload.c
trunk/openbios-devel/arch/x86/forthload.c
trunk/openbios-devel/include/arch/sparc32/types.h
trunk/openbios-devel/include/arch/x86/types.h
Modified: trunk/openbios-devel/arch/sparc32/aoutload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc32/aoutload.c Fri Mar 26 22:17:32 2010 (r708)
+++ trunk/openbios-devel/arch/sparc32/aoutload.c Fri Mar 26 23:33:50 2010 (r709)
@@ -56,7 +56,6 @@
int aout_load(struct sys_info *info, const char *filename, const void *romvec)
{
int retval = -1;
- int image_retval;
struct exec ehdr;
unsigned long start, size;
unsigned int offset = 512;
@@ -134,18 +133,6 @@
feval("-1 state-valid !");
- printf("Jumping to entry point...\n");
-
-#if 1
- {
- int (*entry)(const void *romvec_ptr, int p2, int p3, int p4, int p5);
-
- entry = (void *) addr_fixup(start);
- image_retval = entry(romvec, 0, 0, 0, 0);
- }
-#endif
-
- printf("Image returned with return value %#x\n", image_retval);
retval = 0;
out:
Modified: trunk/openbios-devel/arch/sparc32/boot.c
==============================================================================
--- trunk/openbios-devel/arch/sparc32/boot.c Fri Mar 26 22:17:32 2010 (r708)
+++ trunk/openbios-devel/arch/sparc32/boot.c Fri Mar 26 23:33:50 2010 (r709)
@@ -4,7 +4,6 @@
#undef BOOTSTRAP
#include "config.h"
#include "libopenbios/bindings.h"
-#include "libopenbios/elfload.h"
#include "arch/common/nvram.h"
#include "drivers/drivers.h"
#include "libc/diskio.h"
@@ -19,25 +18,78 @@
uint32_t qemu_cmdline;
uint32_t cmdline_size;
char boot_device;
+int (*entry)(const void *romvec_ptr, int p2, int p3, int p4, int p5);
-static void try_path(const char *path, char *param, const void *romvec)
+static int try_path(const char *path, char *param, const void *romvec)
{
+ ucell valid, address, type, size;
+ int image_retval = 0;
+
push_str(path);
fword("pathres-resolve-aliases");
bootpath = pop_fstr_copy();
printk("Trying %s (%s)\n", path, bootpath);
- elf_load(&sys_info, path, param, romvec);
- linux_load(&sys_info, path, param);
- aout_load(&sys_info, path, romvec);
+ /* ELF Boot loader */
+ elf_load(&sys_info, path, param, romvec);
+ feval("state-valid @");
+ valid = POP();
+ if (valid)
+ goto start_image;
+
+ /* Linux loader (not using Forth) */
+ linux_load(&sys_info, path, param);
+
+ /* a.out loader */
+ aout_load(&sys_info, path, romvec);
+ feval("state-valid @");
+ valid = POP();
+ if (valid)
+ goto start_image;
+
+ return 0;
+
+
+start_image:
+ /* Get the entry point and the type (see forth/debugging/client.fs) */
+ feval("saved-program-state >sps.entry @");
+ address = POP();
+ feval("saved-program-state >sps.file-type @");
+ type = POP();
+ feval("saved-program-state >sps.file-size @");
+ size = POP();
+
+ printk("Jumping to entry point " FMT_ucellx " for type " FMT_ucellx "...\n", \
address, type); +
+ switch (type) {
+ case 0x0:
+ /* Start ELF boot image */
+ entry = (void *) address;
+ image_retval = entry(romvec, 0, 0, 0, 0);
+
+ break;
+
+ case 0x5:
+ /* Start a.out image */
+ entry = (void *) address;
+ image_retval = entry(romvec, 0, 0, 0, 0);
+
+ break;
+ }
+
+ printk("Image returned with return value %#x\n", image_retval);
+
+ return -1;
}
+
void boot(void)
{
char *path = pop_fstr_copy(), *param, altpath[256];
const char *oldpath = path;
int unit = 0;
const void *romvec;
+ int result;
if(!path) {
push_str("boot-device");
@@ -102,8 +154,6 @@
romvec = init_openprom();
if (kernel_size) {
- int (*entry)(const void *romvec_ptr, int p2, int p3, int p4, int p5);
-
printk("[sparc] Kernel already loaded\n");
entry = (void *) kernel_image;
entry(romvec, 0, 0, 0, 0);
@@ -115,17 +165,19 @@
else
printk("without parameters.\n");
- try_path(path, param, romvec);
-
- push_str(path);
- PUSH(':');
- fword("left-split");
- snprintf(altpath, sizeof(altpath), "%s:d", pop_fstr_copy());
- POP();
- POP();
+ result = try_path(path, param, romvec);
+ if (!result) {
+ push_str(path);
+ PUSH(':');
+ fword("left-split");
+ snprintf(altpath, sizeof(altpath), "%s:d", pop_fstr_copy());
+ POP();
+ POP();
+
+ try_path(altpath, param, romvec);
+ }
- try_path(altpath, param, romvec);
- printk("Unsupported image format\n");
+ printk("Unsupported image format\n");
free(path);
}
Modified: trunk/openbios-devel/arch/sparc32/elfload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc32/elfload.c Fri Mar 26 22:17:32 2010 (r708)
+++ trunk/openbios-devel/arch/sparc32/elfload.c Fri Mar 26 23:33:50 2010 (r709)
@@ -312,7 +312,6 @@
unsigned short checksum = 0;
Elf_Bhdr *boot_notes = NULL;
int retval = -1;
- int image_retval;
unsigned int offset;
image_name = image_version = NULL;
@@ -394,21 +393,6 @@
feval("-1 state-valid !");
- printf("Jumping to entry point...\n");
-
-#if 1
- {
- int (*entry)(const void *romvec_ptr, int p2, int p3, int p4, int p5);
-
- entry = (void *) addr_fixup(ehdr.e_entry);
- image_retval = entry(romvec, 0, 0, 0, 0);
- }
-#else
- image_retval = start_elf(addr_fixup(ehdr.e_entry), virt_to_phys(boot_notes));
-#endif
-
- // console_init(); FIXME
- printf("Image returned with return value %#x\n", image_retval);
retval = 0;
out:
Modified: trunk/openbios-devel/arch/sparc32/forthload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc32/forthload.c Fri Mar 26 22:17:32 2010 (r708)
+++ trunk/openbios-devel/arch/sparc32/forthload.c Fri Mar 26 23:33:50 2010 (r709)
@@ -68,9 +68,6 @@
feval("-1 state-valid !");
- PUSH ( (ucell)forthtext );
- PUSH ( (ucell)forthsize );
- fword("eval2");
retval=0;
out:
Modified: trunk/openbios-devel/arch/sparc64/aoutload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc64/aoutload.c Fri Mar 26 22:17:32 2010 (r708)
+++ trunk/openbios-devel/arch/sparc64/aoutload.c Fri Mar 26 23:33:50 2010 (r709)
@@ -57,7 +57,6 @@
int aout_load(struct sys_info *info, const char *filename)
{
int retval = -1;
- int image_retval;
struct exec ehdr;
unsigned long start, size;
unsigned int offset;
@@ -138,14 +137,6 @@
feval("-1 state-valid !");
- printf("Jumping to entry point...\n");
-
- {
- extern int sparc64_of_client_interface( int *params );
- image_retval = start_client_image(addr_fixup(start), \
(uint64_t)&sparc64_of_client_interface);
- }
-
- printf("Image returned with return value %#x\n", image_retval);
retval = 0;
out:
Modified: trunk/openbios-devel/arch/sparc64/boot.c
==============================================================================
--- trunk/openbios-devel/arch/sparc64/boot.c Fri Mar 26 22:17:32 2010 (r708)
+++ trunk/openbios-devel/arch/sparc64/boot.c Fri Mar 26 23:33:50 2010 (r709)
@@ -4,7 +4,6 @@
#undef BOOTSTRAP
#include "config.h"
#include "libopenbios/bindings.h"
-#include "libopenbios/elfload.h"
#include "arch/common/nvram.h"
#include "libc/diskio.h"
#include "libc/vsprintf.h"
@@ -17,16 +16,88 @@
uint64_t qemu_cmdline;
uint64_t cmdline_size;
char boot_device;
+extern int sparc64_of_client_interface( int *params );
+
+
+static int try_path(const char *path, char *param)
+{
+ void *boot_notes = NULL;
+ ucell valid, address, type, size;
+ int image_retval = 0;
+
+ /* ELF Boot loader */
+ elf_load(&sys_info, path, param);
+ feval("state-valid @");
+ valid = POP();
+ if (valid)
+ goto start_image;
+
+ /* Linux loader (not using Forth) */
+ linux_load(&sys_info, path, param);
+
+ /* a.out loader */
+ aout_load(&sys_info, path);
+ feval("state-valid @");
+ valid = POP();
+ if (valid)
+ goto start_image;
+
+ /* Fcode loader */
+ fcode_load(path);
+ feval("state-valid @");
+ valid = POP();
+ if (valid)
+ goto start_image;
+
+ return 0;
+
+
+start_image:
+ /* Get the entry point and the type (see forth/debugging/client.fs) */
+ feval("saved-program-state >sps.entry @");
+ address = POP();
+ feval("saved-program-state >sps.file-type @");
+ type = POP();
+ feval("saved-program-state >sps.file-size @");
+ size = POP();
+
+ printk("Jumping to entry point " FMT_ucellx " for type " FMT_ucellx "...\n", \
address, type); +
+ switch (type) {
+ case 0x0:
+ /* Start ELF boot image */
+ image_retval = start_elf(address, (uint64_t)boot_notes);
+ break;
+
+ case 0x5:
+ /* Start a.out image */
+ image_retval = start_client_image(address, \
(uint64_t)&sparc64_of_client_interface); + break;
+
+ case 0x10:
+ /* Start Fcode image */
+ printk("Evaluating FCode...\n");
+ PUSH(address);
+ PUSH(1);
+ fword("byte-load");
+ image_retval = 0;
+ break;
+ }
+
+ printk("Image returned with return value %#x\n", image_retval);
+
+ return -1;
+}
void boot(void)
{
char *path=pop_fstr_copy(), *param;
char altpath[256];
+ int result;
if (kernel_size) {
void (*entry)(unsigned long p1, unsigned long p2, unsigned long p3,
- unsigned long p4, unsigned long p5);
- extern int sparc64_of_client_interface( int *params );
+ unsigned long p4, unsigned long p5);;
printk("[sparc64] Kernel already loaded\n");
entry = (void *) (unsigned long)kernel_image;
@@ -82,24 +153,13 @@
else
printk("without parameters.\n");
+ result = try_path(path, param);
+ if (!result) {
+ snprintf(altpath, sizeof(altpath), "%s:f", path);
+ try_path(altpath, param);
+ }
- 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) == LOADER_NOT_SUPPORT)
- if (fcode_load(path) == LOADER_NOT_SUPPORT) {
-
- snprintf(altpath, sizeof(altpath), "%s:f", 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)
- == LOADER_NOT_SUPPORT)
- if (fcode_load(altpath)
- == LOADER_NOT_SUPPORT)
- printk("Unsupported image format\n");
- }
+ printk("Unsupported image format\n");
free(path);
}
Modified: trunk/openbios-devel/arch/sparc64/elfload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc64/elfload.c Fri Mar 26 22:17:32 2010 (r708)
+++ trunk/openbios-devel/arch/sparc64/elfload.c Fri Mar 26 23:33:50 2010 (r709)
@@ -311,7 +311,6 @@
unsigned short checksum = 0;
Elf_Bhdr *boot_notes = NULL;
int retval = -1;
- int image_retval;
unsigned int offset;
image_name = image_version = NULL;
@@ -393,27 +392,6 @@
feval("-1 state-valid !");
- printf("Jumping to entry point...\n");
-
-#if 0
- {
- extern unsigned int qemu_mem_size;
- extern char boot_device;
- void *init_openprom(unsigned long memsize, const char *cmdline, char \
boot_device);
-
- int (*entry)(const void *romvec, int p2, int p3, int p4, int p5);
- const void *romvec;
-
- romvec = init_openprom(qemu_mem_size, cmdline, boot_device);
- entry = (void *) addr_fixup(ehdr.e_entry);
- image_retval = entry(romvec, 0, 0, 0, 0);
- }
-#else
- image_retval = start_elf(addr_fixup(ehdr.e_entry), virt_to_phys(boot_notes));
-#endif
-
- // console_init(); FIXME
- printf("Image returned with return value %#x\n", image_retval);
retval = 0;
out:
Modified: trunk/openbios-devel/arch/sparc64/fcodeload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc64/fcodeload.c Fri Mar 26 22:17:32 2010 (r708)
+++ trunk/openbios-devel/arch/sparc64/fcodeload.c Fri Mar 26 23:33:50 2010 (r709)
@@ -74,11 +74,7 @@
feval("saved-program-state >sps.file-size !");
feval("fcode saved-program-state >sps.file-type !");
- printf("Evaluating FCode...\n");
-
- PUSH(start);
- PUSH(1);
- fword("byte-load");
+ feval("-1 state-valid !");
retval = 0;
Modified: trunk/openbios-devel/arch/sparc64/forthload.c
==============================================================================
--- trunk/openbios-devel/arch/sparc64/forthload.c Fri Mar 26 22:17:32 2010 (r708)
+++ trunk/openbios-devel/arch/sparc64/forthload.c Fri Mar 26 23:33:50 2010 (r709)
@@ -68,9 +68,6 @@
feval("-1 state-valid !");
- PUSH ( (ucell)forthtext );
- PUSH ( (ucell)forthsize );
- fword("eval2");
retval=0;
out:
Modified: trunk/openbios-devel/arch/x86/boot.c
==============================================================================
--- trunk/openbios-devel/arch/x86/boot.c Fri Mar 26 22:17:32 2010 (r708)
+++ trunk/openbios-devel/arch/x86/boot.c Fri Mar 26 23:33:50 2010 (r709)
@@ -9,7 +9,6 @@
#undef BOOTSTRAP
#include "config.h"
#include "libopenbios/bindings.h"
-#include "libopenbios/elfload.h"
#include "arch/common/nvram.h"
#include "libc/diskio.h"
#include "libopenbios/sys_info.h"
@@ -17,6 +16,62 @@
struct sys_info sys_info;
+static int try_path(const char *path, char *param)
+{
+ ucell valid, address, type, size;
+ int image_retval = 0;;
+
+ /* ELF Boot loader */
+ elf_load(&sys_info, path, param);
+ feval("state-valid @");
+ valid = POP();
+ if (valid)
+ goto start_image;
+
+ /* Linux loader (not using Forth) */
+ linux_load(&sys_info, path, param);
+
+ /* Forth loader */
+ forth_load(&sys_info, path, param);
+ feval("state-valid @");
+ valid = POP();
+ if (valid)
+ goto start_image;
+
+ return 0;
+
+
+start_image:
+ /* Get the entry point and the type (see forth/debugging/client.fs) */
+ feval("saved-program-state >sps.entry @");
+ address = POP();
+ feval("saved-program-state >sps.file-type @");
+ type = POP();
+ feval("saved-program-state >sps.file-size @");
+ size = POP();
+
+ printk("Jumping to entry point " FMT_ucellx " for type " FMT_ucellx "...\n", \
address, type); +
+ switch (type) {
+ case 0x0:
+ /* Start ELF boot image */
+ image_retval = start_elf(address, (uint32_t)NULL);
+ break;
+
+ case 0x11:
+ /* Start Forth image */
+ PUSH(address);
+ PUSH(size);
+ fword("eval2");
+ image_retval = 0;
+ break;
+ }
+
+ printk("Image returned with return value %#x\n", image_retval);
+
+ return -1;
+}
+
void boot(void)
{
char *path=pop_fstr_copy(), *param;
@@ -34,15 +89,9 @@
printk("[x86] Booting file '%s' with parameters '%s'\n",path, param);
- if (elf_load(&sys_info, path, param) != LOADER_NOT_SUPPORT)
- goto loaded;
- if (linux_load(&sys_info, path, param) != LOADER_NOT_SUPPORT)
- goto loaded;
- if (forth_load(&sys_info, path, param) != LOADER_NOT_SUPPORT)
- goto loaded;
+ try_path(path, param);
printk("Unsupported image format\n");
-loaded:
free(path);
}
Modified: trunk/openbios-devel/arch/x86/elfload.c
==============================================================================
--- trunk/openbios-devel/arch/x86/elfload.c Fri Mar 26 22:17:32 2010 (r708)
+++ trunk/openbios-devel/arch/x86/elfload.c Fri Mar 26 23:33:50 2010 (r709)
@@ -313,7 +313,6 @@
unsigned short checksum = 0;
Elf_Bhdr *boot_notes = NULL;
int retval = -1;
- int image_retval;
image_name = image_version = NULL;
@@ -379,7 +378,7 @@
debug("entry point is %#x\n", ehdr.e_entry);
// Initialise saved-program-state
- PUSH(ehdr.e_entry);
+ PUSH(ehdr.e_entry & ADDRMASK);
feval("saved-program-state >sps.entry !");
PUSH(file_size);
feval("saved-program-state >sps.file-size !");
@@ -387,11 +386,6 @@
feval("-1 state-valid !");
- printk("Jumping to entry point...\n");
- image_retval = start_elf(ehdr.e_entry & ADDRMASK, virt_to_phys(boot_notes));
-
- // console_init(); FIXME
- printk("Image returned with return value %#x\n", image_retval);
retval = 0;
out:
Modified: trunk/openbios-devel/arch/x86/forthload.c
==============================================================================
--- trunk/openbios-devel/arch/x86/forthload.c Fri Mar 26 22:17:32 2010 (r708)
+++ trunk/openbios-devel/arch/x86/forthload.c Fri Mar 26 23:33:50 2010 (r709)
@@ -68,11 +68,6 @@
feval("-1 state-valid !");
- PUSH ( (ucell)forthtext );
- PUSH ( (ucell)forthsize );
- fword("eval2");
- retval=0;
-
out:
//if (forthtext)
// free(forthtext);
Modified: trunk/openbios-devel/include/arch/sparc32/types.h
==============================================================================
--- trunk/openbios-devel/include/arch/sparc32/types.h Fri Mar 26 22:17:32 2010 (r708)
+++ trunk/openbios-devel/include/arch/sparc32/types.h Fri Mar 26 23:33:50 2010 (r709)
@@ -35,6 +35,11 @@
typedef long long dcell;
typedef unsigned long long ducell;
+#define FMT_cell "%ld"
+#define FMT_ucell "%lu"
+#define FMT_ucellx "%08x"
+#define FMT_ucellX "%08X"
+
#define bitspercell (sizeof(cell)<<3)
#define bitsperdcell (sizeof(dcell)<<3)
Modified: trunk/openbios-devel/include/arch/x86/types.h
==============================================================================
--- trunk/openbios-devel/include/arch/x86/types.h Fri Mar 26 22:17:32 2010 (r708)
+++ trunk/openbios-devel/include/arch/x86/types.h Fri Mar 26 23:33:50 2010 (r709)
@@ -24,6 +24,11 @@
typedef int64_t dcell;
typedef uint64_t ducell;
+#define FMT_cell "%ld"
+#define FMT_ucell "%lu"
+#define FMT_ucellx "%08x"
+#define FMT_ucellX "%08X"
+
#define bitspercell (sizeof(cell)<<3)
#define bitsperdcell (sizeof(dcell)<<3)
--
OpenBIOS http://openbios.org/
Mailinglist: http://lists.openbios.org/mailman/listinfo
Free your System - May the Forth be with you
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic