The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/sys/exec.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: exec.h,v 1.161 2021/11/26 08:06:12 ryo 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) interpeter */
  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_ */

Cache object: ae03258c11ec38ced75d66dc65b9c20c


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.