1 /* $NetBSD: freebsd_exec.c,v 1.2 1996/05/18 16:02:08 christos Exp $ */ 2 3 /* 4 * Copyright (c) 1993, 1994 Christopher G. Demetriou 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by Christopher G. Demetriou. 18 * 4. The name of the author may not be used to endorse or promote products 19 * derived from this software without specific prior written permission 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 #include <sys/param.h> 34 #include <sys/systm.h> 35 #include <sys/proc.h> 36 #include <sys/malloc.h> 37 #include <sys/vnode.h> 38 #include <sys/exec.h> 39 #include <sys/resourcevar.h> 40 #include <vm/vm.h> 41 42 #include <machine/freebsd_machdep.h> 43 44 #include <compat/freebsd/freebsd_syscall.h> 45 #include <compat/freebsd/freebsd_exec.h> 46 47 extern struct sysent freebsd_sysent[]; 48 extern char *freebsd_syscallnames[]; 49 50 struct emul emul_freebsd = { 51 "freebsd", 52 NULL, 53 freebsd_sendsig, 54 FREEBSD_SYS_syscall, 55 FREEBSD_SYS_MAXSYSCALL, 56 freebsd_sysent, 57 freebsd_syscallnames, 58 0, 59 copyargs, 60 setregs, 61 freebsd_sigcode, 62 freebsd_esigcode, 63 }; 64 65 /* 66 * exec_aout_makecmds(): Check if it's an a.out-format executable. 67 * 68 * Given a proc pointer and an exec package pointer, see if the referent 69 * of the epp is in a.out format. First check 'standard' magic numbers for 70 * this architecture. If that fails, try a cpu-dependent hook. 71 * 72 * This function, in the former case, or the hook, in the latter, is 73 * responsible for creating a set of vmcmds which can be used to build 74 * the process's vm space and inserting them into the exec package. 75 */ 76 77 int 78 exec_freebsd_aout_makecmds(p, epp) 79 struct proc *p; 80 struct exec_package *epp; 81 { 82 u_long midmag; 83 int error = ENOEXEC; 84 struct exec *execp = epp->ep_hdr; 85 86 if (epp->ep_hdrvalid < sizeof(struct exec)) 87 return ENOEXEC; 88 89 midmag = FREEBSD_N_GETMID(*execp) << 16 | FREEBSD_N_GETMAGIC(*execp); 90 91 /* assume FreeBSD's MID_MACHINE and [ZQNO]MAGIC is same as NetBSD's */ 92 switch (midmag) { 93 case (MID_MACHINE << 16) | ZMAGIC: 94 error = exec_aout_prep_oldzmagic(p, epp); 95 break; 96 case (MID_MACHINE << 16) | QMAGIC: 97 error = exec_aout_prep_zmagic(p, epp); 98 break; 99 case (MID_MACHINE << 16) | NMAGIC: 100 error = exec_aout_prep_nmagic(p, epp); 101 break; 102 case (MID_MACHINE << 16) | OMAGIC: 103 error = exec_aout_prep_omagic(p, epp); 104 break; 105 } 106 if (error == 0) 107 epp->ep_emul = &emul_freebsd; 108 else 109 kill_vmcmds(&epp->ep_vmcmds); 110 111 return error; 112 } 113