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