syscall man page on OpenBSD

Man page or keyword search:  
man Server   11362 pages
apropos Keyword Search (all sections)
Output format
OpenBSD logo
[printable version]

SYSCALL(9)		     OpenBSD Kernel Manual		    SYSCALL(9)

NAME
     syscall - system calls overview

DESCRIPTION
     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
			 structure;
	     INDIR	 included, but don't define the syscall args
			 structure, 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
     argument list, and alias is an optional name alias for the call.  The
     function in the prototype has to be defined somewhere in the kernel
     sources as it will be used as an entry point for the corresponding system
     call.

     For other types the rest of the line is a comment.

     To generate the header and code files from the ``master'' file a make(1)
     command has to be run from the directory containing the ``master'' file.

   Usage
     Entry from the user space for the system call is machine dependent.
     Typical code to invoke a system call from the machine dependent sources
     might look like this:

		   const struct sysent *callp;
		   register_t code, args[8], rval[2];
		   struct proc *p = curproc;
		   int code, nsys;

	   ...

	   /* ``code'' is the system call number passed from the user space */

	   ...

	   if (code < 0 || code >= nsys)
		   callp += p->p_emul->e_nosys;	   /* illegal */
	   else
		   callp += code;

	   /* copyin the arguments from the user space */
	   ...

	   #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
	   #endif
			   error = (*callp->sy_call)(p, args, rval);
		   switch (error) {
		   case 0:
			   /* normal return */
			   ...
			   break;
		   case ERESTART:
			   /*
			    * adjust PC to point before the system call
			    * in the user space in order for the return
			    * back there we reenter the kernel to repeat
			    * the same system call
			    */
			   ...
			   break;
		   case EJUSTRETURN:
			   /* just return */
			   break;
		   default:
			   /*
			    * an error returned:
			    *	   call an optional emulation errno mapping
			    *	   routine and return back to the user.
			    */
			   if (p->p_emul->e_errno)
				   error = p->p_emul->e_errno[error];
			   ...
			   break;
		   }
	   #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.

   Debugging
     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
     implemented and non-implemented system calls.  A global integer variable
     ``scdebug'' 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.

CODE REFERENCES
     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.

SEE ALSO
     ktrace(2), syscall(2), systrace(4), ktrace(9), sysctl_int(9), systrace(9)

HISTORY
     The syscall section manual page appeared in OpenBSD 3.4.

OpenBSD 4.9		      September 19, 2010		   OpenBSD 4.9
[top]

List of man pages available for OpenBSD

Copyright (c) for man pages and the logo by the respective OS vendor.

For those who want to learn more, the polarhome community provides shell access and support.

[legal] [privacy] [GNU] [policy] [cookies] [netiquette] [sponsors] [FAQ]
Tweet
Polarhome, production since 1999.
Member of Polarhome portal.
Based on Fawad Halim's script.
....................................................................
Vote for polarhome
Free Shell Accounts :: the biggest list on the net