Annotation of src/sys/compat/linux/common/linux_exec.c, Revision 1.45.2.9
1.45.2.9! nathanw 1: /* $NetBSD: linux_exec.c,v 1.45.2.8 2002/04/17 00:05:07 nathanw Exp $ */
1.29 christos 2:
3: /*-
1.44 mycroft 4: * Copyright (c) 1994, 1995, 1998, 2000 The NetBSD Foundation, Inc.
1.29 christos 5: * All rights reserved.
6: *
7: * This code is derived from software contributed to The NetBSD Foundation
1.33 fvdl 8: * by Christos Zoulas, Frank van der Linden, Eric Haszlakiewicz and
9: * Thor Lancelot Simon.
1.29 christos 10: *
11: * Redistribution and use in source and binary forms, with or without
12: * modification, are permitted provided that the following conditions
13: * are met:
14: * 1. Redistributions of source code must retain the above copyright
15: * notice, this list of conditions and the following disclaimer.
16: * 2. Redistributions in binary form must reproduce the above copyright
17: * notice, this list of conditions and the following disclaimer in the
18: * documentation and/or other materials provided with the distribution.
19: * 3. All advertising materials mentioning features or use of this software
20: * must display the following acknowledgement:
21: * This product includes software developed by the NetBSD
22: * Foundation, Inc. and its contributors.
23: * 4. Neither the name of The NetBSD Foundation nor the names of its
24: * contributors may be used to endorse or promote products derived
25: * from this software without specific prior written permission.
26: *
27: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
31: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37: * POSSIBILITY OF SUCH DAMAGE.
1.1 fvdl 38: */
1.45.2.5 nathanw 39:
40: #include <sys/cdefs.h>
1.45.2.9! nathanw 41: __KERNEL_RCSID(0, "$NetBSD: linux_exec.c,v 1.45.2.8 2002/04/17 00:05:07 nathanw Exp $");
1.1 fvdl 42:
43: #include <sys/param.h>
44: #include <sys/systm.h>
45: #include <sys/kernel.h>
46: #include <sys/proc.h>
47: #include <sys/malloc.h>
48: #include <sys/namei.h>
49: #include <sys/vnode.h>
1.13 christos 50: #include <sys/mount.h>
1.25 christos 51: #include <sys/exec.h>
1.8 fvdl 52: #include <sys/exec_elf.h>
1.1 fvdl 53:
54: #include <sys/mman.h>
1.45.2.9! nathanw 55: #include <sys/sa.h>
1.13 christos 56: #include <sys/syscallargs.h>
1.1 fvdl 57:
58: #include <machine/cpu.h>
59: #include <machine/reg.h>
60:
1.32 christos 61: #include <compat/linux/common/linux_types.h>
62: #include <compat/linux/common/linux_signal.h>
63: #include <compat/linux/common/linux_util.h>
64: #include <compat/linux/common/linux_exec.h>
65: #include <compat/linux/common/linux_machdep.h>
66:
67: #include <compat/linux/linux_syscallargs.h>
1.4 christos 68: #include <compat/linux/linux_syscall.h>
1.38 jdolecek 69: #include <compat/linux/common/linux_misc.h>
70: #include <compat/linux/common/linux_errno.h>
1.39 jdolecek 71: #include <compat/linux/common/linux_emuldata.h>
1.8 fvdl 72:
1.38 jdolecek 73: extern struct sysent linux_sysent[];
74: extern const char * const linux_syscallnames[];
75: extern char linux_sigcode[], linux_esigcode[];
1.44 mycroft 76: #ifndef __HAVE_SYSCALL_INTERN
1.45.2.6 nathanw 77: void LINUX_SYSCALL_FUNCTION __P((void));
1.44 mycroft 78: #endif
1.1 fvdl 79:
1.39 jdolecek 80: static void linux_e_proc_exec __P((struct proc *, struct exec_package *));
81: static void linux_e_proc_fork __P((struct proc *, struct proc *));
82: static void linux_e_proc_exit __P((struct proc *));
1.45.2.2 nathanw 83: static void linux_e_proc_init __P((struct proc *, struct vmspace *));
1.39 jdolecek 84:
1.1 fvdl 85: /*
86: * Execve(2). Just check the alternate emulation path, and pass it on
87: * to the NetBSD execve().
88: */
89: int
1.45.2.1 nathanw 90: linux_sys_execve(l, v, retval)
91: struct lwp *l;
1.11 thorpej 92: void *v;
93: register_t *retval;
94: {
1.12 mycroft 95: struct linux_sys_execve_args /* {
1.35 christos 96: syscallarg(const char *) path;
1.1 fvdl 97: syscallarg(char **) argv;
98: syscallarg(char **) envp;
1.11 thorpej 99: } */ *uap = v;
1.45.2.1 nathanw 100: struct proc *p = l->l_proc;
1.16 mycroft 101: struct sys_execve_args ap;
1.1 fvdl 102: caddr_t sg;
103:
1.45.2.7 nathanw 104: sg = stackgap_init(p, 0);
1.40 jdolecek 105: CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
1.1 fvdl 106:
1.16 mycroft 107: SCARG(&ap, path) = SCARG(uap, path);
108: SCARG(&ap, argp) = SCARG(uap, argp);
109: SCARG(&ap, envp) = SCARG(uap, envp);
110:
1.45.2.1 nathanw 111: return sys_execve(l, &ap, retval);
1.1 fvdl 112: }
1.38 jdolecek 113:
114: /*
115: * Emulation switch.
116: */
117: const struct emul emul_linux = {
118: "linux",
1.40 jdolecek 119: "/emul/linux",
1.44 mycroft 120: #ifndef __HAVE_MINIMAL_EMUL
121: 0,
1.45 manu 122: (int*)native_to_linux_errno,
1.38 jdolecek 123: LINUX_SYS_syscall,
124: LINUX_SYS_MAXSYSCALL,
1.44 mycroft 125: #endif
1.38 jdolecek 126: linux_sysent,
127: linux_syscallnames,
1.44 mycroft 128: linux_sendsig,
1.45.2.3 nathanw 129: linux_trapsignal,
1.38 jdolecek 130: linux_sigcode,
131: linux_esigcode,
1.45.2.4 nathanw 132: linux_setregs,
1.39 jdolecek 133: linux_e_proc_exec,
134: linux_e_proc_fork,
135: linux_e_proc_exit,
1.44 mycroft 136: #ifdef __HAVE_SYSCALL_INTERN
137: linux_syscall_intern,
1.42 jdolecek 138: #else
1.45.2.6 nathanw 139: LINUX_SYSCALL_FUNCTION,
1.41 jdolecek 140: #endif
1.45.2.8 nathanw 141: linux_sysctl,
1.38 jdolecek 142: };
1.39 jdolecek 143:
144: static void
1.45.2.2 nathanw 145: linux_e_proc_init(p, vmspace)
1.39 jdolecek 146: struct proc *p;
1.45.2.2 nathanw 147: struct vmspace *vmspace;
1.39 jdolecek 148: {
149: if (!p->p_emuldata) {
150: /* allocate new Linux emuldata */
151: MALLOC(p->p_emuldata, void *, sizeof(struct linux_emuldata),
152: M_EMULDATA, M_WAITOK);
153: }
154:
155: memset(p->p_emuldata, '\0', sizeof(struct linux_emuldata));
1.45.2.2 nathanw 156:
157: /* Set the process idea of the break to the real value */
158: ((struct linux_emuldata*)(p->p_emuldata))->p_break =
159: vmspace->vm_daddr + ctob(vmspace->vm_dsize);
160: }
161:
162: /*
163: * Allocate per-process structures. Called when executing Linux
164: * process. We can reuse the old emuldata - if it's not null,
165: * the executed process is of same emulation as original forked one.
166: */
167: static void
168: linux_e_proc_exec(p, epp)
169: struct proc *p;
170: struct exec_package *epp;
171: {
172: /* exec, use our vmspace */
173: linux_e_proc_init(p, p->p_vmspace);
1.39 jdolecek 174: }
175:
176: /*
177: * Emulation per-process exit hook.
178: */
179: static void
180: linux_e_proc_exit(p)
181: struct proc *p;
182: {
183: /* free Linux emuldata and set the pointer to null */
184: FREE(p->p_emuldata, M_EMULDATA);
185: p->p_emuldata = NULL;
186: }
187:
188: /*
189: * Emulation fork hook.
190: */
191: static void
192: linux_e_proc_fork(p, parent)
193: struct proc *p, *parent;
194: {
195: /*
196: * It could be desirable to copy some stuff from parent's
197: * emuldata. We don't need anything like that for now.
198: * So just allocate new emuldata for the new process.
199: */
200: p->p_emuldata = NULL;
1.45.2.2 nathanw 201:
202: /* fork, use parent's vmspace (our vmspace may not be setup yet) */
203: linux_e_proc_init(p, parent->p_vmspace);
1.39 jdolecek 204: }
CVSweb <webmaster@jp.NetBSD.org>