usr/src/uts/common/sys/exec.h
changeset 0 68f95e015346
child 1335 99d6f0945b8f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/uts/common/sys/exec.h	Tue Jun 14 00:00:00 2005 -0700
@@ -0,0 +1,244 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
+/*	  All Rights Reserved  	*/
+
+
+#ifndef _SYS_EXEC_H
+#define	_SYS_EXEC_H
+
+#pragma ident	"%Z%%M%	%I%	%E% SMI"
+
+#include <sys/systm.h>
+#include <vm/seg.h>
+#include <vm/seg_vn.h>
+#include <sys/model.h>
+#include <sys/uio.h>
+#include <sys/corectl.h>
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+/*
+ * Number of bytes to read for magic string
+ */
+#define	MAGIC_BYTES	8
+
+#define	getexmag(x)	(((x)[0] << 8) + (x)[1])
+
+typedef struct execa {
+	const char *fname;
+	const char **argp;
+	const char **envp;
+} execa_t;
+
+typedef struct execenv {
+	caddr_t ex_bssbase;
+	caddr_t ex_brkbase;
+	size_t	ex_brksize;
+	vnode_t *ex_vp;
+	short   ex_magic;
+} execenv_t;
+
+#ifdef _KERNEL
+
+#define	LOADABLE_EXEC(e)	((e)->exec_lock)
+#define	LOADED_EXEC(e)		((e)->exec_func)
+
+extern int nexectype;		/* number of elements in execsw */
+extern struct execsw execsw[];
+extern kmutex_t execsw_lock;
+
+/*
+ * User argument structure for passing exec information around between the
+ * common and machine-dependent portions of exec and the exec modules.
+ */
+typedef struct uarg {
+	ssize_t	na;
+	ssize_t	ne;
+	ssize_t	nc;
+	ssize_t arglen;
+	char	*fname;
+	char	*pathname;
+	ssize_t	auxsize;
+	caddr_t	stackend;
+	size_t	stk_align;
+	size_t	stk_size;
+	char	*stk_base;
+	char	*stk_strp;
+	int	*stk_offp;
+	size_t	usrstack_size;
+	uint_t	stk_prot;
+	uint_t	dat_prot;
+	int	traceinval;
+	model_t	to_model;
+	model_t	from_model;
+	size_t	to_ptrsize;
+	size_t	from_ptrsize;
+	size_t	ncargs;
+	struct execsw *execswp;
+	uint_t	stkpageszc;
+	uint_t	brkpageszc;
+	uintptr_t entry;
+	uintptr_t thrptr;
+} uarg_t;
+
+/*
+ * The following macro is a machine dependent encapsulation of
+ * postfix processing to hide the stack direction from elf.c
+ * thereby making the elf.c code machine independent.
+ */
+#define	execpoststack(ARGS, ARRAYADDR, BYTESIZE) \
+	(copyout((caddr_t)(ARRAYADDR), (ARGS)->stackend, (BYTESIZE)) ? EFAULT \
+		: (((ARGS)->stackend += (BYTESIZE)), 0))
+
+/*
+ * This provides the current user stack address for an object of size BYTESIZE.
+ * Used to determine the stack address just before applying execpoststack().
+ */
+#define	stackaddress(ARGS, BYTESIZE)	((ARGS)->stackend)
+
+/*
+ * Macro to add attribute/values the aux vector under construction.
+ */
+/* BEGIN CSTYLED */
+#if ((_LONG_ALIGNMENT == (2 * _INT_ALIGNMENT)) || \
+     (_POINTER_ALIGNMENT == (2 * _INT_ALIGNMENT)))
+/* END CSTYLED */
+/*
+ * This convoluted stuff is necessitated by the fact that there is
+ * potential padding in the aux vector, but not necessarily and
+ * without clearing the padding there is a small, but potential
+ * security hole.
+ */
+#define	ADDAUX(p, a, v)	{		\
+		(&(p)->a_type)[1] = 0;	\
+		(p)->a_type = (a);	\
+		(p)->a_un.a_val = (v);	\
+		++(p);			\
+	}
+#else
+#define	ADDAUX(p, a, v)	{			\
+		(p)->a_type = (a);		\
+		((p)++)->a_un.a_val = (v);	\
+	}
+#endif
+
+#define	INTPSZ	MAXPATHLEN
+typedef struct intpdata {
+	char	*intp;
+	char	*intp_name;
+	char	*intp_arg;
+} intpdata_t;
+
+struct execsw {
+	char	*exec_magic;
+	int	exec_magoff;
+	int	exec_maglen;
+	int	(*exec_func)(struct vnode *vp, struct execa *uap,
+		    struct uarg *args, struct intpdata *idata, int level,
+		    long *execsz, int setid, caddr_t exec_file,
+		    struct cred *cred);
+	int	(*exec_core)(struct vnode *vp, struct proc *p,
+		    struct cred *cred, rlim64_t rlimit, int sig,
+		    core_content_t content);
+	krwlock_t	*exec_lock;
+};
+
+extern short elfmagic;
+extern short intpmagic;
+extern short javamagic;
+#if defined(__sparc)
+extern short aout_zmagic;
+extern short aout_nmagic;
+extern short aout_omagic;
+#endif
+extern short nomagic;
+
+extern char elf32magicstr[];
+extern char elf64magicstr[];
+extern char intpmagicstr[];
+extern char javamagicstr[];
+#if defined(__sparc)
+extern char aout_nmagicstr[];
+extern char aout_zmagicstr[];
+extern char aout_omagicstr[];
+#endif
+extern char nomagicstr[];
+
+extern int exec_args(execa_t *, uarg_t *, intpdata_t *, void **);
+extern int exec(const char *fname, const char **argp);
+extern int exece(const char *fname, const char **argp, const char **envp);
+extern int exec_common(const char *fname, const char **argp,
+    const char **envp);
+extern int gexec(vnode_t **vp, struct execa *uap, struct uarg *args,
+    struct intpdata *idata, int level, long *execsz, caddr_t exec_file,
+    struct cred *cred);
+extern struct execsw *allocate_execsw(char *name, char *magic,
+    size_t magic_size);
+extern struct execsw *findexecsw(char *magic);
+extern struct execsw *findexec_by_hdr(char *header);
+extern struct execsw *findexec_by_magic(char *magic);
+extern int execpermissions(struct vnode *vp, struct vattr *vattrp,
+    struct uarg *args);
+extern int execmap(vnode_t *vp, caddr_t addr, size_t len, size_t zfodlen,
+    off_t offset, int prot, int page, uint_t);
+extern void setexecenv(struct execenv *ep);
+extern int execopen(struct vnode **vpp, int *fdp);
+extern int execclose(int fd);
+extern void setregs(uarg_t *);
+extern void exec_set_sp(size_t);
+
+/*
+ * Utility functions for exec module core routines:
+ */
+extern int core_seg(proc_t *, vnode_t *, offset_t, caddr_t,
+    size_t, rlim64_t, cred_t *);
+
+extern int core_write(vnode_t *, enum uio_seg, offset_t,
+    const void *, size_t, rlim64_t, cred_t *);
+
+/* a.out stuff */
+
+struct exec;
+
+extern caddr_t gettmem(struct exec *exp);
+extern caddr_t getdmem(struct exec *exp);
+extern ulong_t getdfile(struct exec *exp);
+extern uint_t gettfile(struct exec *exp);
+extern int chkaout(struct exdata *exp);
+extern void getexinfo(struct exdata *edp_in, struct exdata *edp_out,
+    int *pagetext, int *pagedata);
+
+#endif	/* _KERNEL */
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif /* _SYS_EXEC_H */