summaryrefslogtreecommitdiffstats
path: root/qemu/roms/openbios/arch/x86/openbios.c
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/roms/openbios/arch/x86/openbios.c')
-rw-r--r--qemu/roms/openbios/arch/x86/openbios.c134
1 files changed, 134 insertions, 0 deletions
diff --git a/qemu/roms/openbios/arch/x86/openbios.c b/qemu/roms/openbios/arch/x86/openbios.c
new file mode 100644
index 000000000..6145436f4
--- /dev/null
+++ b/qemu/roms/openbios/arch/x86/openbios.c
@@ -0,0 +1,134 @@
+/* tag: openbios forth environment, executable code
+ *
+ * Copyright (C) 2003 Patrick Mauritz, Stefan Reinauer
+ *
+ * See the file "COPYING" for further information about
+ * the copyright and warranty status of this work.
+ */
+
+#include "config.h"
+#include "libopenbios/openbios.h"
+#include "libopenbios/bindings.h"
+#include "libopenbios/console.h"
+#include "asm/types.h"
+#include "dict.h"
+#include "kernel/kernel.h"
+#include "kernel/stack.h"
+#include "drivers/drivers.h"
+#include "drivers/pci.h"
+#include "libopenbios/sys_info.h"
+#include "libopenbios/video.h"
+#include "openbios.h"
+#include "relocate.h"
+#include "boot.h"
+
+void collect_sys_info(struct sys_info *info);
+
+#ifdef CONFIG_DRIVER_PCI
+static const pci_arch_t default_pci_host = {
+ .name = "Intel,i440FX",
+ .vendor_id = PCI_VENDOR_ID_INTEL,
+ .device_id = PCI_DEVICE_ID_INTEL_82441,
+ .io_base = 0x1000,
+};
+#endif
+
+static void init_memory(void)
+{
+ /* push start and end of available memory to the stack
+ * so that the forth word QUIT can initialize memory
+ * management. For now we use hardcoded memory between
+ * 0x10000 and 0x9ffff (576k). If we need more memory
+ * than that we have serious bloat.
+ */
+
+ PUSH(0x10000);
+ PUSH(0x9FFFF);
+}
+
+static void
+arch_init( void )
+{
+ openbios_init();
+ modules_init();
+#ifdef CONFIG_DRIVER_PCI
+ arch = &default_pci_host;
+ ob_pci_init();
+#endif
+#ifdef CONFIG_DRIVER_IDE
+ setup_timers();
+ ob_ide_init("/pci/isa", 0x1f0, 0x3f6, 0x170, 0x376);
+#endif
+#ifdef CONFIG_DRIVER_FLOPPY
+ ob_floppy_init("/isa", "floppy0", 0x3f0, 0);
+#endif
+#ifdef CONFIG_XBOX
+ setup_video();
+
+ /* Force video to 32-bit depth */
+ VIDEO_DICT_VALUE(video.depth) = 32;
+
+ init_video();
+ node_methods_init();
+#endif
+ device_end();
+ bind_func("platform-boot", boot );
+ bind_func("(go)", go );
+}
+
+extern struct _console_ops arch_console_ops;
+
+int openbios(void)
+{
+#ifdef CONFIG_DEBUG_CONSOLE
+ init_console(arch_console_ops);
+#ifdef CONFIG_DEBUG_CONSOLE_SERIAL
+ uart_init(CONFIG_SERIAL_PORT, CONFIG_SERIAL_SPEED);
+#endif
+ /* Clear the screen. */
+ cls();
+#endif
+
+ collect_sys_info(&sys_info);
+
+ dict = (unsigned char *)sys_info.dict_start;
+ dicthead = (cell)sys_info.dict_end;
+ last = sys_info.dict_last;
+ dictlimit = sys_info.dict_limit;
+
+ forth_init();
+
+ relocate(&sys_info);
+
+#ifdef CONFIG_DEBUG_CONSOLE_VGA
+ video_init();
+#endif
+#ifdef CONFIG_DEBUG_BOOT
+ printk("forth started.\n");
+ printk("initializing memory...");
+#endif
+
+ init_memory();
+
+#ifdef CONFIG_DEBUG_BOOT
+ printk("done\n");
+#endif
+
+ PUSH_xt( bind_noname_func(arch_init) );
+ fword("PREPOST-initializer");
+
+ PC = (ucell)findword("initialize-of");
+
+ if (!PC) {
+ printk("panic: no dictionary entry point.\n");
+ return -1;
+ }
+#ifdef CONFIG_DEBUG_DICTIONARY
+ printk("done (%d bytes).\n", dicthead);
+ printk("Jumping to dictionary...\n");
+#endif
+
+ enterforth((xt_t)PC);
+
+ return 0;
+}