Annotation of sys/sys/exec.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: exec.h,v 1.24 2007/05/26 00:36:03 krw Exp $ */
2: /* $NetBSD: exec.h,v 1.59 1996/02/09 18:25:09 christos Exp $ */
3:
4: /*-
5: * Copyright (c) 1994 Christopher G. Demetriou
6: * Copyright (c) 1993 Theo de Raadt
7: * Copyright (c) 1992, 1993
8: * The Regents of the University of California. All rights reserved.
9: * (c) UNIX System Laboratories, Inc.
10: * All or some portions of this file are derived from material licensed
11: * to the University of California by American Telephone and Telegraph
12: * Co. or Unix System Laboratories, Inc. and are reproduced herein with
13: * the permission of UNIX System Laboratories, Inc.
14: *
15: * Redistribution and use in source and binary forms, with or without
16: * modification, are permitted provided that the following conditions
17: * are met:
18: * 1. Redistributions of source code must retain the above copyright
19: * notice, this list of conditions and the following disclaimer.
20: * 2. Redistributions in binary form must reproduce the above copyright
21: * notice, this list of conditions and the following disclaimer in the
22: * documentation and/or other materials provided with the distribution.
23: * 3. Neither the name of the University nor the names of its contributors
24: * may be used to endorse or promote products derived from this software
25: * without specific prior written permission.
26: *
27: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
28: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
31: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37: * SUCH DAMAGE.
38: *
39: * @(#)exec.h 8.3 (Berkeley) 1/21/94
40: */
41:
42: #ifndef _SYS_EXEC_H_
43: #define _SYS_EXEC_H_
44:
45: /*
46: * The following structure is found at the top of the user stack of each
47: * user process. The ps program uses it to locate argv and environment
48: * strings. Programs that wish ps to display other information may modify
49: * it; normally ps_argvstr points to argv[0], and ps_nargvstr is the same
50: * as the program's argc. The fields ps_envstr and ps_nenvstr are the
51: * equivalent for the environment.
52: */
53: struct ps_strings {
54: char **ps_argvstr; /* first of 0 or more argument strings */
55: int ps_nargvstr; /* the number of argument strings */
56: char **ps_envstr; /* first of 0 or more environment strings */
57: int ps_nenvstr; /* the number of environment strings */
58: };
59:
60: /*
61: * Address of ps_strings structure (in user space).
62: */
63: #ifdef MACHINE_STACK_GROWS_UP
64: #define PS_STRINGS ((struct ps_strings *)(USRSTACK))
65: #else
66: #define PS_STRINGS \
67: ((struct ps_strings *)(USRSTACK - sizeof(struct ps_strings)))
68: #endif
69:
70: /*
71: * Below the PS_STRINGS and sigtramp, we may require a gap on the stack
72: * (used to copyin/copyout various emulation data structures).
73: */
74: #define STACKGAPLEN (2*1024) /* plenty enough for now */
75:
76: #ifdef MACHINE_STACK_GROWS_UP
77: #define STACKGAPBASE_UNALIGNED \
78: ((caddr_t)PS_STRINGS + sizeof(struct ps_strings))
79: #else
80: #define STACKGAPBASE_UNALIGNED \
81: ((caddr_t)PS_STRINGS - STACKGAPLEN)
82: #endif
83: #define STACKGAPBASE \
84: ((caddr_t)ALIGN(STACKGAPBASE_UNALIGNED))
85:
86: /*
87: * the following structures allow execve() to put together processes
88: * in a more extensible and cleaner way.
89: *
90: * the exec_package struct defines an executable being execve()'d.
91: * it contains the header, the vmspace-building commands, the vnode
92: * information, and the arguments associated with the newly-execve'd
93: * process.
94: *
95: * the exec_vmcmd struct defines a command description to be used
96: * in creating the new process's vmspace.
97: */
98:
99: struct proc;
100: struct exec_package;
101:
102: typedef int (*exec_makecmds_fcn)(struct proc *, struct exec_package *);
103:
104: struct execsw {
105: u_int es_hdrsz; /* size of header for this format */
106: exec_makecmds_fcn es_check; /* function to check exec format */
107: struct emul *es_emul; /* emulation */
108: };
109:
110: struct exec_vmcmd {
111: int (*ev_proc)(struct proc *p, struct exec_vmcmd *cmd);
112: /* procedure to run for region of vmspace */
113: u_long ev_len; /* length of the segment to map */
114: u_long ev_addr; /* address in the vmspace to place it at */
115: struct vnode *ev_vp; /* vnode pointer for the file w/the data */
116: u_long ev_offset; /* offset in the file for the data */
117: u_int ev_prot; /* protections for segment */
118: int ev_flags;
119: #define VMCMD_RELATIVE 0x0001 /* ev_addr is relative to base entry */
120: #define VMCMD_BASE 0x0002 /* marks a base entry */
121: };
122:
123: #define EXEC_DEFAULT_VMCMD_SETSIZE 8 /* # of cmds in set to start */
124:
125: /* exec vmspace-creation command set; see below */
126: struct exec_vmcmd_set {
127: u_int evs_cnt;
128: u_int evs_used;
129: struct exec_vmcmd *evs_cmds;
130: struct exec_vmcmd evs_start[EXEC_DEFAULT_VMCMD_SETSIZE];
131: };
132:
133: struct exec_package {
134: char *ep_name; /* file's name */
135: void *ep_hdr; /* file's exec header */
136: u_int ep_hdrlen; /* length of ep_hdr */
137: u_int ep_hdrvalid; /* bytes of ep_hdr that are valid */
138: struct nameidata *ep_ndp; /* namei data pointer for lookups */
139: struct exec_vmcmd_set ep_vmcmds; /* vmcmds used to build vmspace */
140: struct vnode *ep_vp; /* executable's vnode */
141: struct vattr *ep_vap; /* executable's attributes */
142: u_long ep_taddr; /* process's text address */
143: u_long ep_tsize; /* size of process's text */
144: u_long ep_daddr; /* process's data(+bss) address */
145: u_long ep_dsize; /* size of process's data(+bss) */
146: u_long ep_maxsaddr; /* proc's max stack addr ("top") */
147: u_long ep_minsaddr; /* proc's min stack addr ("bottom") */
148: u_long ep_ssize; /* size of process's stack */
149: u_long ep_entry; /* process's entry point */
150: u_int ep_flags; /* flags; see below. */
151: char **ep_fa; /* a fake args vector for scripts */
152: int ep_fd; /* a file descriptor we're holding */
153: struct emul *ep_emul; /* os emulation */
154: void *ep_emul_arg; /* emulation argument */
155: void *ep_emul_argp; /* emulation argument pointer */
156: char *ep_interp; /* name of interpreter if any */
157: u_long ep_interp_pos; /* interpreter load position */
158: };
159: #define EXEC_INDIR 0x0001 /* script handling already done */
160: #define EXEC_HASFD 0x0002 /* holding a shell script */
161: #define EXEC_HASARGL 0x0004 /* has fake args vector */
162: #define EXEC_SKIPARG 0x0008 /* don't copy user-supplied argv[0] */
163: #define EXEC_DESTR 0x0010 /* destructive ops performed */
164:
165: #ifdef _KERNEL
166: /*
167: * functions used either by execve() or the various cpu-dependent execve()
168: * hooks.
169: */
170: int exec_makecmds(struct proc *, struct exec_package *);
171: int exec_runcmds(struct proc *, struct exec_package *);
172: void vmcmdset_extend(struct exec_vmcmd_set *);
173: void kill_vmcmds(struct exec_vmcmd_set *evsp);
174: int vmcmd_map_pagedvn(struct proc *, struct exec_vmcmd *);
175: int vmcmd_map_readvn(struct proc *, struct exec_vmcmd *);
176: int vmcmd_map_zero(struct proc *, struct exec_vmcmd *);
177: void *copyargs(struct exec_package *,
178: struct ps_strings *,
179: void *, void *);
180: void setregs(struct proc *, struct exec_package *,
181: u_long, register_t *);
182: int check_exec(struct proc *, struct exec_package *);
183: int exec_setup_stack(struct proc *, struct exec_package *);
184: int exec_process_vmcmds(struct proc *, struct exec_package *);
185:
186: #ifdef DEBUG
187: void new_vmcmd(struct exec_vmcmd_set *evsp,
188: int (*proc)(struct proc *p, struct exec_vmcmd *),
189: u_long len, u_long addr, struct vnode *vp, u_long offset,
190: u_int prot, int flags);
191: #define NEW_VMCMD(evsp,proc,len,addr,vp,offset,prot) \
192: new_vmcmd(evsp,proc,len,addr,vp,offset,prot, 0);
193: #define NEW_VMCMD2(evsp,proc,len,addr,vp,offset,prot,flags) \
194: new_vmcmd(evsp,proc,len,addr,vp,offset,prot,flags)
195: #else /* DEBUG */
196: #define NEW_VMCMD(evsp,proc,len,addr,vp,offset,prot) \
197: NEW_VMCMD2(evsp,proc,len,addr,vp,offset,prot,0)
198: #define NEW_VMCMD2(evsp,proc,len,addr,vp,offset,prot,flags) do { \
199: struct exec_vmcmd *vcp; \
200: if ((evsp)->evs_used >= (evsp)->evs_cnt) \
201: vmcmdset_extend(evsp); \
202: vcp = &(evsp)->evs_cmds[(evsp)->evs_used++]; \
203: vcp->ev_proc = (proc); \
204: vcp->ev_len = (len); \
205: vcp->ev_addr = (addr); \
206: if ((vcp->ev_vp = (vp)) != NULLVP) \
207: VREF(vp); \
208: vcp->ev_offset = (offset); \
209: vcp->ev_prot = (prot); \
210: vcp->ev_flags = (flags); \
211: } while (0)
212:
213: #endif /* DEBUG */
214:
215: /* Initialize an empty vmcmd set */
216: #define VMCMDSET_INIT(vmc) do { \
217: (vmc)->evs_cnt = EXEC_DEFAULT_VMCMD_SETSIZE; \
218: (vmc)->evs_cmds = (vmc)->evs_start; \
219: (vmc)->evs_used = 0; \
220: } while (0)
221:
222: /*
223: * Exec function switch:
224: *
225: * Note that each makecmds function is responsible for loading the
226: * exec package with the necessary functions for any exec-type-specific
227: * handling.
228: *
229: * Functions for specific exec types should be defined in their own
230: * header file.
231: */
232: extern struct execsw execsw[];
233: extern int nexecs;
234: extern int exec_maxhdrsz;
235:
236: #endif /* _KERNEL */
237:
238: #include <sys/exec_aout.h>
239: #include <machine/exec.h>
240:
241: #endif /* !_SYS_EXEC_H_ */
CVSweb