exec.h revision 2712:f74a135872bc
1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21/* 22 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 27/* All Rights Reserved */ 28 29 30#ifndef _SYS_EXEC_H 31#define _SYS_EXEC_H 32 33#pragma ident "%Z%%M% %I% %E% SMI" 34 35#include <sys/systm.h> 36#include <vm/seg.h> 37#include <vm/seg_vn.h> 38#include <sys/model.h> 39#include <sys/uio.h> 40#include <sys/corectl.h> 41 42#ifdef __cplusplus 43extern "C" { 44#endif 45 46/* 47 * Number of bytes to read for magic string 48 */ 49#define MAGIC_BYTES 8 50 51#define getexmag(x) (((x)[0] << 8) + (x)[1]) 52 53typedef struct execa { 54 const char *fname; 55 const char **argp; 56 const char **envp; 57} execa_t; 58 59typedef struct execenv { 60 caddr_t ex_bssbase; 61 caddr_t ex_brkbase; 62 size_t ex_brksize; 63 vnode_t *ex_vp; 64 short ex_magic; 65} execenv_t; 66 67#ifdef _KERNEL 68 69#define LOADABLE_EXEC(e) ((e)->exec_lock) 70#define LOADED_EXEC(e) ((e)->exec_func) 71 72extern int nexectype; /* number of elements in execsw */ 73extern struct execsw execsw[]; 74extern kmutex_t execsw_lock; 75 76/* 77 * User argument structure for passing exec information around between the 78 * common and machine-dependent portions of exec and the exec modules. 79 */ 80typedef struct uarg { 81 ssize_t na; 82 ssize_t ne; 83 ssize_t nc; 84 ssize_t arglen; 85 char *fname; 86 char *pathname; 87 ssize_t auxsize; 88 caddr_t stackend; 89 size_t stk_align; 90 size_t stk_size; 91 char *stk_base; 92 char *stk_strp; 93 int *stk_offp; 94 size_t usrstack_size; 95 uint_t stk_prot; 96 uint_t dat_prot; 97 int traceinval; 98 model_t to_model; 99 model_t from_model; 100 size_t to_ptrsize; 101 size_t from_ptrsize; 102 size_t ncargs; 103 struct execsw *execswp; 104 uint_t stkpageszc; 105 uint_t brkpageszc; 106 uintptr_t entry; 107 uintptr_t thrptr; 108 char *emulator; 109 char *brandname; 110 auxv32_t *brand_auxp; /* starting user addr of brand auxvs on stack */ 111} uarg_t; 112 113/* 114 * Possible brand actions for exec. 115 */ 116#define EBA_NONE 0 117#define EBA_NATIVE 1 118#define EBA_BRAND 2 119 120/* 121 * The following macro is a machine dependent encapsulation of 122 * postfix processing to hide the stack direction from elf.c 123 * thereby making the elf.c code machine independent. 124 */ 125#define execpoststack(ARGS, ARRAYADDR, BYTESIZE) \ 126 (copyout((caddr_t)(ARRAYADDR), (ARGS)->stackend, (BYTESIZE)) ? EFAULT \ 127 : (((ARGS)->stackend += (BYTESIZE)), 0)) 128 129/* 130 * This provides the current user stack address for an object of size BYTESIZE. 131 * Used to determine the stack address just before applying execpoststack(). 132 */ 133#define stackaddress(ARGS, BYTESIZE) ((ARGS)->stackend) 134 135/* 136 * Macro to add attribute/values the aux vector under construction. 137 */ 138/* BEGIN CSTYLED */ 139#if ((_LONG_ALIGNMENT == (2 * _INT_ALIGNMENT)) || \ 140 (_POINTER_ALIGNMENT == (2 * _INT_ALIGNMENT))) 141/* END CSTYLED */ 142/* 143 * This convoluted stuff is necessitated by the fact that there is 144 * potential padding in the aux vector, but not necessarily and 145 * without clearing the padding there is a small, but potential 146 * security hole. 147 */ 148#define ADDAUX(p, a, v) { \ 149 (&(p)->a_type)[1] = 0; \ 150 (p)->a_type = (a); \ 151 (p)->a_un.a_val = (v); \ 152 ++(p); \ 153 } 154#else 155#define ADDAUX(p, a, v) { \ 156 (p)->a_type = (a); \ 157 ((p)++)->a_un.a_val = (v); \ 158 } 159#endif 160 161#define INTPSZ MAXPATHLEN 162typedef struct intpdata { 163 char *intp; 164 char *intp_name; 165 char *intp_arg; 166} intpdata_t; 167 168#define EXECSETID_SETID 0x1 /* setid exec */ 169#define EXECSETID_UGIDS 0x2 /* [ug]ids mismatch */ 170#define EXECSETID_PRIVS 0x4 /* more privs than before */ 171 172struct execsw { 173 char *exec_magic; 174 int exec_magoff; 175 int exec_maglen; 176 int (*exec_func)(struct vnode *vp, struct execa *uap, 177 struct uarg *args, struct intpdata *idata, int level, 178 long *execsz, int setid, caddr_t exec_file, 179 struct cred *cred, int brand_action); 180 int (*exec_core)(struct vnode *vp, struct proc *p, 181 struct cred *cred, rlim64_t rlimit, int sig, 182 core_content_t content); 183 krwlock_t *exec_lock; 184}; 185 186extern short elfmagic; 187extern short intpmagic; 188extern short javamagic; 189#if defined(__sparc) 190extern short aout_zmagic; 191extern short aout_nmagic; 192extern short aout_omagic; 193#endif 194extern short nomagic; 195 196extern char elf32magicstr[]; 197extern char elf64magicstr[]; 198extern char intpmagicstr[]; 199extern char javamagicstr[]; 200#if defined(__sparc) 201extern char aout_nmagicstr[]; 202extern char aout_zmagicstr[]; 203extern char aout_omagicstr[]; 204#endif 205extern char nomagicstr[]; 206 207extern int exec_args(execa_t *, uarg_t *, intpdata_t *, void **); 208extern int exec(const char *fname, const char **argp); 209extern int exece(const char *fname, const char **argp, const char **envp); 210extern int exec_common(const char *fname, const char **argp, 211 const char **envp, int brand_action); 212extern int gexec(vnode_t **vp, struct execa *uap, struct uarg *args, 213 struct intpdata *idata, int level, long *execsz, caddr_t exec_file, 214 struct cred *cred, int brand_action); 215extern struct execsw *allocate_execsw(char *name, char *magic, 216 size_t magic_size); 217extern struct execsw *findexecsw(char *magic); 218extern struct execsw *findexec_by_hdr(char *header); 219extern struct execsw *findexec_by_magic(char *magic); 220extern int execpermissions(struct vnode *vp, struct vattr *vattrp, 221 struct uarg *args); 222extern int execmap(vnode_t *vp, caddr_t addr, size_t len, size_t zfodlen, 223 off_t offset, int prot, int page, uint_t); 224extern void setexecenv(struct execenv *ep); 225extern int execopen(struct vnode **vpp, int *fdp); 226extern int execclose(int fd); 227extern void setregs(uarg_t *); 228extern void exec_set_sp(size_t); 229 230/* 231 * Utility functions for exec module core routines: 232 */ 233extern int core_seg(proc_t *, vnode_t *, offset_t, caddr_t, 234 size_t, rlim64_t, cred_t *); 235 236extern int core_write(vnode_t *, enum uio_seg, offset_t, 237 const void *, size_t, rlim64_t, cred_t *); 238 239/* a.out stuff */ 240 241struct exec; 242 243extern caddr_t gettmem(struct exec *exp); 244extern caddr_t getdmem(struct exec *exp); 245extern ulong_t getdfile(struct exec *exp); 246extern uint_t gettfile(struct exec *exp); 247extern int chkaout(struct exdata *exp); 248extern void getexinfo(struct exdata *edp_in, struct exdata *edp_out, 249 int *pagetext, int *pagedata); 250 251#endif /* _KERNEL */ 252 253#ifdef __cplusplus 254} 255#endif 256 257#endif /* _SYS_EXEC_H */ 258