Home | History | Annotate | Line # | Download | only in sys
      1 /*	$NetBSD: exec.h,v 1.162 2023/08/01 21:26:28 andvar 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) interpreter */
    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