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.
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.
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]
23 * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
26 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
27 /* All Rights Reserved */
32 #include <sys/systm.h>
34 #include <vm/seg_vn.h>
35 #include <sys/model.h>
37 #include <sys/corectl.h>
38 #include <sys/machelf.h>
45 * Number of bytes to read for magic string
49 #define getexmag(x) (((x)[0] << 8) + (x)[1])
51 typedef struct execa
{
57 typedef struct execenv
{
67 #define LOADABLE_EXEC(e) ((e)->exec_lock)
68 #define LOADED_EXEC(e) ((e)->exec_func)
72 * User argument structure for passing exec information around between the
73 * common and machine-dependent portions of exec and the exec modules.
99 struct execsw
*execswp
;
105 char *auxp_auxflags
; /* addr of auxflags auxv on the user stack */
106 char *auxp_brand
; /* address of first brand auxv on user stack */
113 * Possible brand actions for exec.
120 * The following macro is a machine dependent encapsulation of
121 * postfix processing to hide the stack direction from elf.c
122 * thereby making the elf.c code machine independent.
124 #define execpoststack(ARGS, ARRAYADDR, BYTESIZE) \
125 (copyout((caddr_t)(ARRAYADDR), (ARGS)->stackend, (BYTESIZE)) ? EFAULT \
126 : (((ARGS)->stackend += (BYTESIZE)), 0))
129 * This provides the current user stack address for an object of size BYTESIZE.
130 * Used to determine the stack address just before applying execpoststack().
132 #define stackaddress(ARGS, BYTESIZE) ((ARGS)->stackend)
135 * Macro to add attribute/values the aux vector under construction.
138 #if ((_LONG_ALIGNMENT == (2 * _INT_ALIGNMENT)) || \
139 (_POINTER_ALIGNMENT == (2 * _INT_ALIGNMENT)))
142 * This convoluted stuff is necessitated by the fact that there is
143 * potential padding in the aux vector, but not necessarily and
144 * without clearing the padding there is a small, but potential
147 #define ADDAUX(p, a, v) { \
148 (&(p)->a_type)[1] = 0; \
150 (p)->a_un.a_val = (v); \
154 #define ADDAUX(p, a, v) { \
156 ((p)++)->a_un.a_val = (v); \
160 #define INTPSZ MAXPATHLEN
161 #define INTP_MAXDEPTH 5 /* Nested interpreter depth matches Linux */
162 typedef struct intpdata
{
164 char *intp_name
[INTP_MAXDEPTH
];
165 char *intp_arg
[INTP_MAXDEPTH
];
168 #define EXECSETID_SETID 0x1 /* setid exec */
169 #define EXECSETID_UGIDS 0x2 /* [ug]ids mismatch */
170 #define EXECSETID_PRIVS 0x4 /* more privs than before */
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
;
186 extern int nexectype
; /* number of elements in execsw */
187 extern struct execsw execsw
[];
188 extern kmutex_t execsw_lock
;
190 extern short elfmagic
;
191 extern short intpmagic
;
192 extern short javamagic
;
193 extern short nomagic
;
195 extern char elf32magicstr
[];
196 extern char elf64magicstr
[];
197 extern char intpmagicstr
[];
198 extern char javamagicstr
[];
199 extern char nomagicstr
[];
201 extern int exec_args(execa_t
*, uarg_t
*, intpdata_t
*, void **);
202 extern int exece(const char *fname
, const char **argp
, const char **envp
);
203 extern int exec_common(const char *fname
, const char **argp
,
204 const char **envp
, int brand_action
);
205 extern int gexec(vnode_t
**vp
, struct execa
*uap
, struct uarg
*args
,
206 struct intpdata
*idata
, int level
, long *execsz
, caddr_t exec_file
,
207 struct cred
*cred
, int brand_action
);
208 extern struct execsw
*allocate_execsw(char *name
, char *magic
,
210 extern struct execsw
*findexecsw(char *magic
);
211 extern struct execsw
*findexec_by_hdr(char *header
);
212 extern struct execsw
*findexec_by_magic(char *magic
);
213 extern int execpermissions(struct vnode
*vp
, struct vattr
*vattrp
,
215 extern int execmap(vnode_t
*vp
, caddr_t addr
, size_t len
, size_t zfodlen
,
216 off_t offset
, int prot
, int page
, uint_t
);
217 extern void setexecenv(struct execenv
*ep
);
218 extern int execopen(struct vnode
**vpp
, int *fdp
);
219 extern int execclose(int fd
);
220 extern void setregs(uarg_t
*);
221 extern void exec_set_sp(size_t);
224 * Utility functions for branded process executing
226 #if !defined(_ELF32_COMPAT)
228 * When compiling 64-bit kernels we don't want these definitions included
229 * when compiling the 32-bit compatability elf code in the elfexec module.
231 extern int elfexec(vnode_t
*, execa_t
*, uarg_t
*, intpdata_t
*, int,
232 long *, int, caddr_t
, cred_t
*, int);
233 extern int mapexec_brand(vnode_t
*, uarg_t
*, Ehdr
*, Addr
*,
234 intptr_t *, caddr_t
, int *, caddr_t
*, caddr_t
*, size_t *, uintptr_t *);
235 #endif /* !_ELF32_COMPAT */
238 extern int elf32exec(vnode_t
*, execa_t
*, uarg_t
*, intpdata_t
*, int,
239 long *, int, caddr_t
, cred_t
*, int);
240 extern int mapexec32_brand(vnode_t
*, uarg_t
*, Elf32_Ehdr
*, Elf32_Addr
*,
241 intptr_t *, caddr_t
, int *, caddr_t
*, caddr_t
*, size_t *, uintptr_t *);
245 * Utility functions for exec module core routines:
247 extern int core_seg(proc_t
*, vnode_t
*, offset_t
, caddr_t
,
248 size_t, rlim64_t
, cred_t
*);
250 extern int core_write(vnode_t
*, enum uio_seg
, offset_t
,
251 const void *, size_t, rlim64_t
, cred_t
*);
257 extern caddr_t
gettmem(struct exec
*exp
);
258 extern caddr_t
getdmem(struct exec
*exp
);
259 extern ulong_t
getdfile(struct exec
*exp
);
260 extern uint_t
gettfile(struct exec
*exp
);
261 extern void getexinfo(struct exdata
*edp_in
, struct exdata
*edp_out
,
262 int *pagetext
, int *pagedata
);
270 #endif /* _SYS_EXEC_H */