root/compat/bsdos/bsdos_exec.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. exec_bsdos_aout_makecmds

    1 /*      $OpenBSD: bsdos_exec.c,v 1.4 2001/11/06 19:53:17 miod 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/signalvar.h>
   37 #include <sys/malloc.h>
   38 #include <sys/vnode.h>
   39 #include <sys/exec.h>
   40 #include <sys/resourcevar.h>
   41 #include <uvm/uvm_extern.h>
   42 
   43 #if 0
   44 #include <machine/bsdos_machdep.h>
   45 #endif
   46 
   47 #include <compat/bsdos/bsdos_exec.h>
   48 #include <compat/bsdos/bsdos_syscall.h>
   49 
   50 extern struct sysent bsdos_sysent[];
   51 #ifdef SYSCALL_DEBUG
   52 extern char *bsdos_syscallnames[];
   53 #endif
   54 
   55 extern char sigcode[], esigcode[];
   56 
   57 struct emul emul_bsdos = {
   58         "bsdos",
   59         NULL,
   60         sendsig,
   61         BSDOS_SYS_syscall,
   62         BSDOS_SYS_MAXSYSCALL,
   63         bsdos_sysent,
   64 #ifdef SYSCALL_DEBUG
   65         bsdos_syscallnames,
   66 #else
   67         NULL,
   68 #endif
   69         0,
   70         copyargs,
   71         setregs,
   72         NULL,
   73         sigcode,
   74         esigcode,
   75 };
   76 
   77 /*
   78  * exec_aout_makecmds(): Check if it's an a.out-format executable.
   79  *
   80  * Given a proc pointer and an exec package pointer, see if the referent
   81  * of the epp is in a.out format.  First check 'standard' magic numbers for
   82  * this architecture.  If that fails, try a cpu-dependent hook.
   83  *
   84  * This function, in the former case, or the hook, in the latter, is
   85  * responsible for creating a set of vmcmds which can be used to build
   86  * the process's vm space and inserting them into the exec package.
   87  */
   88 
   89 int
   90 exec_bsdos_aout_makecmds(p, epp)
   91         struct proc *p;
   92         struct exec_package *epp;
   93 {
   94         u_long midmag, magic;
   95         u_short mid;
   96         int error = ENOEXEC;
   97         struct exec *execp = epp->ep_hdr;
   98 
   99         if (epp->ep_hdrvalid < sizeof(struct exec))
  100                 return ENOEXEC;
  101 
  102         midmag = ntohl(execp->a_midmag);
  103         mid = (midmag >> 16) & 0xffff;
  104         magic = midmag & 0xffff;
  105 
  106         if (magic == 0) {
  107                 magic = (execp->a_midmag & 0xffff);
  108                 mid = MID_BSDOS;
  109         }
  110 
  111         midmag = mid << 16 | magic;
  112 
  113         switch (midmag) {
  114         case (MID_BSDOS << 16) | ZMAGIC:
  115                 /*
  116                  * 386BSD's ZMAGIC format:
  117                  */
  118                 error = exec_aout_prep_oldzmagic(p, epp);
  119                 break;
  120         case (MID_BSDOS << 16) | QMAGIC:
  121                 /*
  122                  * BSDI's QMAGIC format:
  123                  * same as new ZMAGIC format, but with different magic number.
  124                  */
  125                 error = exec_aout_prep_zmagic(p, epp);
  126                 break;
  127         case (MID_BSDOS << 16) | NMAGIC:
  128                 /*
  129                  * BSDI's NMAGIC format:
  130                  * same as NMAGIC format, but with different magic number
  131                  * and with text starting at 0.
  132                  */
  133                 error = exec_aout_prep_oldnmagic(p, epp);
  134                 break;
  135         case (MID_BSDOS << 16) | OMAGIC:
  136                 /*
  137                  * BSDI's OMAGIC format:
  138                  * same as OMAGIC format, but with different magic number
  139                  * and with text starting at 0.
  140                  */
  141                 error = exec_aout_prep_oldomagic(p, epp);
  142                 break;
  143         }
  144         if (error == 0)
  145                 epp->ep_emul = &emul_bsdos;
  146         else
  147                 kill_vmcmds(&epp->ep_vmcmds);
  148 
  149         return error;
  150 }

/* [<][>][^][v][top][bottom][index][help] */