Annotation of sys/compat/bsdos/bsdos_exec.c, Revision 1.1.1.1
1.1 nbrk 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: }
CVSweb