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); }
static void check_preloaded_kernel(void) { unsigned long kernel_image, kernel_size; unsigned long initrd_image, initrd_size; const char * kernel_cmdline; volatile struct context *ctx = __context; kernel_size = fw_cfg_read_i32(FW_CFG_KERNEL_SIZE); if (kernel_size) { kernel_image = fw_cfg_read_i32(FW_CFG_KERNEL_ADDR); kernel_cmdline = (const char *)(uintptr_t) fw_cfg_read_i32(FW_CFG_KERNEL_CMDLINE); initrd_image = fw_cfg_read_i32(FW_CFG_INITRD_ADDR); initrd_size = fw_cfg_read_i32(FW_CFG_INITRD_SIZE); printk("[ppc] Kernel already loaded (0x%8.8lx + 0x%8.8lx) " "(initrd 0x%8.8lx + 0x%8.8lx)\n", kernel_image, kernel_size, initrd_image, initrd_size); if (kernel_cmdline) { phandle_t ph; printk("[ppc] Kernel command line: %s\n", kernel_cmdline); ph = find_dev("/chosen"); set_property(ph, "bootargs", strdup(kernel_cmdline), strlen(kernel_cmdline) + 1); } arch_init_program(); ctx->regs[REG_R3] = initrd_image; ctx->regs[REG_R4] = initrd_size; ctx->pc = kernel_image; start_elf(); } }
void boot(void) { /* Boot preloaded kernel */ if (kernel_size) { printk("[sparc] Kernel already loaded\n"); PUSH(kernel_image); feval("load-state >ls.entry !"); arch_init_program(); start_elf(); } }
int elf_load(struct sys_info *info, const char *filename, const char *cmdline) { Elf_ehdr ehdr; Elf_phdr *phdr = NULL; unsigned long phdr_size; unsigned long checksum_offset; unsigned short checksum = 0; Elf_Bhdr *boot_notes = NULL; int retval = -1; int image_retval; image_name = image_version = NULL; if (!file_open(filename)) goto out; if (lfile_read(&ehdr, sizeof ehdr) != sizeof ehdr) { debug("Can't read ELF header\n"); retval = LOADER_NOT_SUPPORT; goto out; } if (ehdr.e_ident[EI_MAG0] != ELFMAG0 || ehdr.e_ident[EI_MAG1] != ELFMAG1 || ehdr.e_ident[EI_MAG2] != ELFMAG2 || ehdr.e_ident[EI_MAG3] != ELFMAG3 || ehdr.e_ident[EI_CLASS] != ARCH_ELF_CLASS || ehdr.e_ident[EI_DATA] != ARCH_ELF_DATA || ehdr.e_ident[EI_VERSION] != EV_CURRENT || ehdr.e_type != ET_EXEC || !ARCH_ELF_MACHINE_OK(ehdr.e_machine) || ehdr.e_version != EV_CURRENT || ehdr.e_phentsize != sizeof(Elf_phdr)) { debug("Not a bootable ELF image\n"); retval = LOADER_NOT_SUPPORT; goto out; } phdr_size = ehdr.e_phnum * sizeof *phdr; phdr = malloc(phdr_size); file_seek(ehdr.e_phoff); if (lfile_read(phdr, phdr_size) != phdr_size) { printk("Can't read program header\n"); goto out; } if (!check_mem_ranges(info, phdr, ehdr.e_phnum)) goto out; checksum_offset = process_image_notes(phdr, ehdr.e_phnum, &checksum); printk("Loading %s", image_name ? image_name : "image"); if (image_version) printk(" version %s", image_version); printk("...\n"); if (!load_segments(phdr, ehdr.e_phnum, checksum_offset)) goto out; if (checksum_offset) { if (!verify_image(&ehdr, phdr, ehdr.e_phnum, checksum)) goto out; } boot_notes = build_boot_notes(info, cmdline); //debug("current time: %lu\n", currticks()); debug("entry point is %#x\n", ehdr.e_entry); printk("Jumping to entry point...\n"); image_retval = start_elf(ehdr.e_entry & ADDRMASK, virt_to_phys(boot_notes)); // console_init(); FIXME printk("Image returned with return value %#x\n", image_retval); retval = 0; out: if (phdr) free(phdr); if (boot_notes) free(boot_notes); if (image_name) free(image_name); if (image_version) free(image_version); return retval; }
int elf_load(struct sys_info *info, const char *filename, const char *cmdline) { Elf_ehdr ehdr; Elf_phdr *phdr = NULL; unsigned long phdr_size; unsigned long checksum_offset; unsigned short checksum = 0; Elf_Bhdr *boot_notes = NULL; int retval = -1; int image_retval; unsigned int offset; image_name = image_version = NULL; if (!file_open(filename)) goto out; for (offset = 0; offset < 16 * 512; offset += 512) { if ((size_t)lfile_read(&ehdr, sizeof ehdr) != sizeof ehdr) { debug("Can't read ELF header\n"); retval = LOADER_NOT_SUPPORT; goto out; } if (ehdr.e_ident[EI_MAG0] == ELFMAG0) break; file_seek(offset); } if (ehdr.e_ident[EI_MAG0] != ELFMAG0 || ehdr.e_ident[EI_MAG1] != ELFMAG1 || ehdr.e_ident[EI_MAG2] != ELFMAG2 || ehdr.e_ident[EI_MAG3] != ELFMAG3 || ehdr.e_ident[EI_CLASS] != ARCH_ELF_CLASS || ehdr.e_ident[EI_DATA] != ARCH_ELF_DATA || ehdr.e_ident[EI_VERSION] != EV_CURRENT || ehdr.e_type != ET_EXEC || !ARCH_ELF_MACHINE_OK(ehdr.e_machine) || ehdr.e_version != EV_CURRENT || ehdr.e_phentsize != sizeof(Elf_phdr)) { debug("Not a bootable ELF image\n"); retval = LOADER_NOT_SUPPORT; goto out; } phdr_size = ehdr.e_phnum * sizeof *phdr; phdr = malloc(phdr_size); file_seek(offset + ehdr.e_phoff); if ((unsigned long)lfile_read(phdr, phdr_size) != phdr_size) { printf("Can't read program header\n"); goto out; } if (!check_mem_ranges(info, phdr, ehdr.e_phnum)) goto out; checksum_offset = process_image_notes(phdr, ehdr.e_phnum, &checksum, offset); printf("Loading %s", image_name ? image_name : "image"); if (image_version) printf(" version %s", image_version); printf("...\n"); if (!load_segments(phdr, ehdr.e_phnum, checksum_offset, offset)) goto out; if (checksum_offset) { if (!verify_image(&ehdr, phdr, ehdr.e_phnum, checksum)) goto out; } boot_notes = build_boot_notes(info, cmdline); //debug("current time: %lu\n", currticks()); debug("entry point is %#llx\n", addr_fixup(ehdr.e_entry)); printf("Jumping to entry point...\n"); #if 0 { extern unsigned int qemu_mem_size; extern char boot_device; void *init_openprom(unsigned long memsize, const char *cmdline, char boot_device); int (*entry)(const void *romvec, int p2, int p3, int p4, int p5); const void *romvec; romvec = init_openprom(qemu_mem_size, cmdline, boot_device); entry = (void *) addr_fixup(ehdr.e_entry); image_retval = entry(romvec, 0, 0, 0, 0); } #else image_retval = start_elf(addr_fixup(ehdr.e_entry), virt_to_phys(boot_notes)); #endif // console_init(); FIXME printf("Image returned with return value %#x\n", image_retval); retval = 0; out: file_close(); if (phdr) free(phdr); if (boot_notes) free(boot_notes); if (image_name) free(image_name); if (image_version) free(image_version); return retval; }
void go(void) { /* Switch to the current context */ start_elf(); }