/*-1* Copyright (c) 2001 Benno Rice <[email protected]>2* Copyright (c) 2007 Semihalf, Rafal Jaworowski <[email protected]>3* All rights reserved.4*5* Redistribution and use in source and binary forms, with or without6* modification, are permitted provided that the following conditions7* are met:8* 1. Redistributions of source code must retain the above copyright9* notice, this list of conditions and the following disclaimer.10* 2. Redistributions in binary form must reproduce the above copyright11* notice, this list of conditions and the following disclaimer in the12* documentation and/or other materials provided with the distribution.13*14* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND15* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE16* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE17* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE18* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL19* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS20* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)21* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT22* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY23* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF24* SUCH DAMAGE.25*/2627#include <sys/param.h>28#include <sys/linker.h>2930#include <machine/md_var.h>31#include <machine/metadata.h>32#include <machine/elf.h>3334#include <stand.h>3536#include "bootstrap.h"37#include "libuboot.h"38#include "modinfo.h"3940int41__elfN(uboot_load)(char *filename, uint64_t dest,42struct preloaded_file **result)43{44int r;4546r = __elfN(loadfile)(filename, dest, result);47if (r != 0)48return (r);4950#if defined(__powerpc__)51/*52* No need to sync the icache for modules: this will53* be done by the kernel after relocation.54*/55if (!strcmp((*result)->f_type, md_kerntype))56__syncicache((void *) (*result)->f_addr, (*result)->f_size);57#endif58return (0);59}6061int62__elfN(uboot_exec)(struct preloaded_file *fp)63{64struct file_metadata *fmp;65vm_offset_t mdp;66Elf_Ehdr *e;67int error;68void (*entry)(void *);6970if ((fmp = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL)71return (EFTYPE);7273e = (Elf_Ehdr *)&fmp->md_data;7475if ((error = md_load(fp->f_args, &mdp, NULL)) != 0)76return (error);7778entry = (void *)e->e_entry;79printf("Kernel entry at %p...\n", entry);8081dev_cleanup();82printf("Kernel args: %s\n", fp->f_args);8384(*entry)((void *)mdp);85panic("exec returned");86}8788struct file_format uboot_elf = {89__elfN(uboot_load),90__elfN(uboot_exec)91};929394