|
|
1.1 root 1: /* tag: openbios forth environment, executable code
2: *
3: * Copyright (C) 2003 Patrick Mauritz, Stefan Reinauer
4: *
5: * See the file "COPYING" for further information about
6: * the copyright and warranty status of this work.
7: */
8:
9: #include "config.h"
10: #include "libopenbios/openbios.h"
11: #include "libopenbios/bindings.h"
12: #include "asm/types.h"
13: #include "dict.h"
14: #include "kernel/kernel.h"
15: #include "kernel/stack.h"
16: #include "drivers/drivers.h"
17: #include "drivers/pci.h"
18: #include "libopenbios/sys_info.h"
19: #include "openbios.h"
20: #include "relocate.h"
21: #include "boot.h"
22:
23: void collect_sys_info(struct sys_info *info);
24:
25: #ifdef CONFIG_DRIVER_PCI
26: static const pci_arch_t default_pci_host = {
27: .name = "Intel,i440FX",
28: .vendor_id = PCI_VENDOR_ID_INTEL,
29: .device_id = PCI_DEVICE_ID_INTEL_82441,
30: .io_base = 0x1000,
31: };
32: #endif
33:
34: static void init_memory(void)
35: {
36: /* push start and end of available memory to the stack
37: * so that the forth word QUIT can initialize memory
38: * management. For now we use hardcoded memory between
39: * 0x10000 and 0x9ffff (576k). If we need more memory
40: * than that we have serious bloat.
41: */
42:
43: PUSH(0x10000);
44: PUSH(0x9FFFF);
45: }
46:
47: static void
48: arch_init( void )
49: {
50: openbios_init();
51: modules_init();
52: #ifdef CONFIG_DRIVER_PCI
53: arch = &default_pci_host;
54: ob_pci_init();
55: #endif
56: #ifdef CONFIG_DRIVER_IDE
57: setup_timers();
58: ob_ide_init("/pci/isa", 0x1f0, 0x3f4, 0x170, 0x374);
59: #endif
60: #ifdef CONFIG_DRIVER_FLOPPY
61: ob_floppy_init("/isa", "floppy0", 0x3f0, 0);
62: #endif
63: #ifdef CONFIG_XBOX
64: init_video(phys_to_virt(0x3C00000), 640, 480, 32, 2560);
65: node_methods_init();
66: #endif
67: device_end();
68: bind_func("platform-boot", boot );
69: bind_func("(go)", go );
70: }
71:
72: int openbios(void)
73: {
74: #ifdef CONFIG_DEBUG_CONSOLE
75: #ifdef CONFIG_DEBUG_CONSOLE_SERIAL
76: uart_init(CONFIG_SERIAL_PORT, CONFIG_SERIAL_SPEED);
77: #endif
78: /* Clear the screen. */
79: cls();
80: #endif
81:
82: collect_sys_info(&sys_info);
83:
84: dict = (unsigned char *)sys_info.dict_start;
85: dicthead = (cell)sys_info.dict_end;
86: last = sys_info.dict_last;
87: dictlimit = sys_info.dict_limit;
88:
89: forth_init();
90:
91: relocate(&sys_info);
92:
93: #ifdef CONFIG_DEBUG_CONSOLE_VGA
94: video_init();
95: #endif
96: #ifdef CONFIG_DEBUG_BOOT
97: printk("forth started.\n");
98: printk("initializing memory...");
99: #endif
100:
101: init_memory();
102:
103: #ifdef CONFIG_DEBUG_BOOT
104: printk("done\n");
105: #endif
106:
107: PUSH_xt( bind_noname_func(arch_init) );
108: fword("PREPOST-initializer");
109:
110: PC = (ucell)findword("initialize-of");
111:
112: if (!PC) {
113: printk("panic: no dictionary entry point.\n");
114: return -1;
115: }
116: #ifdef CONFIG_DEBUG_DICTIONARY
117: printk("done (%d bytes).\n", dicthead);
118: printk("Jumping to dictionary...\n");
119: #endif
120:
121: enterforth((xt_t)PC);
122:
123: return 0;
124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.