Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / sys / exec.h @ 13

History | View | Annotate | Download (13.5 KB)

1 13 up20180614
/*        $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_ */