/* * */ #undef BOOTSTRAP #include "config.h" #include "libopenbios/bindings.h" #include "arch/common/nvram.h" #include "libc/diskio.h" #include "libc/vsprintf.h" #include "libopenbios/initprogram.h" #include "libopenbios/sys_info.h" #include "boot.h" uint64_t kernel_image; uint64_t kernel_size; uint64_t initrd_image; uint64_t initrd_size; uint64_t qemu_cmdline; uint64_t cmdline_size; char *boot_device; extern int sparc64_of_client_interface( int *params ); /* ( path len -- path len ) */ void boot(void) { char *path, *param; /* Copy the incoming path */ fword("2dup"); path = pop_fstr_copy(); /* Boot preloaded kernel */ if (kernel_size) { void (*entry)(unsigned long p1, unsigned long p2, unsigned long p3, unsigned long p4, unsigned long p5); printk("[sparc64] Kernel already loaded\n"); entry = (void *) (unsigned long)(IMAGE_VIRT_ADDR + 0x4000); entry(0, 0, 0, 0, (unsigned long)&sparc64_of_client_interface); } /* Invoke Linux directly -- probably not supported */ if(!path) { /* No path specified, so grab defaults from /chosen */ push_str("bootpath"); push_str("/chosen"); fword("(find-dev)"); POP(); fword("get-package-property"); POP(); /* Update our local copy of path as well as the one on the stack */ fword("2dup"); path = pop_fstr_copy(); } if (path) { param = strchr(path, ' '); if(param) { *param = '\0'; param++; } else if (cmdline_size) { param = (char *)qemu_cmdline; } else { push_str("boot-args"); push_str("/options"); fword("(find-dev)"); POP(); fword("get-package-property"); POP(); param = pop_fstr_copy(); } /* Invoke platform-specific Linux loader */ linux_load(&sys_info, path, param); free(path); } }