int ppc64_ofw_elf_exec(struct preloaded_file *fp) { struct file_metadata *fmp; vm_offset_t mdp; Elf_Ehdr *e; int error; intptr_t entry; if ((fmp = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) { return(EFTYPE); } e = (Elf_Ehdr *)&fmp->md_data; /* Handle function descriptor */ entry = *(uint64_t *)e->e_entry; if ((error = md_load64(fp->f_args, &mdp)) != 0) return (error); printf("Kernel entry at 0x%lx ...\n", entry); dev_cleanup(); ofw_release_heap(); OF_chain((void *)reloc, end - (char *)reloc, (void *)entry, (void *)mdp, sizeof(mdp)); panic("exec returned"); }
static int beri_elf64_exec(struct preloaded_file *fp) { void (*entry)(register_t, register_t, register_t, register_t); struct file_metadata *md; vm_offset_t mdp; Elf_Ehdr *ehdr; int error; md = file_findmetadata(fp, MODINFOMD_ELFHDR); if (md == NULL) { printf("%s: file_findmetadata failed\n"); return (EFTYPE); } ehdr = (Elf_Ehdr *)md->md_data; error = md_load64(fp->f_args, &mdp); if (error) { printf("%s: md_load64 failed\n"); return (error); } entry = (void *)ehdr->e_entry; printf("Kernel entry at %p\n", entry); dev_cleanup(); /* XXXRW: Required? */ printf("Kernel args: %s\n", fp->f_args); /* * Configure bootinfo for the loaded kernel. Some values are * inherited from the bootinfo passed to us by boot2 (e.g., DTB * pointer); others are local to the loader (e.g., kernel boot flags). */ bzero(&bootinfo, sizeof(bootinfo)); bootinfo.bi_version = BOOTINFO_VERSION; bootinfo.bi_size = sizeof(bootinfo); bootinfo.bi_boot2opts = boot2_bootinfo.bi_boot2opts; /* NB: bi_kernelname used only by boot2. */ /* NB: bi_nfs_diskless not yet. */ bootinfo.bi_dtb = boot2_bootinfo.bi_dtb; bootinfo.bi_memsize = boot2_bootinfo.bi_memsize; bootinfo.bi_modulep = mdp; /* * Flush the instruction cache before running any instructions from * the loaded kernel. */ beri_icache_sync(); /* * XXXRW: For now, pass 'memsize' rather than dtb or bootinfo. This * is the 'old' ABI spoken by Miniboot and the kernel. To pass in * boot2opts, modules, etc, we will need to fix this to pass in at * least bootinfop. */ (*entry)(boot2_argc, (register_t)boot2_argv, (register_t)boot2_envv, &bootinfo); panic("exec returned"); }
int ppc64_elf_exec(struct preloaded_file *fp) { struct file_metadata *fmp; vm_offset_t mdp; Elf_Ehdr *e; int error; int (*entry)(u_long, u_long, u_long, void *, u_long); if ((fmp = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) { return(EFTYPE); } e = (Elf_Ehdr *)&fmp->md_data; /* Handle function descriptor for ELFv1 kernels */ if ((e->e_flags & 3) == 2) entry = e->e_entry; else entry = (void *)(uintptr_t)(*(uint64_t *)e->e_entry); if ((error = md_load64(fp->f_args, &mdp)) != 0) return (error); printf("Kernel entry at %p ...\n", entry); dev_cleanup(); entry(0 /* FDT */, 0 /* Phys. mem offset */, 0 /* OF entry */, (void *)mdp, sizeof(mdp)); panic("exec returned"); }
int ppc64_ofw_elf_exec(struct preloaded_file *fp) { struct file_metadata *fmp; vm_offset_t mdp, dtbp; Elf_Ehdr *e; int error; intptr_t entry; if ((fmp = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) { return(EFTYPE); } e = (Elf_Ehdr *)&fmp->md_data; /* Handle function descriptor for ELFv1 kernels */ if ((e->e_flags & 3) == 2) entry = e->e_entry; else entry = *(uint64_t *)e->e_entry; if ((error = md_load64(fp->f_args, &mdp, &dtbp)) != 0) return (error); printf("Kernel entry at 0x%lx ...\n", entry); dev_cleanup(); ofw_release_heap(); if (dtbp != 0) { OF_quiesce(); ((int (*)(u_long, u_long, u_long, void *, u_long))entry)(dtbp, 0, 0, mdp, sizeof(mdp)); } else { OF_chain((void *)reloc, end - (char *)reloc, (void *)entry, (void *)mdp, sizeof(mdp)); } panic("exec returned"); }