exec.h revision 12273:63678502e95e
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/* 23 * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved. 24 */ 25 26/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 27/* All Rights Reserved */ 28 29#ifndef _SYS_EXEC_H 30#define _SYS_EXEC_H 31 32#include <sys/systm.h> 33#include <vm/seg.h> 34#include <vm/seg_vn.h> 35#include <sys/model.h> 36#include <sys/uio.h> 37#include <sys/corectl.h> 38#include <sys/machelf.h> 39 40#ifdef __cplusplus 41extern "C" { 42#endif 43 44/* 45 * Number of bytes to read for magic string 46 */ 47#define MAGIC_BYTES 8 48 49#define getexmag(x) (((x)[0] << 8) + (x)[1]) 50 51typedef struct execa { 52 const char *fname; 53 const char **argp; 54 const char **envp; 55} execa_t; 56 57typedef struct execenv { 58 caddr_t ex_bssbase; 59 caddr_t ex_brkbase; 60 size_t ex_brksize; 61 vnode_t *ex_vp; 62 short ex_magic; 63} execenv_t; 64 65#ifdef _KERNEL 66 67#define LOADABLE_EXEC(e) ((e)->exec_lock) 68#define LOADED_EXEC(e) ((e)->exec_func) 69 70 71/* 72 * User argument structure for passing exec information around between the 73 * common and machine-dependent portions of exec and the exec modules. 74 */ 75typedef struct uarg { 76 ssize_t na; 77 ssize_t ne; 78 ssize_t nc; 79 ssize_t arglen; 80 char *fname; 81 char *pathname; 82 ssize_t auxsize; 83 caddr_t stackend; 84 size_t stk_align; 85 size_t stk_size; 86 char *stk_base; 87 char *stk_strp; 88 int *stk_offp; 89 size_t usrstack_size; 90 uint_t stk_prot; 91 uint_t dat_prot; 92 int traceinval; 93 int addr32; 94 model_t to_model; 95 model_t from_model; 96 size_t to_ptrsize; 97 size_t from_ptrsize; 98 size_t ncargs; 99 struct execsw *execswp; 100 uintptr_t entry; 101 uintptr_t thrptr; 102 vnode_t *ex_vp; 103 char *emulator; 104 char *brandname; 105 char *auxp_auxflags; /* addr of auxflags auxv on the user stack */ 106 char *auxp_brand; /* address of first brand auxv on user stack */ 107 cred_t *pfcred; 108 boolean_t scrubenv; 109} uarg_t; 110 111/* 112 * Possible brand actions for exec. 113 */ 114#define EBA_NONE 0 115#define EBA_NATIVE 1 116#define EBA_BRAND 2 117 118/* 119 * The following macro is a machine dependent encapsulation of 120 * postfix processing to hide the stack direction from elf.c 121 * thereby making the elf.c code machine independent. 122 */ 123#define execpoststack(ARGS, ARRAYADDR, BYTESIZE) \ 124 (copyout((caddr_t)(ARRAYADDR), (ARGS)->stackend, (BYTESIZE)) ? EFAULT \ 125 : (((ARGS)->stackend += (BYTESIZE)), 0)) 126 127/* 128 * This provides the current user stack address for an object of size BYTESIZE. 129 * Used to determine the stack address just before applying execpoststack(). 130 */ 131#define stackaddress(ARGS, BYTESIZE) ((ARGS)->stackend) 132 133/* 134 * Macro to add attribute/values the aux vector under construction. 135 */ 136/* BEGIN CSTYLED */ 137#if ((_LONG_ALIGNMENT == (2 * _INT_ALIGNMENT)) || \ 138 (_POINTER_ALIGNMENT == (2 * _INT_ALIGNMENT))) 139/* END CSTYLED */ 140/* 141 * This convoluted stuff is necessitated by the fact that there is 142 * potential padding in the aux vector, but not necessarily and 143 * without clearing the padding there is a small, but potential 144 * security hole. 145 */ 146#define ADDAUX(p, a, v) { \ 147 (&(p)->a_type)[1] = 0; \ 148 (p)->a_type = (a); \ 149 (p)->a_un.a_val = (v); \ 150 ++(p); \ 151 } 152#else 153#define ADDAUX(p, a, v) { \ 154 (p)->a_type = (a); \ 155 ((p)++)->a_un.a_val = (v); \ 156 } 157#endif 158 159#define INTPSZ MAXPATHLEN 160typedef struct intpdata { 161 char *intp; 162 char *intp_name; 163 char *intp_arg; 164} intpdata_t; 165 166#define EXECSETID_SETID 0x1 /* setid exec */ 167#define EXECSETID_UGIDS 0x2 /* [ug]ids mismatch */ 168#define EXECSETID_PRIVS 0x4 /* more privs than before */ 169 170struct execsw { 171 char *exec_magic; 172 int exec_magoff; 173 int exec_maglen; 174 int (*exec_func)(struct vnode *vp, struct execa *uap, 175 struct uarg *args, struct intpdata *idata, int level, 176 long *execsz, int setid, caddr_t exec_file, 177 struct cred *cred, int brand_action); 178 int (*exec_core)(struct vnode *vp, struct proc *p, 179 struct cred *cred, rlim64_t rlimit, int sig, 180 core_content_t content); 181 krwlock_t *exec_lock; 182}; 183 184extern int nexectype; /* number of elements in execsw */ 185extern struct execsw execsw[]; 186extern kmutex_t execsw_lock; 187 188extern short elfmagic; 189extern short intpmagic; 190extern short javamagic; 191#if defined(__sparc) 192extern short aout_zmagic; 193extern short aout_nmagic; 194extern short aout_omagic; 195#endif 196extern short nomagic; 197 198extern char elf32magicstr[]; 199extern char elf64magicstr[]; 200extern char intpmagicstr[]; 201extern char javamagicstr[]; 202#if defined(__sparc) 203extern char aout_nmagicstr[]; 204extern char aout_zmagicstr[]; 205extern char aout_omagicstr[]; 206#endif 207extern char nomagicstr[]; 208 209extern int exec_args(execa_t *, uarg_t *, intpdata_t *, void **); 210extern int exece(const char *fname, const char **argp, const char **envp); 211extern int exec_common(const char *fname, const char **argp, 212 const char **envp, int brand_action); 213extern int gexec(vnode_t **vp, struct execa *uap, struct uarg *args, 214 struct intpdata *idata, int level, long *execsz, caddr_t exec_file, 215 struct cred *cred, int brand_action); 216extern struct execsw *allocate_execsw(char *name, char *magic, 217 size_t magic_size); 218extern struct execsw *findexecsw(char *magic); 219extern struct execsw *findexec_by_hdr(char *header); 220extern struct execsw *findexec_by_magic(char *magic); 221extern int execpermissions(struct vnode *vp, struct vattr *vattrp, 222 struct uarg *args); 223extern int execmap(vnode_t *vp, caddr_t addr, size_t len, size_t zfodlen, 224 off_t offset, int prot, int page, uint_t); 225extern void setexecenv(struct execenv *ep); 226extern int execopen(struct vnode **vpp, int *fdp); 227extern int execclose(int fd); 228extern void setregs(uarg_t *); 229extern void exec_set_sp(size_t); 230 231/* 232 * Utility functions for branded process executing 233 */ 234#if !defined(_ELF32_COMPAT) 235/* 236 * When compiling 64-bit kernels we don't want these definitions included 237 * when compiling the 32-bit compatability elf code in the elfexec module. 238 */ 239extern int elfexec(vnode_t *, execa_t *, uarg_t *, intpdata_t *, int, 240 long *, int, caddr_t, cred_t *, int); 241extern int mapexec_brand(vnode_t *, uarg_t *, Ehdr *, Addr *, 242 intptr_t *, caddr_t, int *, caddr_t *, caddr_t *, size_t *, uintptr_t *); 243#endif /* !_ELF32_COMPAT */ 244 245#if defined(_LP64) 246extern int elf32exec(vnode_t *, execa_t *, uarg_t *, intpdata_t *, int, 247 long *, int, caddr_t, cred_t *, int); 248extern int mapexec32_brand(vnode_t *, uarg_t *, Elf32_Ehdr *, Elf32_Addr *, 249 intptr_t *, caddr_t, int *, caddr_t *, caddr_t *, size_t *, uintptr_t *); 250#endif /* _LP64 */ 251 252/* 253 * Utility functions for exec module core routines: 254 */ 255extern int core_seg(proc_t *, vnode_t *, offset_t, caddr_t, 256 size_t, rlim64_t, cred_t *); 257 258extern int core_write(vnode_t *, enum uio_seg, offset_t, 259 const void *, size_t, rlim64_t, cred_t *); 260 261/* a.out stuff */ 262 263struct exec; 264 265extern caddr_t gettmem(struct exec *exp); 266extern caddr_t getdmem(struct exec *exp); 267extern ulong_t getdfile(struct exec *exp); 268extern uint_t gettfile(struct exec *exp); 269extern int chkaout(struct exdata *exp); 270extern void getexinfo(struct exdata *edp_in, struct exdata *edp_out, 271 int *pagetext, int *pagedata); 272 273#endif /* _KERNEL */ 274 275#ifdef __cplusplus 276} 277#endif 278 279#endif /* _SYS_EXEC_H */ 280