| /* tag: openbios boot command for x86 |
| * |
| * Copyright (C) 2003-2004 Stefan Reinauer |
| * |
| * See the file "COPYING" for further information about |
| * the copyright and warranty status of this work. |
| */ |
| |
| #undef BOOTSTRAP |
| #include "config.h" |
| #include "libopenbios/bindings.h" |
| #include "arch/common/nvram.h" |
| #include "libc/diskio.h" |
| #include "libopenbios/sys_info.h" |
| #include "boot.h" |
| |
| void go(void) |
| { |
| ucell address, type, size; |
| int image_retval = 0; |
| |
| /* Get the entry point and the type (see forth/debugging/client.fs) */ |
| feval("saved-program-state >sps.entry @"); |
| address = POP(); |
| feval("saved-program-state >sps.file-type @"); |
| type = POP(); |
| feval("saved-program-state >sps.file-size @"); |
| size = POP(); |
| |
| printk("\nJumping to entry point " FMT_ucellx " for type " FMT_ucellx "...\n", address, type); |
| |
| switch (type) { |
| case 0x0: |
| /* Start ELF boot image */ |
| image_retval = start_elf(address, (uint32_t)&elf_boot_notes); |
| break; |
| |
| case 0x1: |
| /* Start ELF image */ |
| image_retval = start_elf(address, (uint32_t)NULL); |
| break; |
| |
| case 0x5: |
| /* Start a.out image */ |
| image_retval = start_elf(address, (uint32_t)NULL); |
| break; |
| |
| case 0x10: |
| /* Start Fcode image */ |
| printk("Evaluating FCode...\n"); |
| PUSH(address); |
| PUSH(1); |
| fword("byte-load"); |
| image_retval = 0; |
| break; |
| |
| case 0x11: |
| /* Start Forth image */ |
| PUSH(address); |
| PUSH(size); |
| fword("eval2"); |
| image_retval = 0; |
| break; |
| } |
| |
| printk("Image returned with return value %#x\n", image_retval); |
| } |
| |
| |
| void boot(void) |
| { |
| /* No platform-specific boot code */ |
| return; |
| } |