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
100struct 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 */
111struct 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
119struct 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
144struct lwp;
145struct proc;
146struct exec_package;
147struct vnode;
148struct coredump_iostate;
149
150typedef int (*exec_makecmds_fcn)(struct lwp *, struct exec_package *);
151
152struct 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 */
178struct 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 */
185struct exec_fakearg {
186	char *fa_arg;
187	size_t fa_len;
188};
189
190struct 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
235struct 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 */
254vaddr_t	exec_vm_minaddr		(vaddr_t);
255void	kill_vmcmd		(struct exec_vmcmd **);
256int	exec_makecmds		(struct lwp *, struct exec_package *);
257int	exec_runcmds		(struct lwp *, struct exec_package *);
258void	vmcmdset_extend		(struct exec_vmcmd_set *);
259void	kill_vmcmds		(struct exec_vmcmd_set *);
260int	vmcmd_map_pagedvn	(struct lwp *, struct exec_vmcmd *);
261int	vmcmd_map_readvn	(struct lwp *, struct exec_vmcmd *);
262int	vmcmd_readvn		(struct lwp *, struct exec_vmcmd *);
263int	vmcmd_map_zero		(struct lwp *, struct exec_vmcmd *);
264int	copyargs		(struct lwp *, struct exec_package *,
265				    struct ps_strings *, char **, void *);
266int	copyin_psstrings	(struct proc *, struct ps_strings *);
267int	copy_procargs		(struct proc *, int, size_t *,
268    int (*)(void *, const void *, size_t, size_t), void *);
269void	setregs			(struct lwp *, struct exec_package *, vaddr_t);
270int	check_veriexec		(struct lwp *, struct vnode *,
271				     struct exec_package *, int);
272int	check_exec		(struct lwp *, struct exec_package *,
273				     struct pathbuf *, char **);
274int	exec_init		(int);
275int	exec_read		(struct lwp *, struct vnode *, u_long off,
276				    void *, size_t, int);
277int	exec_setup_stack	(struct lwp *, struct exec_package *);
278
279void	exec_free_emul_arg	(struct exec_package *);
280
281
282/*
283 * Machine dependent functions
284 */
285struct core;
286struct core32;
287int	cpu_coredump(struct lwp *, struct coredump_iostate *, struct core *);
288int	cpu_coredump32(struct lwp *, struct coredump_iostate *, struct core32 *);
289
290int	exec_add(struct execsw *, int);
291int	exec_remove(struct execsw *, int);
292int	exec_sigcode_alloc(const struct emul *);
293void	exec_sigcode_free(const struct emul *);
294
295void	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
303typedef	int (*execve_fetch_element_t)(char * const *, size_t, char **);
304int	execve1(struct lwp *, bool, const char *, int, char * const *,
305    char * const *, execve_fetch_element_t);
306
307struct posix_spawn_file_actions;
308struct posix_spawnattr;
309int	check_posix_spawn	(struct lwp *);
310void	posix_spawn_fa_free(struct posix_spawn_file_actions *, size_t);
311int	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);
314int      exec_makepathbuf(struct lwp *, const char *, enum uio_seg,
315    struct pathbuf **, size_t *);
316
317extern int	maxexec;
318extern krwlock_t exec_lock;
319
320/*
321 * Utility functions
322 */
323void emul_find_root(struct lwp *, struct exec_package *);
324int emul_find_interp(struct lwp *, struct exec_package *, const char *);
325
326#endif /* _KERNEL */
327
328#endif /* !_SYS_EXEC_H_ */