sysent.h revision 204552
12255Ssos/*-
22255Ssos * Copyright (c) 1982, 1988, 1991 The Regents of the University of California.
32255Ssos * All rights reserved.
42255Ssos *
52255Ssos * Redistribution and use in source and binary forms, with or without
62255Ssos * modification, are permitted provided that the following conditions
72255Ssos * are met:
82255Ssos * 1. Redistributions of source code must retain the above copyright
92255Ssos *    notice, this list of conditions and the following disclaimer.
102255Ssos * 2. Redistributions in binary form must reproduce the above copyright
112255Ssos *    notice, this list of conditions and the following disclaimer in the
122255Ssos *    documentation and/or other materials provided with the distribution.
132255Ssos * 4. Neither the name of the University nor the names of its contributors
142255Ssos *    may be used to endorse or promote products derived from this software
152255Ssos *    without specific prior written permission.
162255Ssos *
172255Ssos * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
182255Ssos * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
192255Ssos * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
202255Ssos * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
212255Ssos * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
222255Ssos * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
232255Ssos * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
242255Ssos * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
252255Ssos * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
262255Ssos * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
272255Ssos * SUCH DAMAGE.
282255Ssos *
2950477Speter * $FreeBSD: head/sys/sys/sysent.h 204552 2010-03-02 06:58:58Z alfred $
302255Ssos */
312255Ssos
322255Ssos#ifndef _SYS_SYSENT_H_
3314917Sbde#define	_SYS_SYSENT_H_
342255Ssos
35146782Srwatson#include <bsm/audit.h>
36146782Srwatson
37169565Sjhbstruct rlimit;
38160941Sjbstruct sysent;
3983366Sjulianstruct thread;
40151316Sdavidxustruct ksiginfo;
4133054Sbde
4292719Salfredtypedef	int	sy_call_t(struct thread *, void *);
4310905Sbde
44160941Sjb/* Used by the machine dependent syscall() code. */
45160941Sjbtypedef	void (*systrace_probe_func_t)(u_int32_t, int, struct sysent *, void *);
46160941Sjb
47160941Sjb/*
48160941Sjb * Used by loaded syscalls to convert arguments to a DTrace array
49160941Sjb * of 64-bit arguments.
50160941Sjb */
51184698Srodrigctypedef	void (*systrace_args_func_t)(int, void *, u_int64_t *, int *);
52160941Sjb
53160941Sjbextern systrace_probe_func_t	systrace_probe_func;
54160941Sjb
55183159Sjhbstruct sysent {			/* system call table */
562255Ssos	int	sy_narg;	/* number of arguments */
5710905Sbde	sy_call_t *sy_call;	/* implementing function */
58146782Srwatson	au_event_t sy_auevent;	/* audit event associated with syscall */
59160941Sjb	systrace_args_func_t sy_systrace_args_func;
60160941Sjb				/* optional argument conversion function. */
61183159Sjhb	u_int32_t sy_entry;	/* DTrace entry ID for systrace. */
62183159Sjhb	u_int32_t sy_return;	/* DTrace return ID for systrace. */
63193234Srwatson	u_int32_t sy_flags;	/* General flags for system calls. */
642255Ssos};
6558717Sdillon
6610905Sbdestruct image_params;
6755152Sbdestruct __sigset;
6814331Speterstruct trapframe;
6950791Smarcelstruct vnode;
7010905Sbde
712255Ssosstruct sysentvec {
722255Ssos	int		sv_size;	/* number of entries */
732255Ssos	struct sysent	*sv_table;	/* pointer to sysent */
7414917Sbde	u_int		sv_mask;	/* optional mask to index */
753472Ssos	int		sv_sigsize;	/* size of signal translation table */
763472Ssos	int		*sv_sigtbl;	/* signal translation table */
7715036Ssmpatel	int		sv_errsize;	/* size of errno translation table */
783472Ssos	int 		*sv_errtbl;	/* errno translation table */
7992719Salfred	int		(*sv_transtrap)(int, int);
8035496Seivind					/* translate trap-to-signal mapping */
8192719Salfred	int		(*sv_fixup)(register_t **, struct image_params *);
8210905Sbde					/* stack fixup function */
83151316Sdavidxu	void		(*sv_sendsig)(void (*)(int), struct ksiginfo *, struct __sigset *);
84151316Sdavidxu			    		/* send signal */
8514331Speter	char 		*sv_sigcode;	/* start of sigtramp code */
8614331Speter	int 		*sv_szsigcode;	/* size of sigtramp code */
8793008Sbde	void		(*sv_prepsyscall)(struct trapframe *, int *, u_int *,
8893008Sbde			    caddr_t *);
8916474Sdyson	char		*sv_name;	/* name of binary type */
90204552Salfred	int		(*sv_coredump)(struct thread *, struct vnode *, off_t, int);
9139154Sjdp					/* function to dump core, or NULL */
9292719Salfred	int		(*sv_imgact_try)(struct image_params *);
9368520Smarcel	int		sv_minsigstksz;	/* minimum signal stack size */
94102808Sjake	int		sv_pagesize;	/* pagesize */
95102808Sjake	vm_offset_t	sv_minuser;	/* VM_MIN_ADDRESS */
96102808Sjake	vm_offset_t	sv_maxuser;	/* VM_MAXUSER_ADDRESS */
97102808Sjake	vm_offset_t	sv_usrstack;	/* USRSTACK */
98102808Sjake	vm_offset_t	sv_psstrings;	/* PS_STRINGS */
99102808Sjake	int		sv_stackprot;	/* vm protection for stack */
100100384Speter	register_t	*(*sv_copyout_strings)(struct image_params *);
101100384Speter	void		(*sv_setregs)(struct thread *, u_long, u_long, u_long);
102169565Sjhb	void		(*sv_fixlimit)(struct rlimit *, int);
103171410Sjhb	u_long		*sv_maxssiz;
104185169Skib	u_int		sv_flags;
1052255Ssos};
1062255Ssos
107185169Skib#define	SV_ILP32	0x000100
108185169Skib#define	SV_LP64		0x000200
109185169Skib#define	SV_IA32		0x004000
110185169Skib#define	SV_AOUT		0x008000
111185169Skib
112185169Skib#define	SV_ABI_MASK	0xff
113185169Skib#define	SV_CURPROC_FLAG(x) (curproc->p_sysent->sv_flags & (x))
114185169Skib#define	SV_CURPROC_ABI() (curproc->p_sysent->sv_flags & SV_ABI_MASK)
115185169Skib/* same as ELFOSABI_XXX, to prevent header pollution */
116185169Skib#define	SV_ABI_LINUX	3
117185169Skib#define	SV_ABI_FREEBSD 	9
118185169Skib#define	SV_ABI_UNDEF	255
119185169Skib
12055205Speter#ifdef _KERNEL
1217090Sbdeextern struct sysentvec aout_sysvec;
12268356Sobrienextern struct sysentvec elf_freebsd_sysvec;
123102808Sjakeextern struct sysentvec null_sysvec;
1242255Ssosextern struct sysent sysent[];
1252255Ssos
126183159Sjhb#define	NO_SYSCALL (-1)
12742433Sdfr
12842433Sdfrstruct module;
12942433Sdfr
13042433Sdfrstruct syscall_module_data {
131183159Sjhb	int	(*chainevh)(struct module *, int, void *); /* next handler */
132183159Sjhb	void	*chainarg;		/* arg for next event handler */
133183159Sjhb	int	*offset;		/* offset into sysent */
134183159Sjhb	struct sysent *new_sysent;	/* new sysent */
135183159Sjhb	struct sysent old_sysent;	/* old sysent */
13642433Sdfr};
13742433Sdfr
138183159Sjhb#define	MAKE_SYSENT(syscallname)				\
139183159Sjhbstatic struct sysent syscallname##_sysent = {			\
140183159Sjhb	(sizeof(struct syscallname ## _args )			\
141183159Sjhb	    / sizeof(register_t)),				\
142183159Sjhb	(sy_call_t *)& syscallname,				\
143183159Sjhb	SYS_AUE_##syscallname					\
144168268Sjhb}
145183159Sjhb
146183159Sjhb#define SYSCALL_MODULE(name, offset, new_sysent, evh, arg)	\
147183159Sjhbstatic struct syscall_module_data name##_syscall_mod = {	\
148183159Sjhb	evh, arg, offset, new_sysent, { 0, NULL, AUE_NULL }	\
149183159Sjhb};								\
150183159Sjhb								\
151183159Sjhbstatic moduledata_t name##_mod = {				\
152183159Sjhb	#name,							\
153183159Sjhb	syscall_module_handler,					\
154183159Sjhb	&name##_syscall_mod					\
155183159Sjhb};								\
156160882SjhbDECLARE_MODULE(name, name##_mod, SI_SUB_SYSCALLS, SI_ORDER_MIDDLE)
15742433Sdfr
158183159Sjhb#define	SYSCALL_MODULE_HELPER(syscallname)			\
159183159Sjhbstatic int syscallname##_syscall = SYS_##syscallname;		\
160183159SjhbMAKE_SYSENT(syscallname);					\
161183159SjhbSYSCALL_MODULE(syscallname,					\
162183159Sjhb    & syscallname##_syscall, & syscallname##_sysent,		\
163183159Sjhb    NULL, NULL)
16469449Salfred
165183159Sjhb#define	SYSCALL_MODULE_PRESENT(syscallname)				\
166183159Sjhb	(sysent[SYS_##syscallname].sy_call != (sy_call_t *)lkmnosys &&	\
167183159Sjhb	sysent[SYS_##syscallname].sy_call != (sy_call_t *)lkmressys)
168165402Sjkim
169183159Sjhbint	syscall_register(int *offset, struct sysent *new_sysent,
17093008Sbde	    struct sysent *old_sysent);
171183159Sjhbint	syscall_deregister(int *offset, struct sysent *old_sysent);
172183159Sjhbint	syscall_module_handler(struct module *mod, int what, void *arg);
17342433Sdfr
174183361Sjhb/* Special purpose system call functions. */
175183361Sjhbstruct nosys_args;
176183361Sjhb
177183361Sjhbint	lkmnosys(struct thread *, struct nosys_args *);
178183361Sjhbint	lkmressys(struct thread *, struct nosys_args *);
179183361Sjhb
18055205Speter#endif /* _KERNEL */
18142433Sdfr
18214917Sbde#endif /* !_SYS_SYSENT_H_ */
183