コード例 #1
0
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");
}
コード例 #2
0
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");
}
コード例 #3
0
ファイル: ppc64_elf_freebsd.c プロジェクト: 2asoft/freebsd
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");
}
コード例 #4
0
ファイル: ppc64_elf_freebsd.c プロジェクト: 2asoft/freebsd
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");
}