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$ 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. */ 45211608Srpaulotypedef void (*systrace_probe_func_t)(u_int32_t, int, struct sysent *, void *, 46211608Srpaulo int); 47160941Sjb 48160941Sjb/* 49160941Sjb * Used by loaded syscalls to convert arguments to a DTrace array 50160941Sjb * of 64-bit arguments. 51160941Sjb */ 52184698Srodrigctypedef void (*systrace_args_func_t)(int, void *, u_int64_t *, int *); 53160941Sjb 54160941Sjbextern systrace_probe_func_t systrace_probe_func; 55160941Sjb 56183159Sjhbstruct sysent { /* system call table */ 572255Ssos int sy_narg; /* number of arguments */ 5810905Sbde sy_call_t *sy_call; /* implementing function */ 59146782Srwatson au_event_t sy_auevent; /* audit event associated with syscall */ 60160941Sjb systrace_args_func_t sy_systrace_args_func; 61160941Sjb /* optional argument conversion function. */ 62183159Sjhb u_int32_t sy_entry; /* DTrace entry ID for systrace. */ 63183159Sjhb u_int32_t sy_return; /* DTrace return ID for systrace. */ 64193234Srwatson u_int32_t sy_flags; /* General flags for system calls. */ 65209579Skib u_int32_t sy_thrcnt; 662255Ssos}; 6758717Sdillon 68219131Srwatson/* 69219131Srwatson * A system call is permitted in capability mode. 70219131Srwatson */ 71219131Srwatson#define SYF_CAPENABLED 0x00000001 72219131Srwatson 73209579Skib#define SY_THR_FLAGMASK 0x7 74209579Skib#define SY_THR_STATIC 0x1 75209579Skib#define SY_THR_DRAINING 0x2 76209579Skib#define SY_THR_ABSENT 0x4 77209579Skib#define SY_THR_INCR 0x8 78209579Skib 7910905Sbdestruct image_params; 8055152Sbdestruct __sigset; 81208453Skibstruct syscall_args; 8214331Speterstruct trapframe; 8350791Smarcelstruct vnode; 8410905Sbde 852255Ssosstruct sysentvec { 862255Ssos int sv_size; /* number of entries */ 872255Ssos struct sysent *sv_table; /* pointer to sysent */ 8814917Sbde u_int sv_mask; /* optional mask to index */ 893472Ssos int sv_sigsize; /* size of signal translation table */ 903472Ssos int *sv_sigtbl; /* signal translation table */ 9115036Ssmpatel int sv_errsize; /* size of errno translation table */ 923472Ssos int *sv_errtbl; /* errno translation table */ 9392719Salfred int (*sv_transtrap)(int, int); 9435496Seivind /* translate trap-to-signal mapping */ 9592719Salfred int (*sv_fixup)(register_t **, struct image_params *); 9610905Sbde /* stack fixup function */ 97151316Sdavidxu void (*sv_sendsig)(void (*)(int), struct ksiginfo *, struct __sigset *); 98151316Sdavidxu /* send signal */ 9914331Speter char *sv_sigcode; /* start of sigtramp code */ 10014331Speter int *sv_szsigcode; /* size of sigtramp code */ 10193008Sbde void (*sv_prepsyscall)(struct trapframe *, int *, u_int *, 10293008Sbde caddr_t *); 10316474Sdyson char *sv_name; /* name of binary type */ 104204552Salfred int (*sv_coredump)(struct thread *, struct vnode *, off_t, int); 10539154Sjdp /* function to dump core, or NULL */ 10692719Salfred int (*sv_imgact_try)(struct image_params *); 10768520Smarcel int sv_minsigstksz; /* minimum signal stack size */ 108102808Sjake int sv_pagesize; /* pagesize */ 109102808Sjake vm_offset_t sv_minuser; /* VM_MIN_ADDRESS */ 110102808Sjake vm_offset_t sv_maxuser; /* VM_MAXUSER_ADDRESS */ 111102808Sjake vm_offset_t sv_usrstack; /* USRSTACK */ 112102808Sjake vm_offset_t sv_psstrings; /* PS_STRINGS */ 113102808Sjake int sv_stackprot; /* vm protection for stack */ 114100384Speter register_t *(*sv_copyout_strings)(struct image_params *); 115205642Snwhitehorn void (*sv_setregs)(struct thread *, struct image_params *, 116205642Snwhitehorn u_long); 117169565Sjhb void (*sv_fixlimit)(struct rlimit *, int); 118171410Sjhb u_long *sv_maxssiz; 119185169Skib u_int sv_flags; 120208453Skib void (*sv_set_syscall_retval)(struct thread *, int); 121208453Skib int (*sv_fetch_syscall_args)(struct thread *, struct 122208453Skib syscall_args *); 123208453Skib const char **sv_syscallnames; 124217151Skib vm_offset_t sv_shared_page_base; 125217151Skib vm_offset_t sv_shared_page_len; 126217151Skib vm_offset_t sv_sigcode_base; 127237433Skib vm_offset_t sv_timekeep_base; 128237433Skib int sv_timekeep_off; 129237433Skib int sv_timekeep_curr; 130237433Skib uint32_t sv_timekeep_gen; 131217151Skib void *sv_shared_page_obj; 132219405Sdchagin void (*sv_schedtail)(struct thread *); 1332255Ssos}; 1342255Ssos 135185169Skib#define SV_ILP32 0x000100 136185169Skib#define SV_LP64 0x000200 137185169Skib#define SV_IA32 0x004000 138185169Skib#define SV_AOUT 0x008000 139217151Skib#define SV_SHP 0x010000 140185169Skib 141185169Skib#define SV_ABI_MASK 0xff 142217896Sdchagin#define SV_PROC_FLAG(p, x) ((p)->p_sysent->sv_flags & (x)) 143217896Sdchagin#define SV_PROC_ABI(p) ((p)->p_sysent->sv_flags & SV_ABI_MASK) 144217896Sdchagin#define SV_CURPROC_FLAG(x) SV_PROC_FLAG(curproc, x) 145217896Sdchagin#define SV_CURPROC_ABI() SV_PROC_ABI(curproc) 146185169Skib/* same as ELFOSABI_XXX, to prevent header pollution */ 147185169Skib#define SV_ABI_LINUX 3 148185169Skib#define SV_ABI_FREEBSD 9 149185169Skib#define SV_ABI_UNDEF 255 150185169Skib 15155205Speter#ifdef _KERNEL 1527090Sbdeextern struct sysentvec aout_sysvec; 15368356Sobrienextern struct sysentvec elf_freebsd_sysvec; 154102808Sjakeextern struct sysentvec null_sysvec; 1552255Ssosextern struct sysent sysent[]; 156208453Skibextern const char *syscallnames[]; 1572255Ssos 158226388Skib#if defined(__amd64__) || defined(__ia64__) 159226388Skibextern int i386_read_exec; 160226388Skib#endif 161226388Skib 162183159Sjhb#define NO_SYSCALL (-1) 16342433Sdfr 16442433Sdfrstruct module; 16542433Sdfr 16642433Sdfrstruct syscall_module_data { 167183159Sjhb int (*chainevh)(struct module *, int, void *); /* next handler */ 168183159Sjhb void *chainarg; /* arg for next event handler */ 169183159Sjhb int *offset; /* offset into sysent */ 170183159Sjhb struct sysent *new_sysent; /* new sysent */ 171183159Sjhb struct sysent old_sysent; /* old sysent */ 17242433Sdfr}; 17342433Sdfr 174183159Sjhb#define MAKE_SYSENT(syscallname) \ 175183159Sjhbstatic struct sysent syscallname##_sysent = { \ 176209587Skib (sizeof(struct syscallname ## _args ) \ 177183159Sjhb / sizeof(register_t)), \ 178225617Skmacy (sy_call_t *)& sys_##syscallname, \ 179225617Skmacy SYS_AUE_##syscallname \ 180225617Skmacy} 181225617Skmacy 182225617Skmacy#define MAKE_SYSENT_COMPAT(syscallname) \ 183225617Skmacystatic struct sysent syscallname##_sysent = { \ 184225617Skmacy (sizeof(struct syscallname ## _args ) \ 185225617Skmacy / sizeof(register_t)), \ 186209587Skib (sy_call_t *)& syscallname, \ 187209587Skib SYS_AUE_##syscallname \ 188168268Sjhb} 189183159Sjhb 190183159Sjhb#define SYSCALL_MODULE(name, offset, new_sysent, evh, arg) \ 191183159Sjhbstatic struct syscall_module_data name##_syscall_mod = { \ 192183159Sjhb evh, arg, offset, new_sysent, { 0, NULL, AUE_NULL } \ 193183159Sjhb}; \ 194183159Sjhb \ 195183159Sjhbstatic moduledata_t name##_mod = { \ 196205320Skib "sys/" #name, \ 197183159Sjhb syscall_module_handler, \ 198183159Sjhb &name##_syscall_mod \ 199183159Sjhb}; \ 200160882SjhbDECLARE_MODULE(name, name##_mod, SI_SUB_SYSCALLS, SI_ORDER_MIDDLE) 20142433Sdfr 202183159Sjhb#define SYSCALL_MODULE_HELPER(syscallname) \ 203183159Sjhbstatic int syscallname##_syscall = SYS_##syscallname; \ 204183159SjhbMAKE_SYSENT(syscallname); \ 205183159SjhbSYSCALL_MODULE(syscallname, \ 206183159Sjhb & syscallname##_syscall, & syscallname##_sysent, \ 207183159Sjhb NULL, NULL) 20869449Salfred 209183159Sjhb#define SYSCALL_MODULE_PRESENT(syscallname) \ 210183159Sjhb (sysent[SYS_##syscallname].sy_call != (sy_call_t *)lkmnosys && \ 211183159Sjhb sysent[SYS_##syscallname].sy_call != (sy_call_t *)lkmressys) 212165402Sjkim 213205321Skib/* 214205321Skib * Syscall registration helpers with resource allocation handling. 215205321Skib */ 216205321Skibstruct syscall_helper_data { 217205321Skib struct sysent new_sysent; 218205321Skib struct sysent old_sysent; 219205321Skib int syscall_no; 220205321Skib int registered; 221205321Skib}; 222205321Skib#define SYSCALL_INIT_HELPER(syscallname) { \ 223205321Skib .new_sysent = { \ 224205321Skib .sy_narg = (sizeof(struct syscallname ## _args ) \ 225205321Skib / sizeof(register_t)), \ 226225617Skmacy .sy_call = (sy_call_t *)& sys_ ## syscallname, \ 227225617Skmacy .sy_auevent = SYS_AUE_##syscallname \ 228225617Skmacy }, \ 229225617Skmacy .syscall_no = SYS_##syscallname \ 230225617Skmacy} 231225617Skmacy#define SYSCALL_INIT_HELPER_COMPAT(syscallname) { \ 232225617Skmacy .new_sysent = { \ 233225617Skmacy .sy_narg = (sizeof(struct syscallname ## _args ) \ 234225617Skmacy / sizeof(register_t)), \ 235205321Skib .sy_call = (sy_call_t *)& syscallname, \ 236205321Skib .sy_auevent = SYS_AUE_##syscallname \ 237205321Skib }, \ 238205321Skib .syscall_no = SYS_##syscallname \ 239205321Skib} 240205321Skib#define SYSCALL_INIT_LAST { \ 241205321Skib .syscall_no = NO_SYSCALL \ 242205321Skib} 243205321Skib 244183159Sjhbint syscall_register(int *offset, struct sysent *new_sysent, 24593008Sbde struct sysent *old_sysent); 246183159Sjhbint syscall_deregister(int *offset, struct sysent *old_sysent); 247183159Sjhbint syscall_module_handler(struct module *mod, int what, void *arg); 248205321Skibint syscall_helper_register(struct syscall_helper_data *sd); 249205321Skibint syscall_helper_unregister(struct syscall_helper_data *sd); 25042433Sdfr 251208566Skibstruct proc; 252208566Skibconst char *syscallname(struct proc *p, u_int code); 253208566Skib 254183361Sjhb/* Special purpose system call functions. */ 255183361Sjhbstruct nosys_args; 256183361Sjhb 257183361Sjhbint lkmnosys(struct thread *, struct nosys_args *); 258183361Sjhbint lkmressys(struct thread *, struct nosys_args *); 259183361Sjhb 260209579Skibint syscall_thread_enter(struct thread *td, struct sysent *se); 261209579Skibvoid syscall_thread_exit(struct thread *td, struct sysent *se); 262209579Skib 263237431Skibint shared_page_alloc(int size, int align); 264237431Skibint shared_page_fill(int size, int align, const void *data); 265237431Skibvoid shared_page_write(int base, int size, const void *data); 266217151Skibvoid exec_sysvec_init(void *param); 267217151Skib 268217151Skib#define INIT_SYSENTVEC(name, sv) \ 269217151Skib SYSINIT(name, SI_SUB_EXEC, SI_ORDER_ANY, \ 270217151Skib (sysinit_cfunc_t)exec_sysvec_init, sv); 271217151Skib 27255205Speter#endif /* _KERNEL */ 27342433Sdfr 27414917Sbde#endif /* !_SYS_SYSENT_H_ */ 275