|
|
1.1 ! root 1: /* ! 2: * ! 3: */ ! 4: #undef BOOTSTRAP ! 5: #include "config.h" ! 6: #include "libopenbios/bindings.h" ! 7: #include "arch/common/nvram.h" ! 8: #include "libc/diskio.h" ! 9: #include "libc/vsprintf.h" ! 10: #include "libopenbios/sys_info.h" ! 11: #include "boot.h" ! 12: ! 13: uint64_t kernel_image; ! 14: uint64_t kernel_size; ! 15: uint64_t qemu_cmdline; ! 16: uint64_t cmdline_size; ! 17: char boot_device; ! 18: ! 19: extern int sparc64_of_client_interface( int *params ); ! 20: ! 21: ! 22: void go(void) ! 23: { ! 24: ucell address, type, size; ! 25: int image_retval = 0; ! 26: ! 27: /* Get the entry point and the type (see forth/debugging/client.fs) */ ! 28: feval("saved-program-state >sps.entry @"); ! 29: address = POP(); ! 30: feval("saved-program-state >sps.file-type @"); ! 31: type = POP(); ! 32: feval("saved-program-state >sps.file-size @"); ! 33: size = POP(); ! 34: ! 35: printk("\nJumping to entry point " FMT_ucellx " for type " FMT_ucellx "...\n", address, type); ! 36: ! 37: switch (type) { ! 38: case 0x0: ! 39: /* Start ELF boot image */ ! 40: image_retval = start_elf(address, (uint64_t)&elf_boot_notes); ! 41: break; ! 42: ! 43: case 0x1: ! 44: /* Start ELF image */ ! 45: image_retval = start_client_image(address, (uint64_t)&sparc64_of_client_interface); ! 46: break; ! 47: ! 48: case 0x5: ! 49: /* Start a.out image */ ! 50: image_retval = start_client_image(address, (uint64_t)&sparc64_of_client_interface); ! 51: break; ! 52: ! 53: case 0x10: ! 54: /* Start Fcode image */ ! 55: printk("Evaluating FCode...\n"); ! 56: PUSH(address); ! 57: PUSH(1); ! 58: fword("byte-load"); ! 59: image_retval = 0; ! 60: break; ! 61: ! 62: case 0x11: ! 63: /* Start Forth image */ ! 64: PUSH(address); ! 65: PUSH(size); ! 66: fword("eval2"); ! 67: image_retval = 0; ! 68: break; ! 69: } ! 70: ! 71: printk("Image returned with return value %#x\n", image_retval); ! 72: } ! 73: ! 74: ! 75: void boot(void) ! 76: { ! 77: char *path, *param; ! 78: ! 79: /* Copy the incoming path */ ! 80: fword("2dup"); ! 81: path = pop_fstr_copy(); ! 82: ! 83: /* Boot preloaded kernel */ ! 84: if (kernel_size) { ! 85: void (*entry)(unsigned long p1, unsigned long p2, unsigned long p3, ! 86: unsigned long p4, unsigned long p5); ! 87: ! 88: printk("[sparc64] Kernel already loaded\n"); ! 89: entry = (void *) (unsigned long)kernel_image; ! 90: entry(0, 0, 0, 0, (unsigned long)&sparc64_of_client_interface); ! 91: } ! 92: ! 93: /* Invoke Linux directly -- probably not supported */ ! 94: if(!path) { ! 95: /* No path specified, so grab defaults from /chosen */ ! 96: push_str("bootpath"); ! 97: push_str("/chosen"); ! 98: fword("(find-dev)"); ! 99: POP(); ! 100: fword("get-package-property"); ! 101: POP(); ! 102: path = pop_fstr_copy(); ! 103: } ! 104: ! 105: param = strchr(path, ' '); ! 106: if(param) { ! 107: *param = '\0'; ! 108: param++; ! 109: } else if (cmdline_size) { ! 110: param = (char *)qemu_cmdline; ! 111: } else { ! 112: push_str("boot-args"); ! 113: push_str("/options"); ! 114: fword("(find-dev)"); ! 115: POP(); ! 116: fword("get-package-property"); ! 117: POP(); ! 118: param = pop_fstr_copy(); ! 119: } ! 120: ! 121: /* Invoke platform-specific Linux loader */ ! 122: linux_load(&sys_info, path, param); ! 123: ! 124: free(path); ! 125: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.