/*-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 <efi.h>37#include <efilib.h>3839#include "bootstrap.h"40#include "loader_efi.h"4142static int43__elfN(arm_load)(char *filename, uint64_t dest,44struct preloaded_file **result)45{46int r;4748r = __elfN(loadfile)(filename, dest, result);49if (r != 0)50return (r);5152return (0);53}5455static int56__elfN(arm_exec)(struct preloaded_file *fp)57{58struct file_metadata *fmp;59vm_offset_t modulep, kernend;60Elf_Ehdr *e;61int error;62void (*entry)(void *);6364if ((fmp = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL)65return (EFTYPE);6667e = (Elf_Ehdr *)&fmp->md_data;6869efi_time_fini();7071entry = efi_translate(e->e_entry);7273printf("Kernel entry at %p...\n", entry);74printf("Kernel args: %s\n", fp->f_args);7576/*77* we have to cleanup here because net_cleanup() doesn't work after78* we call ExitBootServices79*/80dev_cleanup();8182if ((error = bi_load(fp->f_args, &modulep, &kernend, true)) != 0) {83efi_time_init();84return (error);85}8687(*entry)((void *)modulep);88panic("exec returned");89}9091static struct file_format arm_elf = {92__elfN(arm_load),93__elfN(arm_exec)94};9596struct file_format *file_formats[] = {97&arm_elf,98NULL99};100101102103