xref: /netbsd/sys/sys/exec.h (revision 2ce46329)
1 /*	$NetBSD: exec.h,v 1.161 2021/11/26 08:06:12 ryo 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 #ifdef _KERNEL
128 /*
129  * the following structures allow execve() to put together processes
130  * in a more extensible and cleaner way.
131  *
132  * the exec_package struct defines an executable being execve()'d.
133  * it contains the header, the vmspace-building commands, the vnode
134  * information, and the arguments associated with the newly-execve'd
135  * process.
136  *
137  * the exec_vmcmd struct defines a command description to be used
138  * in creating the new process's vmspace.
139  */
140 
141 #include <sys/uio.h>
142 #include <sys/rwlock.h>
143 
144 struct lwp;
145 struct proc;
146 struct exec_package;
147 struct vnode;
148 struct coredump_iostate;
149 
150 typedef int (*exec_makecmds_fcn)(struct lwp *, struct exec_package *);
151 
152 struct execsw {
153 	u_int	es_hdrsz;		/* size of header for this format */
154 	exec_makecmds_fcn es_makecmds;	/* function to setup vmcmds */
155 	union {				/* probe function */
156 		int (*elf_probe_func)(struct lwp *,
157 			struct exec_package *, void *, char *, vaddr_t *);
158 		int (*ecoff_probe_func)(struct lwp *, struct exec_package *);
159 	} u;
160 	struct  emul *es_emul;		/* os emulation */
161 	int	es_prio;		/* entry priority */
162 	int	es_arglen;		/* Extra argument size in words */
163 					/* Copy arguments on the new stack */
164 	int	(*es_copyargs)(struct lwp *, struct exec_package *,
165 			struct ps_strings *, char **, void *);
166 					/* Set registers before execution */
167 	void	(*es_setregs)(struct lwp *, struct exec_package *, vaddr_t);
168 					/* Dump core */
169 	int	(*es_coredump)(struct lwp *, struct coredump_iostate *);
170 	int	(*es_setup_stack)(struct lwp *, struct exec_package *);
171 };
172 
173 #define EXECSW_PRIO_ANY		0x000	/* default, no preference */
174 #define EXECSW_PRIO_FIRST	0x001	/* this should be among first */
175 #define EXECSW_PRIO_LAST	0x002	/* this should be among last */
176 
177 /* exec vmspace-creation command set; see below */
178 struct exec_vmcmd_set {
179 	u_int	evs_cnt;
180 	u_int	evs_used;
181 	struct	exec_vmcmd *evs_cmds;
182 };
183 
184 #define	EXEC_DEFAULT_VMCMD_SETSIZE	9	/* # of cmds in set to start */
185 struct exec_fakearg {
186 	char *fa_arg;
187 	size_t fa_len;
188 };
189 
190 struct exec_package {
191 	const char *ep_kname;		/* kernel-side copy of file's name */
192 	char	*ep_resolvedname;	/* fully resolved path from namei */
193 	int	ep_xfd;			/* fexecve file descriptor */
194 	void	*ep_hdr;		/* file's exec header */
195 	u_int	ep_hdrlen;		/* length of ep_hdr */
196 	u_int	ep_hdrvalid;		/* bytes of ep_hdr that are valid */
197 	struct	exec_vmcmd_set ep_vmcmds;  /* vmcmds used to build vmspace */
198 	struct	vnode *ep_vp;		/* executable's vnode */
199 	struct	vattr *ep_vap;		/* executable's attributes */
200 	vaddr_t	ep_taddr;		/* process's text address */
201 	vsize_t	ep_tsize;		/* size of process's text */
202 	vaddr_t	ep_daddr;		/* process's data(+bss) address */
203 	vsize_t	ep_dsize;		/* size of process's data(+bss) */
204 	vaddr_t	ep_maxsaddr;		/* proc's max stack addr ("top") */
205 	vaddr_t	ep_minsaddr;		/* proc's min stack addr ("bottom") */
206 	vsize_t	ep_ssize;		/* size of process's stack */
207 	vaddr_t	ep_entry;		/* process's entry point */
208 	vaddr_t	ep_entryoffset;		/* offset to entry point */
209 	vaddr_t	ep_vm_minaddr;		/* bottom of process address space */
210 	vaddr_t	ep_vm_maxaddr;		/* top of process address space */
211 	u_int	ep_flags;		/* flags; see below. */
212 	size_t	ep_fa_len;		/* byte size of ep_fa */
213 	struct exec_fakearg *ep_fa;	/* a fake args vector for scripts */
214 	int	ep_fd;			/* a file descriptor we're holding */
215 	void	*ep_emul_arg;		/* emulation argument */
216 	const struct	execsw *ep_esch;/* execsw entry */
217 	struct vnode *ep_emul_root;     /* base of emulation filesystem */
218 	struct vnode *ep_interp;        /* vnode of (elf) interpeter */
219 	uint32_t ep_pax_flags;		/* pax flags */
220 	void	(*ep_emul_arg_free)(void *);
221 					/* free ep_emul_arg */
222 	uint32_t ep_osversion;		/* OS version */
223 	char	ep_machine_arch[12];	/* from MARCH note */
224 };
225 #define	EXEC_INDIR	0x0001		/* script handling already done */
226 #define	EXEC_HASFD	0x0002		/* holding a shell script */
227 #define	EXEC_HASARGL	0x0004		/* has fake args vector */
228 #define	EXEC_SKIPARG	0x0008		/* don't copy user-supplied argv[0] */
229 #define	EXEC_DESTR	0x0010		/* destructive ops performed */
230 #define	EXEC_32		0x0020		/* 32-bit binary emulation */
231 #define	EXEC_FORCEAUX	0x0040		/* always use ELF AUX vector */
232 #define	EXEC_TOPDOWN_VM	0x0080		/* may use top-down VM layout */
233 #define	EXEC_FROM32	0x0100		/* exec'ed from 32-bit binary */
234 
235 struct exec_vmcmd {
236 	int	(*ev_proc)(struct lwp *, struct exec_vmcmd *);
237 				/* procedure to run for region of vmspace */
238 	vsize_t	ev_len;		/* length of the segment to map */
239 	vaddr_t	ev_addr;	/* address in the vmspace to place it at */
240 	struct	vnode *ev_vp;	/* vnode pointer for the file w/the data */
241 	vsize_t	ev_offset;	/* offset in the file for the data */
242 	u_int	ev_prot;	/* protections for segment */
243 	int	ev_flags;
244 #define	VMCMD_RELATIVE	0x0001	/* ev_addr is relative to base entry */
245 #define	VMCMD_BASE	0x0002	/* marks a base entry */
246 #define	VMCMD_FIXED	0x0004	/* entry must be mapped at ev_addr */
247 #define	VMCMD_STACK	0x0008	/* entry is for a stack */
248 };
249 
250 /*
251  * functions used either by execve() or the various CPU-dependent execve()
252  * hooks.
253  */
254 vaddr_t	exec_vm_minaddr		(vaddr_t);
255 void	kill_vmcmd		(struct exec_vmcmd **);
256 int	exec_makecmds		(struct lwp *, struct exec_package *);
257 int	exec_runcmds		(struct lwp *, struct exec_package *);
258 void	vmcmdset_extend		(struct exec_vmcmd_set *);
259 void	kill_vmcmds		(struct exec_vmcmd_set *);
260 int	vmcmd_map_pagedvn	(struct lwp *, struct exec_vmcmd *);
261 int	vmcmd_map_readvn	(struct lwp *, struct exec_vmcmd *);
262 int	vmcmd_readvn		(struct lwp *, struct exec_vmcmd *);
263 int	vmcmd_map_zero		(struct lwp *, struct exec_vmcmd *);
264 int	copyargs		(struct lwp *, struct exec_package *,
265 				    struct ps_strings *, char **, void *);
266 int	copyin_psstrings	(struct proc *, struct ps_strings *);
267 int	copy_procargs		(struct proc *, int, size_t *,
268     int (*)(void *, const void *, size_t, size_t), void *);
269 void	setregs			(struct lwp *, struct exec_package *, vaddr_t);
270 int	check_veriexec		(struct lwp *, struct vnode *,
271 				     struct exec_package *, int);
272 int	check_exec		(struct lwp *, struct exec_package *,
273 				     struct pathbuf *, char **);
274 int	exec_init		(int);
275 int	exec_read		(struct lwp *, struct vnode *, u_long off,
276 				    void *, size_t, int);
277 int	exec_setup_stack	(struct lwp *, struct exec_package *);
278 
279 void	exec_free_emul_arg	(struct exec_package *);
280 
281 
282 /*
283  * Machine dependent functions
284  */
285 struct core;
286 struct core32;
287 int	cpu_coredump(struct lwp *, struct coredump_iostate *, struct core *);
288 int	cpu_coredump32(struct lwp *, struct coredump_iostate *, struct core32 *);
289 
290 int	exec_add(struct execsw *, int);
291 int	exec_remove(struct execsw *, int);
292 int	exec_sigcode_alloc(const struct emul *);
293 void	exec_sigcode_free(const struct emul *);
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 *, bool, const char *, int, char * const *,
305     char * const *, 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 *, char *const *, execve_fetch_element_t);
314 int      exec_makepathbuf(struct lwp *, const char *, enum uio_seg,
315     struct pathbuf **, size_t *);
316 
317 extern int	maxexec;
318 extern krwlock_t exec_lock;
319 
320 /*
321  * Utility functions
322  */
323 void emul_find_root(struct lwp *, struct exec_package *);
324 int emul_find_interp(struct lwp *, struct exec_package *, const char *);
325 
326 #endif /* _KERNEL */
327 
328 #endif /* !_SYS_EXEC_H_ */
329