.\"
.\" 2002-03-20 Christoph Hellwig <hch@infradead.org>
.\" - adopted for Linux
+.\" 2015-01-17, Kees Cook <keescook@chromium.org>
+.\" Added mips and arm64.
.\"
-.TH SYSCALL 2 2013-06-21 "Linux" "Linux Programmer's Manual"
+.TH SYSCALL 2 2015-01-22 "Linux" "Linux Programmer's Manual"
.SH NAME
syscall \- indirect system call
.SH SYNOPSIS
.B #include <unistd.h>
.BR "#include <sys/syscall.h> " "/* For SYS_xxx definitions */"
-.BI "int syscall(int " number ", ...);"
+.BI "long syscall(long " number ", ...);"
.fi
.SH DESCRIPTION
.BR syscall ()
The first table lists the instruction used to transition to kernel mode,
(which might not be the fastest or best way to transition to the kernel,
-so you might have to refer to the VDSO),
+so you might have to refer to
+.BR vdso (7)),
the register used to indicate the system call number,
and the register used to return the system call result.
.if t \{\
arch/ABI instruction syscall # retval Notes
_
arm/OABI swi NR - a1 NR is syscall #
-arm/EABI swi 0x0 r7 r1
+arm/EABI swi 0x0 r7 r0
+arm64 svc #0 x8 x0
blackfin excpt 0x0 P0 R0
i386 int $0x80 eax eax
-ia64 break 0x100000 r15 r10/r8
+ia64 break 0x100000 r15 r8 See below
+mips syscall v0 v0 See below
parisc ble 0x100(%sr2, %r0) r20 r28
-s390 svc 0 r1 r2 NR may be passed directly with
-s390x svc 0 r1 r2 "svc NR" if NR is less than 256
+s390 svc 0 r1 r2 See below
+s390x svc 0 r1 r2 See below
sparc/32 t 0x10 g1 o0
sparc/64 t 0x6d g1 o0
x86_64 syscall rax rax
.TE
+.PP
+For s390 and s390x, NR (the system call number)
+may be passed directly with "svc NR" if it is less than 256.
+
+On a few architectures,
+a register is used to indicate simple boolean failure of the system call:
+ia64 uses
+.I r10
+for this purpose,
+and mips uses
+.IR a3 .
.if t \{\
.in
.ft P
.ft CW
\}
.TS
-l l l l l l l l.
-arch/ABI arg1 arg2 arg3 arg4 arg5 arg6 arg7
+l l2 l2 l2 l2 l2 l2 l2 l.
+arch/ABI arg1 arg2 arg3 arg4 arg5 arg6 arg7 Notes
_
arm/OABI a1 a2 a3 a4 v1 v2 v3
-arm/EABI r1 r2 r3 r4 r5 r6 r7
+arm/EABI r0 r1 r2 r3 r4 r5 r6
+arm64 x0 x1 x2 x3 x4 x5 -
blackfin R0 R1 R2 R3 R4 R5 -
i386 ebx ecx edx esi edi ebp -
-ia64 r11 r9 r10 r14 r15 r13 -
+ia64 out0 out1 out2 out3 out4 out5 -
+mips/o32 a0 a1 a2 a3 - - - See below
+mips/n32,64 a0 a1 a2 a3 a4 a5 -
parisc r26 r25 r24 r23 r22 r21 -
s390 r2 r3 r4 r5 r6 r7 -
s390x r2 r3 r4 r5 r6 r7 -
sparc/64 o0 o1 o2 o3 o4 o5 -
x86_64 rdi rsi rdx r10 r8 r9 -
.TE
+.PP
+The mips/o32 system call convention passes
+arguments 5 through 8 on the user stack.
.if t \{\
.in
.ft P
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
+#include <signal.h>
int
main(int argc, char *argv[])
pid_t tid;
tid = syscall(SYS_gettid);
- tid = syscall(SYS_tgkill, getpid(), tid);
+ tid = syscall(SYS_tgkill, getpid(), tid, SIGHUP);
}
.fi
.SH SEE ALSO
.BR _syscall (2),
.BR intro (2),
-.BR syscalls (2)
+.BR syscalls (2),
+.BR errno (3),
+.BR vdso (7)
+.SH COLOPHON
+This page is part of release 3.79 of the Linux
+.I man-pages
+project.
+A description of the project,
+information about reporting bugs,
+and the latest version of this page,
+can be found at
+\%http://www.kernel.org/doc/man\-pages/.