1206376Srpaulo/*- 2206376Srpaulo * Copyright (c) 1998 Michael Smith <msmith@freebsd.org> 3206376Srpaulo * All rights reserved. 4206376Srpaulo * 5206376Srpaulo * Redistribution and use in source and binary forms, with or without 6206376Srpaulo * modification, are permitted provided that the following conditions 7206376Srpaulo * are met: 8206376Srpaulo * 1. Redistributions of source code must retain the above copyright 9206376Srpaulo * notice, this list of conditions and the following disclaimer. 10206376Srpaulo * 2. Redistributions in binary form must reproduce the above copyright 11206376Srpaulo * notice, this list of conditions and the following disclaimer in the 12206376Srpaulo * documentation and/or other materials provided with the distribution. 13206376Srpaulo * 14206376Srpaulo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15206376Srpaulo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16206376Srpaulo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17206376Srpaulo * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18206376Srpaulo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19206376Srpaulo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20206376Srpaulo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21206376Srpaulo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22206376Srpaulo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23206376Srpaulo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24206376Srpaulo * SUCH DAMAGE. 25206376Srpaulo */ 26206376Srpaulo 27206376Srpaulo#include <sys/cdefs.h> 28206376Srpaulo__FBSDID("$FreeBSD$"); 29206376Srpaulo 30206376Srpaulo#include <sys/param.h> 31206376Srpaulo#include <sys/exec.h> 32206376Srpaulo#include <sys/linker.h> 33206376Srpaulo#include <string.h> 34206376Srpaulo#include <machine/bootinfo.h> 35206376Srpaulo#include <machine/elf.h> 36206376Srpaulo#include <stand.h> 37206376Srpaulo 38206376Srpaulo#include "bootstrap.h" 39206376Srpaulo#include "../libi386/libi386.h" 40206376Srpaulo#include "../btx/lib/btxv86.h" 41206376Srpaulo 42206376Srpauloextern void __exec(caddr_t addr, ...); 43206376Srpaulo 44206376Srpaulo 45206376Srpaulostatic int elf32_exec(struct preloaded_file *amp); 46206376Srpaulostatic int elf32_obj_exec(struct preloaded_file *amp); 47206376Srpaulo 48206376Srpaulostruct file_format i386_elf = { elf32_loadfile, elf32_exec }; 49206376Srpaulostruct file_format i386_elf_obj = { elf32_obj_loadfile, elf32_obj_exec }; 50206376Srpaulo 51206376Srpaulo/* 52206376Srpaulo * There is an ELF kernel and one or more ELF modules loaded. 53206376Srpaulo * We wish to start executing the kernel image, so make such 54206376Srpaulo * preparations as are required, and do so. 55206376Srpaulo */ 56206376Srpaulostatic int 57206376Srpauloelf32_exec(struct preloaded_file *fp) 58206376Srpaulo{ 59206376Srpaulo struct file_metadata *md; 60206376Srpaulo Elf_Ehdr *ehdr; 61206376Srpaulo vm_offset_t entry, bootinfop, modulep, kernend; 62206376Srpaulo int boothowto, err, bootdev; 63206376Srpaulo 64206376Srpaulo if ((md = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) 65206376Srpaulo return(EFTYPE); 66206376Srpaulo ehdr = (Elf_Ehdr *)&(md->md_data); 67206376Srpaulo 68206376Srpaulo err = bi_load(fp->f_args, &boothowto, &bootdev, &bootinfop, &modulep, &kernend); 69206376Srpaulo if (err != 0) 70206376Srpaulo return(err); 71206376Srpaulo entry = ehdr->e_entry & 0xffffff; 72206376Srpaulo 73206376Srpaulo printf("Start @ 0x%lx ...\n", entry); 74206376Srpaulo 75206376Srpaulo ldr_enter(fp->f_name); 76206376Srpaulo 77206376Srpaulo dev_cleanup(); 78206376Srpaulo __exec((void *)entry, boothowto, bootdev, 0, 0, 0, bootinfop, modulep, kernend); 79206376Srpaulo 80206376Srpaulo panic("exec returned"); 81206376Srpaulo} 82206376Srpaulo 83206376Srpaulostatic int 84206376Srpauloelf32_obj_exec(struct preloaded_file *fp) 85206376Srpaulo{ 86206376Srpaulo return (EFTYPE); 87206376Srpaulo} 88