1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
/*
* Creation Date: <2003/10/25 14:07:17 samuel>
* Time-stamp: <2004/08/28 17:48:19 stepan>
*
* <kernel.c>
*
* Copyright (C) 2003, 2004 Samuel Rydh (samuel@ibrium.se)
* Copyright (C) 2003, 2004 Stefan Reinauer
*
* Based upon unix.c (from OpenBIOS):
*
* Copyright (C) 2003 Patrick Mauritz, Stefan Reinauer
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2
*
*/
#include "config.h"
#include "dict.h"
#include "libopenbios/bindings.h"
#include "kernel/stack.h"
#include "kernel/kernel.h"
#include "libc/string.h"
#include "kernel.h"
#define MEMORY_SIZE (256*1024) /* 256K ram for hosted system */
#define DICTIONARY_SIZE (512*1024) /* 512K for the dictionary */
static ucell *memory;
/************************************************************************/
/* F U N C T I O N S */
/************************************************************************/
int
forth_segv_handler( char *segv_addr )
{
ucell addr = 0xdeadbeef;
if( PC >= (ucell) dict && PC <= (ucell) dict + dicthead )
addr = *(ucell *) PC;
printk("panic: segmentation violation at %x\n", (int)segv_addr);
printk("dict=0x%x here=0x%x(dict+0x%x) pc=0x%x(dict+0x%x)\n",
(int)dict, (int)(dict + dicthead), dicthead,
PC, PC - (ucell) dict);
printk("dstackcnt=%d rstackcnt=%d instruction=%x\n",
dstackcnt, rstackcnt, addr);
#ifdef DEBUG_DSTACK
printdstack();
#endif
#ifdef DEBUG_RSTACK
printrstack();
#endif
return -1;
}
/*
* allocate memory and prepare engine for memory management.
*/
static void
init_memory( void )
{
memory = malloc(MEMORY_SIZE);
if( !memory )
panic("panic: not enough memory on host system.\n");
/* we push start and end of memory to the stack
* so that it can be used by the forth word QUIT
* to initialize the memory allocator
*/
PUSH( (ucell)memory );
PUSH( (ucell)memory + MEMORY_SIZE );
}
int
initialize_forth( void )
{
dict = malloc(DICTIONARY_SIZE);
load_dictionary( forth_dictionary, sizeof(forth_dictionary) );
forth_init();
PUSH_xt( bind_noname_func(arch_of_init) );
fword("PREPOST-initializer");
PC = (ucell)findword("initialize-of");
if( PC ) {
init_memory();
enterforth((xt_t)PC);
free( memory );
}
free( dict );
return 0;
}
|