Annotation of sys/sys/exec.h, Revision 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