SYSCALL(9) BSD Kernel Manual SYSCALL(9)
syscall - system calls overview
System calls in the kernel are implemented through a set of switch tables for each emulation type. Each table is generated from the "master" file by sys/kern/makesyscalls.sh through the appropriate rules in the Makefile. The "master" file is a text file consisting of a list of lines for each system call. Lines may be split by the means of back slashing the end of the line. Each line is a set of fields separated by whitespace: number type ... Where: number is the system call number; type is one of: STD always included; OBSOL obsolete, not included in the system; UNIMPL unimplemented, not included in the system; NODEF included, but don't define the syscall number; NOARGS included, but don't define the syscall args struc- ture; INDIR included, but don't define the syscall args struc- ture, and allow it to be "really" varargs; COMPAT_XX a compatibility system call, only included if the corresponding option is configured for the kernel (see options(4)). The rest of the line for the STD, NODEF, NOARGS, and COMPAT_XX types is: { pseudo-proto } [alias] pseudo-proto is a C-like prototype used to generate the system call argu- ment.
Entry from the user space for the system call is machine dependent. Typi- cal code to invoke a system call from the machine dependent sources might look like this: */ ... #ifdef SYSCALL_DEBUG scdebug_call(p, code, args); #endif #ifdef KTRACE if (KTRPOINT(p, KTR_SYSCALL)) ktrsyscall(p, code, argsize, args); #endif rval[0] = 0; #if NSYSTRACE > 0 if (ISSET(p->p_flag, P_SYSTRACE)) error = systrace_redirect(code, p, args, rval); else ; } #ifdef SYSCALL_DEBUG scdebug_ret(p, code, orig_error, rval); #endif userret(p, frame.tf_eip, sticks); #ifdef KTRACE if (KTRPOINT(p, KTR_SYSRET)) ktrsysret(p, code, orig_error, rval[0]); #endif The "SYSCALL_DEBUG" parts of the code are explained in the section Debugging later in the document. For the "KTRACE" portions of the code refer to the ktrace(9) document for further explanations. "NSYSTRACE" is a system call tracing facility and is explained in the systrace(9) and systrace(4) documents.
For debugging purposes the line option SYSCALL_DEBUG should be included in the kernel configuration file (see options(4)). This allows tracing for calls, returns, and arguments for both implement- ed and non-implemented system calls. A global integer variable contains a mask for the desired logging events: SCDEBUG_CALLS (0x0001) show calls; SCDEBUG_RETURNS (0x0002) show returns; SCDEBUG_ALL (0x0004) show even syscalls that are implemented; SCDEBUG_SHOWARGS (0x0008) show arguments to calls. Use ddb(4) to set the "scdebug" to a value desired.
sys/kern/makesyscalls.sh a sh(1) script for generating C files out of the syscall master file; sys/{kern,compat/*}/syscalls.conf a configuration file for the shell script above; sys/{kern,compat/*}/syscalls.master master files describing names and numbers for the system calls; sys/{kern/,compat/*/*_}syscalls.c system call names lists; sys/{kern/init,compat/*/*}_sysent.c system call switch tables; sys/{sys/,compat/*/*_}syscallargs.h system call argument lists; sys/{sys/,compat/*/*_}syscall.h system call numbers.
ktrace(2), syscall(2), systrace(4), ktrace(9), systrace(9)
The syscall section manual page appeared in OpenBSD 3.4. MirOS BSD #10-current July 21,.