diff options
Diffstat (limited to 'qemu/roms/openbios/arch/x86/openbios.c')
-rw-r--r-- | qemu/roms/openbios/arch/x86/openbios.c | 134 |
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; +} |