mirror of
https://gitlab.com/qemu-project/openbios.git
synced 2024-02-13 08:34:06 +08:00
included and built as part of the SPARC64 and SPARC32 builds, it was never actually invoked in the boot sequence. Hence this patch maintains the existing behaviour in that only X86 builds included the Forth loader. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@siriusit.co.uk> git-svn-id: svn://coreboot.org/openbios/trunk/openbios-devel@712 f158a5a8-5612-0410-a976-696ce0be7e32
76 lines
1.7 KiB
C
76 lines
1.7 KiB
C
/* tag: forth source loader
|
|
*
|
|
* Copyright (C) 2004 Stefan Reinauer
|
|
*
|
|
* See the file "COPYING" for further information about
|
|
* the copyright and warranty status of this work.
|
|
*/
|
|
|
|
#include "config.h"
|
|
#include "kernel/kernel.h"
|
|
#include "libopenbios/bindings.h"
|
|
#include "libopenbios/sys_info.h"
|
|
#include "libc/diskio.h"
|
|
#include "libopenbios/forth_load.h"
|
|
#define printk printk
|
|
#define debug printk
|
|
|
|
static int fd;
|
|
|
|
static char *forthtext=NULL;
|
|
int forth_load(const char *filename)
|
|
{
|
|
char magic[2];
|
|
unsigned long forthsize;
|
|
int retval = -1;
|
|
|
|
/* Mark the saved-program-state as invalid */
|
|
feval("0 state-valid !");
|
|
|
|
fd = open_io(filename);
|
|
if (!fd)
|
|
goto out;
|
|
|
|
if (read_io(fd, magic, 2) != 2) {
|
|
debug("Can't read magic header\n");
|
|
retval = LOADER_NOT_SUPPORT;
|
|
goto out;
|
|
}
|
|
|
|
if (magic[0] != '\\' || magic[1] != ' ') {
|
|
debug("No forth source image\n");
|
|
retval = LOADER_NOT_SUPPORT;
|
|
goto out;
|
|
}
|
|
|
|
/* Calculate the file size by seeking to the end of the file */
|
|
seek_io(fd, -1);
|
|
forthsize = tell(fd);
|
|
forthtext = malloc(forthsize+1);
|
|
seek_io(fd, 0);
|
|
|
|
printk("Loading forth source ...");
|
|
if ((size_t)read_io(fd, forthtext, forthsize) != forthsize) {
|
|
printk("Can't read forth text\n");
|
|
goto out;
|
|
}
|
|
forthtext[forthsize]=0;
|
|
printk("ok\n");
|
|
|
|
// Initialise saved-program-state
|
|
PUSH((ucell)forthtext);
|
|
feval("saved-program-state >sps.entry !");
|
|
PUSH((ucell)forthsize);
|
|
feval("saved-program-state >sps.file-size !");
|
|
feval("forth saved-program-state >sps.file-type !");
|
|
|
|
feval("-1 state-valid !");
|
|
|
|
retval=0;
|
|
|
|
out:
|
|
//if (forthtext)
|
|
// free(forthtext);
|
|
return retval;
|
|
}
|