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: stable/11/sys/sys/sysent.h 346815 2019-04-28 13:16:54Z dchagin $ 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; 41292388Smarkjstruct syscall_args; 4233054Sbde 43292388Smarkjenum systrace_probe_t { 44292388Smarkj SYSTRACE_ENTRY, 45292388Smarkj SYSTRACE_RETURN, 46292388Smarkj}; 47292388Smarkj 4892719Salfredtypedef int sy_call_t(struct thread *, void *); 4910905Sbde 50292388Smarkjtypedef void (*systrace_probe_func_t)(struct syscall_args *, 51292388Smarkj enum systrace_probe_t, int); 52292388Smarkjtypedef void (*systrace_args_func_t)(int, void *, uint64_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 79273707Smjg#ifdef KLD_MODULE 80273707Smjg#define SY_THR_STATIC_KLD 0 81273707Smjg#else 82273707Smjg#define SY_THR_STATIC_KLD SY_THR_STATIC 83273707Smjg#endif 84273707Smjg 8510905Sbdestruct image_params; 8655152Sbdestruct __sigset; 8714331Speterstruct trapframe; 8850791Smarcelstruct vnode; 8910905Sbde 902255Ssosstruct sysentvec { 912255Ssos int sv_size; /* number of entries */ 922255Ssos struct sysent *sv_table; /* pointer to sysent */ 9314917Sbde u_int sv_mask; /* optional mask to index */ 9415036Ssmpatel int sv_errsize; /* size of errno translation table */ 95346815Sdchagin const int *sv_errtbl; /* errno translation table */ 9692719Salfred int (*sv_transtrap)(int, int); 9735496Seivind /* translate trap-to-signal mapping */ 9892719Salfred int (*sv_fixup)(register_t **, struct image_params *); 9910905Sbde /* stack fixup function */ 100151316Sdavidxu void (*sv_sendsig)(void (*)(int), struct ksiginfo *, struct __sigset *); 101151316Sdavidxu /* send signal */ 10214331Speter char *sv_sigcode; /* start of sigtramp code */ 10314331Speter int *sv_szsigcode; /* size of sigtramp code */ 10416474Sdyson char *sv_name; /* name of binary type */ 105204552Salfred int (*sv_coredump)(struct thread *, struct vnode *, off_t, int); 10639154Sjdp /* function to dump core, or NULL */ 10792719Salfred int (*sv_imgact_try)(struct image_params *); 10868520Smarcel int sv_minsigstksz; /* minimum signal stack size */ 109102808Sjake int sv_pagesize; /* pagesize */ 110102808Sjake vm_offset_t sv_minuser; /* VM_MIN_ADDRESS */ 111102808Sjake vm_offset_t sv_maxuser; /* VM_MAXUSER_ADDRESS */ 112102808Sjake vm_offset_t sv_usrstack; /* USRSTACK */ 113102808Sjake vm_offset_t sv_psstrings; /* PS_STRINGS */ 114102808Sjake int sv_stackprot; /* vm protection for stack */ 115100384Speter register_t *(*sv_copyout_strings)(struct image_params *); 116205642Snwhitehorn void (*sv_setregs)(struct thread *, struct image_params *, 117205642Snwhitehorn u_long); 118169565Sjhb void (*sv_fixlimit)(struct rlimit *, int); 119171410Sjhb u_long *sv_maxssiz; 120185169Skib u_int sv_flags; 121208453Skib void (*sv_set_syscall_retval)(struct thread *, int); 122321343Skib int (*sv_fetch_syscall_args)(struct thread *); 123208453Skib const char **sv_syscallnames; 124291171Skib vm_offset_t sv_timekeep_base; 125217151Skib vm_offset_t sv_shared_page_base; 126217151Skib vm_offset_t sv_shared_page_len; 127217151Skib vm_offset_t sv_sigcode_base; 128217151Skib void *sv_shared_page_obj; 129219405Sdchagin void (*sv_schedtail)(struct thread *); 130283382Sdchagin void (*sv_thread_detach)(struct thread *); 131293613Sdchagin int (*sv_trap)(struct thread *); 132324687Sjhb u_long *sv_hwcap; /* Value passed in AT_HWCAP. */ 133325810Sjhb u_long *sv_hwcap2; /* Value passed in AT_HWCAP2. */ 1342255Ssos}; 1352255Ssos 136286229Sed#define SV_ILP32 0x000100 /* 32-bit executable. */ 137286229Sed#define SV_LP64 0x000200 /* 64-bit executable. */ 138286229Sed#define SV_IA32 0x004000 /* Intel 32-bit executable. */ 139286229Sed#define SV_AOUT 0x008000 /* a.out executable. */ 140286229Sed#define SV_SHP 0x010000 /* Shared page. */ 141286229Sed#define SV_CAPSICUM 0x020000 /* Force cap_enter() on startup. */ 142314639Skib#define SV_TIMEKEEP 0x040000 /* Shared page timehands. */ 143324687Sjhb#define SV_HWCAP 0x080000 /* sv_hwcap field is valid. */ 144185169Skib 145185169Skib#define SV_ABI_MASK 0xff 146300415Sdchagin#define SV_ABI_ERRNO(p, e) ((p)->p_sysent->sv_errsize <= 0 ? e : \ 147300415Sdchagin ((e) >= (p)->p_sysent->sv_errsize ? -1 : (p)->p_sysent->sv_errtbl[e])) 148217896Sdchagin#define SV_PROC_FLAG(p, x) ((p)->p_sysent->sv_flags & (x)) 149217896Sdchagin#define SV_PROC_ABI(p) ((p)->p_sysent->sv_flags & SV_ABI_MASK) 150217896Sdchagin#define SV_CURPROC_FLAG(x) SV_PROC_FLAG(curproc, x) 151217896Sdchagin#define SV_CURPROC_ABI() SV_PROC_ABI(curproc) 152185169Skib/* same as ELFOSABI_XXX, to prevent header pollution */ 153185169Skib#define SV_ABI_LINUX 3 154185169Skib#define SV_ABI_FREEBSD 9 155285641Sed#define SV_ABI_CLOUDABI 17 156185169Skib#define SV_ABI_UNDEF 255 157185169Skib 15855205Speter#ifdef _KERNEL 1597090Sbdeextern struct sysentvec aout_sysvec; 1602255Ssosextern struct sysent sysent[]; 161208453Skibextern const char *syscallnames[]; 1622255Ssos 163268351Smarcel#if defined(__amd64__) 164226388Skibextern int i386_read_exec; 165226388Skib#endif 166226388Skib 167183159Sjhb#define NO_SYSCALL (-1) 16842433Sdfr 16942433Sdfrstruct module; 17042433Sdfr 17142433Sdfrstruct syscall_module_data { 172183159Sjhb int (*chainevh)(struct module *, int, void *); /* next handler */ 173183159Sjhb void *chainarg; /* arg for next event handler */ 174183159Sjhb int *offset; /* offset into sysent */ 175183159Sjhb struct sysent *new_sysent; /* new sysent */ 176183159Sjhb struct sysent old_sysent; /* old sysent */ 177273953Smjg int flags; /* flags for syscall_register */ 17842433Sdfr}; 17942433Sdfr 180309391Sjulian/* separate initialization vector so it can be used in a substructure */ 181309391Sjulian#define SYSENT_INIT_VALS(_syscallname) { \ 182309391Sjulian .sy_narg = (sizeof(struct _syscallname ## _args ) \ 183183159Sjhb / sizeof(register_t)), \ 184309391Sjulian .sy_call = (sy_call_t *)&sys_##_syscallname, \ 185309391Sjulian .sy_auevent = SYS_AUE_##_syscallname, \ 186309391Sjulian .sy_systrace_args_func = NULL, \ 187309391Sjulian .sy_entry = 0, \ 188309391Sjulian .sy_return = 0, \ 189309391Sjulian .sy_flags = 0, \ 190309391Sjulian .sy_thrcnt = 0 \ 191309391Sjulian} 192225617Skmacy 193309391Sjulian#define MAKE_SYSENT(syscallname) \ 194309391Sjulianstatic struct sysent syscallname##_sysent = SYSENT_INIT_VALS(syscallname); 195309391Sjulian 196225617Skmacy#define MAKE_SYSENT_COMPAT(syscallname) \ 197225617Skmacystatic struct sysent syscallname##_sysent = { \ 198225617Skmacy (sizeof(struct syscallname ## _args ) \ 199225617Skmacy / sizeof(register_t)), \ 200209587Skib (sy_call_t *)& syscallname, \ 201209587Skib SYS_AUE_##syscallname \ 202168268Sjhb} 203183159Sjhb 204183159Sjhb#define SYSCALL_MODULE(name, offset, new_sysent, evh, arg) \ 205183159Sjhbstatic struct syscall_module_data name##_syscall_mod = { \ 206183159Sjhb evh, arg, offset, new_sysent, { 0, NULL, AUE_NULL } \ 207183159Sjhb}; \ 208183159Sjhb \ 209183159Sjhbstatic moduledata_t name##_mod = { \ 210205320Skib "sys/" #name, \ 211183159Sjhb syscall_module_handler, \ 212183159Sjhb &name##_syscall_mod \ 213183159Sjhb}; \ 214160882SjhbDECLARE_MODULE(name, name##_mod, SI_SUB_SYSCALLS, SI_ORDER_MIDDLE) 21542433Sdfr 216183159Sjhb#define SYSCALL_MODULE_HELPER(syscallname) \ 217183159Sjhbstatic int syscallname##_syscall = SYS_##syscallname; \ 218183159SjhbMAKE_SYSENT(syscallname); \ 219183159SjhbSYSCALL_MODULE(syscallname, \ 220183159Sjhb & syscallname##_syscall, & syscallname##_sysent, \ 221183159Sjhb NULL, NULL) 22269449Salfred 223183159Sjhb#define SYSCALL_MODULE_PRESENT(syscallname) \ 224183159Sjhb (sysent[SYS_##syscallname].sy_call != (sy_call_t *)lkmnosys && \ 225183159Sjhb sysent[SYS_##syscallname].sy_call != (sy_call_t *)lkmressys) 226165402Sjkim 227205321Skib/* 228205321Skib * Syscall registration helpers with resource allocation handling. 229205321Skib */ 230205321Skibstruct syscall_helper_data { 231205321Skib struct sysent new_sysent; 232205321Skib struct sysent old_sysent; 233205321Skib int syscall_no; 234205321Skib int registered; 235205321Skib}; 236321322Skib#define SYSCALL_INIT_HELPER_F(syscallname, flags) { \ 237205321Skib .new_sysent = { \ 238205321Skib .sy_narg = (sizeof(struct syscallname ## _args ) \ 239205321Skib / sizeof(register_t)), \ 240225617Skmacy .sy_call = (sy_call_t *)& sys_ ## syscallname, \ 241321322Skib .sy_auevent = SYS_AUE_##syscallname, \ 242321322Skib .sy_flags = (flags) \ 243225617Skmacy }, \ 244225617Skmacy .syscall_no = SYS_##syscallname \ 245225617Skmacy} 246321322Skib#define SYSCALL_INIT_HELPER_COMPAT_F(syscallname, flags) { \ 247225617Skmacy .new_sysent = { \ 248225617Skmacy .sy_narg = (sizeof(struct syscallname ## _args ) \ 249225617Skmacy / sizeof(register_t)), \ 250205321Skib .sy_call = (sy_call_t *)& syscallname, \ 251321322Skib .sy_auevent = SYS_AUE_##syscallname, \ 252321322Skib .sy_flags = (flags) \ 253205321Skib }, \ 254205321Skib .syscall_no = SYS_##syscallname \ 255205321Skib} 256321322Skib#define SYSCALL_INIT_HELPER(syscallname) \ 257321322Skib SYSCALL_INIT_HELPER_F(syscallname, 0) 258321322Skib#define SYSCALL_INIT_HELPER_COMPAT(syscallname) \ 259321322Skib SYSCALL_INIT_HELPER_COMPAT_F(syscallname, 0) 260205321Skib#define SYSCALL_INIT_LAST { \ 261205321Skib .syscall_no = NO_SYSCALL \ 262205321Skib} 263205321Skib 264183159Sjhbint syscall_register(int *offset, struct sysent *new_sysent, 265273707Smjg struct sysent *old_sysent, int flags); 266183159Sjhbint syscall_deregister(int *offset, struct sysent *old_sysent); 267183159Sjhbint syscall_module_handler(struct module *mod, int what, void *arg); 268273707Smjgint syscall_helper_register(struct syscall_helper_data *sd, int flags); 269205321Skibint syscall_helper_unregister(struct syscall_helper_data *sd); 27042433Sdfr 271208566Skibstruct proc; 272208566Skibconst char *syscallname(struct proc *p, u_int code); 273208566Skib 274183361Sjhb/* Special purpose system call functions. */ 275183361Sjhbstruct nosys_args; 276183361Sjhb 277183361Sjhbint lkmnosys(struct thread *, struct nosys_args *); 278183361Sjhbint lkmressys(struct thread *, struct nosys_args *); 279183361Sjhb 280209579Skibint syscall_thread_enter(struct thread *td, struct sysent *se); 281209579Skibvoid syscall_thread_exit(struct thread *td, struct sysent *se); 282209579Skib 283237431Skibint shared_page_alloc(int size, int align); 284237431Skibint shared_page_fill(int size, int align, const void *data); 285237431Skibvoid shared_page_write(int base, int size, const void *data); 286217151Skibvoid exec_sysvec_init(void *param); 287291171Skibvoid exec_inittk(void); 288217151Skib 289217151Skib#define INIT_SYSENTVEC(name, sv) \ 290217151Skib SYSINIT(name, SI_SUB_EXEC, SI_ORDER_ANY, \ 291217151Skib (sysinit_cfunc_t)exec_sysvec_init, sv); 292217151Skib 29355205Speter#endif /* _KERNEL */ 29442433Sdfr 29514917Sbde#endif /* !_SYS_SYSENT_H_ */ 296