88 lines
1.8 KiB
C
88 lines
1.8 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/initprogram.h"
|
|
#include "libopenbios/sys_info.h"
|
|
#include "libc/diskio.h"
|
|
#include "libopenbios/forth_load.h"
|
|
#define printk printk
|
|
#define debug printk
|
|
|
|
static int fd;
|
|
|
|
int is_forth(char *forth)
|
|
{
|
|
return (forth[0] == '\\' && forth[1] == ' ');
|
|
}
|
|
|
|
int forth_load(ihandle_t dev)
|
|
{
|
|
char magic[2];
|
|
unsigned long forthsize;
|
|
ucell *forthtext;
|
|
int retval = -1;
|
|
|
|
/* Mark the saved-program-state as invalid */
|
|
feval("0 state-valid !");
|
|
|
|
fd = open_ih(dev);
|
|
if (fd == -1) {
|
|
goto out;
|
|
}
|
|
|
|
if (read_io(fd, magic, 2) != 2) {
|
|
debug("Can't read magic header\n");
|
|
retval = LOADER_NOT_SUPPORT;
|
|
goto out;
|
|
}
|
|
|
|
if (!is_forth(magic)) {
|
|
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);
|
|
seek_io(fd, 0);
|
|
|
|
fword("load-base");
|
|
forthtext = (void *)POP();
|
|
|
|
printk("Loading forth source ...");
|
|
if ((size_t)read_io(fd, forthtext, forthsize) != forthsize) {
|
|
printk("Can't read forth text\n");
|
|
goto out;
|
|
}
|
|
forthtext[(forthsize / sizeof(ucell)) + 1]=0;
|
|
printk("ok\n");
|
|
|
|
// Initialise saved-program-state
|
|
PUSH((ucell)forthsize);
|
|
feval("load-state >ls.file-size !");
|
|
feval("forth load-state >ls.file-type !");
|
|
|
|
out:
|
|
return retval;
|
|
}
|
|
|
|
void
|
|
forth_init_program(void)
|
|
{
|
|
/* Use trampoline context to execute Forth */
|
|
PUSH((ucell)&init_forth_context);
|
|
feval("load-state >ls.entry !");
|
|
|
|
arch_init_program();
|
|
|
|
feval("-1 state-valid !");
|
|
}
|