Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / openbios / arch / x86 / openbios.c
diff --git a/qemu/roms/openbios/arch/x86/openbios.c b/qemu/roms/openbios/arch/x86/openbios.c
new file mode 100644 (file)
index 0000000..6145436
--- /dev/null
@@ -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;
+}