xref: /minix/sys/sys/exec.h (revision 0a6a1f1d)
1 /*	$NetBSD: exec.h,v 1.149 2015/10/10 10:51:15 maxv Exp $	*/
2 
3 /*-
4  * Copyright (c) 1992, 1993
5  *	The Regents of the University of California.  All rights reserved.
6  * (c) UNIX System Laboratories, Inc.
7  * All or some portions of this file are derived from material licensed
8  * to the University of California by American Telephone and Telegraph
9  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
10  * the permission of UNIX System Laboratories, Inc.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  * 3. Neither the name of the University nor the names of its contributors
21  *    may be used to endorse or promote products derived from this software
22  *    without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34  * SUCH DAMAGE.
35  *
36  *	@(#)exec.h	8.4 (Berkeley) 2/19/95
37  */
38 
39 /*-
40  * Copyright (c) 1993 Theo de Raadt.  All rights reserved.
41  *
42  * Redistribution and use in source and binary forms, with or without
43  * modification, are permitted provided that the following conditions
44  * are met:
45  * 1. Redistributions of source code must retain the above copyright
46  *    notice, this list of conditions and the following disclaimer.
47  * 2. Redistributions in binary form must reproduce the above copyright
48  *    notice, this list of conditions and the following disclaimer in the
49  *    documentation and/or other materials provided with the distribution.
50  *
51  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
52  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
53  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
54  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
55  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
56  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
57  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
58  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
59  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
60  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
61  */
62 
63 /*-
64  * Copyright (c) 1994 Christopher G. Demetriou
65  *
66  * Redistribution and use in source and binary forms, with or without
67  * modification, are permitted provided that the following conditions
68  * are met:
69  * 1. Redistributions of source code must retain the above copyright
70  *    notice, this list of conditions and the following disclaimer.
71  * 2. Redistributions in binary form must reproduce the above copyright
72  *    notice, this list of conditions and the following disclaimer in the
73  *    documentation and/or other materials provided with the distribution.
74  * 3. All advertising materials mentioning features or use of this software
75  *    must display the following acknowledgement:
76  *	This product includes software developed by the University of
77  *	California, Berkeley and its contributors.
78  * 4. Neither the name of the University nor the names of its contributors
79  *    may be used to endorse or promote products derived from this software
80  *    without specific prior written permission.
81  *
82  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
83  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
84  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
85  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
86  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
87  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
88  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
89  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
90  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
91  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
92  * SUCH DAMAGE.
93  *
94  *	@(#)exec.h	8.4 (Berkeley) 2/19/95
95  */
96 
97 #ifndef _SYS_EXEC_H_
98 #define _SYS_EXEC_H_
99 
100 struct pathbuf; /* from namei.h */
101 
102 
103 /*
104  * The following structure is found at the top of the user stack of each
105  * user process. The ps program uses it to locate argv and environment
106  * strings. Programs that wish ps to display other information may modify
107  * it; normally ps_argvstr points to argv[0], and ps_nargvstr is the same
108  * as the program's argc. The fields ps_envstr and ps_nenvstr are the
109  * equivalent for the environment.
110  */
111 struct ps_strings {
112 	char	**ps_argvstr;	/* first of 0 or more argument strings */
113 	int	ps_nargvstr;	/* the number of argument strings */
114 	char	**ps_envstr;	/* first of 0 or more environment strings */
115 	int	ps_nenvstr;	/* the number of environment strings */
116 };
117 
118 #ifdef _KERNEL
119 struct ps_strings32 {
120 	uint32_t	ps_argvstr;	/* first of 0 or more argument strings */
121 	int32_t		ps_nargvstr;	/* the number of argument strings */
122 	uint32_t	ps_envstr;	/* first of 0 or more environment strings */
123 	int32_t		ps_nenvstr;	/* the number of environment strings */
124 };
125 #endif
126 
127 /*
128  * the following structures allow execve() to put together processes
129  * in a more extensible and cleaner way.
130  *
131  * the exec_package struct defines an executable being execve()'d.
132  * it contains the header, the vmspace-building commands, the vnode
133  * information, and the arguments associated with the newly-execve'd
134  * process.
135  *
136  * the exec_vmcmd struct defines a command description to be used
137  * in creating the new process's vmspace.
138  */
139 
140 #include <sys/uio.h>
141 
142 struct lwp;
143 struct proc;
144 struct exec_package;
145 struct vnode;
146 struct coredump_iostate;
147 
148 typedef int (*exec_makecmds_fcn)(struct lwp *, struct exec_package *);
149 
150 struct execsw {
151 	u_int	es_hdrsz;		/* size of header for this format */
152 	exec_makecmds_fcn es_makecmds;	/* function to setup vmcmds */
153 	union {				/* probe function */
154 		int (*elf_probe_func)(struct lwp *,
155 			struct exec_package *, void *, char *, vaddr_t *);
156 		int (*ecoff_probe_func)(struct lwp *, struct exec_package *);
157 	} u;
158 	struct  emul *es_emul;		/* os emulation */
159 	int	es_prio;		/* entry priority */
160 	int	es_arglen;		/* Extra argument size in words */
161 					/* Copy arguments on the new stack */
162 	int	(*es_copyargs)(struct lwp *, struct exec_package *,
163 			struct ps_strings *, char **, void *);
164 					/* Set registers before execution */
165 	void	(*es_setregs)(struct lwp *, struct exec_package *, vaddr_t);
166 					/* Dump core */
167 	int	(*es_coredump)(struct lwp *, struct coredump_iostate *);
168 	int	(*es_setup_stack)(struct lwp *, struct exec_package *);
169 };
170 
171 #define EXECSW_PRIO_ANY		0x000	/* default, no preference */
172 #define EXECSW_PRIO_FIRST	0x001	/* this should be among first */
173 #define EXECSW_PRIO_LAST	0x002	/* this should be among last */
174 
175 /* exec vmspace-creation command set; see below */
176 struct exec_vmcmd_set {
177 	u_int	evs_cnt;
178 	u_int	evs_used;
179 	struct	exec_vmcmd *evs_cmds;
180 };
181 
182 #define	EXEC_DEFAULT_VMCMD_SETSIZE	9	/* # of cmds in set to start */
183 struct exec_fakearg {
184 	char *fa_arg;
185 	size_t fa_len;
186 };
187 
188 struct exec_package {
189 	const char *ep_kname;		/* kernel-side copy of file's name */
190 	char *ep_resolvedname;		/* fully resolved path from namei */
191 	void	*ep_hdr;		/* file's exec header */
192 	u_int	ep_hdrlen;		/* length of ep_hdr */
193 	u_int	ep_hdrvalid;		/* bytes of ep_hdr that are valid */
194 	struct	exec_vmcmd_set ep_vmcmds;  /* vmcmds used to build vmspace */
195 	struct	vnode *ep_vp;		/* executable's vnode */
196 	struct	vattr *ep_vap;		/* executable's attributes */
197 	vaddr_t	ep_taddr;		/* process's text address */
198 	vsize_t	ep_tsize;		/* size of process's text */
199 	vaddr_t	ep_daddr;		/* process's data(+bss) address */
200 	vsize_t	ep_dsize;		/* size of process's data(+bss) */
201 	vaddr_t	ep_maxsaddr;		/* proc's max stack addr ("top") */
202 	vaddr_t	ep_minsaddr;		/* proc's min stack addr ("bottom") */
203 	vsize_t	ep_ssize;		/* size of process's stack */
204 	vaddr_t	ep_entry;		/* process's entry point */
205 	vaddr_t	ep_entryoffset;		/* offset to entry point */
206 	vaddr_t	ep_vm_minaddr;		/* bottom of process address space */
207 	vaddr_t	ep_vm_maxaddr;		/* top of process address space */
208 	u_int	ep_flags;		/* flags; see below. */
209 	size_t	ep_fa_len;		/* byte size of ep_fa */
210 	struct exec_fakearg *ep_fa;	/* a fake args vector for scripts */
211 	int	ep_fd;			/* a file descriptor we're holding */
212 	void	*ep_emul_arg;		/* emulation argument */
213 	const struct	execsw *ep_esch;/* execsw entry */
214 	struct vnode *ep_emul_root;     /* base of emulation filesystem */
215 	struct vnode *ep_interp;        /* vnode of (elf) interpeter */
216 	uint32_t ep_pax_flags;		/* pax flags */
217 	char	*ep_path;		/* absolute path of executable */
218 	void	(*ep_emul_arg_free)(void *);
219 					/* free ep_emul_arg */
220 	uint32_t ep_osversion;		/* OS version */
221 	char	ep_machine_arch[12];	/* from MARCH note */
222 };
223 #define	EXEC_INDIR	0x0001		/* script handling already done */
224 #define	EXEC_HASFD	0x0002		/* holding a shell script */
225 #define	EXEC_HASARGL	0x0004		/* has fake args vector */
226 #define	EXEC_SKIPARG	0x0008		/* don't copy user-supplied argv[0] */
227 #define	EXEC_DESTR	0x0010		/* destructive ops performed */
228 #define	EXEC_32		0x0020		/* 32-bit binary emulation */
229 #define	EXEC_FORCEAUX	0x0040		/* always use ELF AUX vector */
230 #define	EXEC_TOPDOWN_VM	0x0080		/* may use top-down VM layout */
231 #define	EXEC_FROM32	0x0100		/* exec'ed from 32-bit binary */
232 
233 struct exec_vmcmd {
234 	int	(*ev_proc)(struct lwp *, struct exec_vmcmd *);
235 				/* procedure to run for region of vmspace */
236 	vsize_t	ev_len;		/* length of the segment to map */
237 	vaddr_t	ev_addr;	/* address in the vmspace to place it at */
238 	struct	vnode *ev_vp;	/* vnode pointer for the file w/the data */
239 	vsize_t	ev_offset;	/* offset in the file for the data */
240 	u_int	ev_prot;	/* protections for segment */
241 	int	ev_flags;
242 #define	VMCMD_RELATIVE	0x0001	/* ev_addr is relative to base entry */
243 #define	VMCMD_BASE	0x0002	/* marks a base entry */
244 #define	VMCMD_FIXED	0x0004	/* entry must be mapped at ev_addr */
245 #define	VMCMD_STACK	0x0008	/* entry is for a stack */
246 };
247 
248 #ifdef _KERNEL
249 /*
250  * funtions used either by execve() or the various CPU-dependent execve()
251  * hooks.
252  */
253 void	kill_vmcmd		(struct exec_vmcmd **);
254 int	exec_makecmds		(struct lwp *, struct exec_package *);
255 int	exec_runcmds		(struct lwp *, struct exec_package *);
256 void	vmcmdset_extend		(struct exec_vmcmd_set *);
257 void	kill_vmcmds		(struct exec_vmcmd_set *);
258 int	vmcmd_map_pagedvn	(struct lwp *, struct exec_vmcmd *);
259 int	vmcmd_map_readvn	(struct lwp *, struct exec_vmcmd *);
260 int	vmcmd_readvn		(struct lwp *, struct exec_vmcmd *);
261 int	vmcmd_map_zero		(struct lwp *, struct exec_vmcmd *);
262 int	copyargs		(struct lwp *, struct exec_package *,
263 				    struct ps_strings *, char **, void *);
264 int	copyin_psstrings	(struct proc *, struct ps_strings *);
265 int	copy_procargs		(struct proc *, int, size_t *,
266     int (*)(void *, const void *, size_t, size_t), void *);
267 void	setregs			(struct lwp *, struct exec_package *, vaddr_t);
268 int	check_veriexec		(struct lwp *, struct vnode *,
269 				     struct exec_package *, int);
270 int	check_exec		(struct lwp *, struct exec_package *,
271 				     struct pathbuf *);
272 int	exec_init		(int);
273 int	exec_read_from		(struct lwp *, struct vnode *, u_long off,
274 				    void *, size_t);
275 int	exec_setup_stack	(struct lwp *, struct exec_package *);
276 
277 int	coredump_write		(struct coredump_iostate *, enum uio_seg,
278 				    const void *, size_t);
279 off_t	coredump_offset		(struct coredump_iostate *);
280 
281 void	exec_free_emul_arg	(struct exec_package *);
282 
283 
284 /*
285  * Machine dependent functions
286  */
287 struct core;
288 struct core32;
289 int	cpu_coredump(struct lwp *, struct coredump_iostate *, struct core *);
290 int	cpu_coredump32(struct lwp *, struct coredump_iostate *, struct core32 *);
291 
292 int	exec_add(struct execsw *, int);
293 int	exec_remove(struct execsw *, int);
294 
295 void	new_vmcmd(struct exec_vmcmd_set *,
296 		    int (*)(struct lwp *, struct exec_vmcmd *),
297 		    vsize_t, vaddr_t, struct vnode *, u_long, u_int, int);
298 #define	NEW_VMCMD(evsp,lwp,len,addr,vp,offset,prot) \
299 	new_vmcmd(evsp,lwp,len,addr,vp,offset,prot,0)
300 #define	NEW_VMCMD2(evsp,lwp,len,addr,vp,offset,prot,flags) \
301 	new_vmcmd(evsp,lwp,len,addr,vp,offset,prot,flags)
302 
303 typedef	int (*execve_fetch_element_t)(char * const *, size_t, char **);
304 int	execve1(struct lwp *, const char *, char * const *, char * const *,
305     execve_fetch_element_t);
306 
307 struct posix_spawn_file_actions;
308 struct posix_spawnattr;
309 int	check_posix_spawn	(struct lwp *);
310 void	posix_spawn_fa_free(struct posix_spawn_file_actions *, size_t);
311 int	do_posix_spawn(struct lwp *, pid_t *, bool*, const char *,
312     struct posix_spawn_file_actions *, struct posix_spawnattr *,
313     char *const *argv, char *const *, execve_fetch_element_t);
314 
315 extern int	maxexec;
316 
317 #endif /* _KERNEL */
318 
319 #endif /* !_SYS_EXEC_H_ */
320