]> git.ipfire.org Git - thirdparty/man-pages.git/blobdiff - man2/syscall.2
mmap.2: Don't mark MAP_ANON as deprecated
[thirdparty/man-pages.git] / man2 / syscall.2
index 6aab6121316e41d454e25023473e73e511c33452..f2b277bd01b78e825414194afd2a20439be15548 100644 (file)
 .\" 2015-01-17, Kees Cook <keescook@chromium.org>
 .\"    Added mips and arm64.
 .\"
-.TH SYSCALL 2 2017-03-13 "Linux" "Linux Programmer's Manual"
+.TH SYSCALL 2 2020-02-09 "Linux" "Linux Programmer's Manual"
 .SH NAME
 syscall \- indirect system call
 .SH SYNOPSIS
 .nf
-.BR "#define _GNU_SOURCE" "         /* See feature_test_macros(7) */"
 .B #include <unistd.h>
 .BR "#include <sys/syscall.h>   "  "/* For SYS_xxx definitions */"
-
+.PP
 .BI "long syscall(long " number ", ...);"
 .fi
+.PP
+.in -4n
+Feature Test Macro Requirements for glibc (see
+.BR feature_test_macros (7)):
+.in
+.BR syscall ():
+.PD 0
+.ad l
+.RS 4
+.TP 4
+Since glibc 2.19:
+_DEFAULT_SOURCE
+.TP
+Before glibc 2.19:
+_BSD_SOURCE || _SVID_SOURCE
+.RE
+.ad
+.PD
 .SH DESCRIPTION
 .BR syscall ()
 is a small library function that invokes
@@ -61,14 +78,14 @@ Employing
 .BR syscall ()
 is useful, for example,
 when invoking a system call that has no wrapper function in the C library.
-
+.PP
 .BR syscall ()
 saves CPU registers before making the system call,
 restores the registers upon return from the system call,
 and stores any error code returned by the system call in
 .BR errno (3)
 if an error occurs.
-
+.PP
 Symbolic constants for system call numbers can be found in the header file
 .IR <sys/syscall.h> .
 .SH RETURN VALUE
@@ -92,7 +109,7 @@ However, when using
 to make a system call,
 the caller might need to handle architecture-dependent details;
 this requirement is most commonly encountered on certain 32-bit architectures.
-
+.PP
 For example, on the ARM architecture Embedded ABI (EABI), a
 64-bit value (e.g.,
 .IR "long long" )
@@ -104,14 +121,14 @@ the
 .BR readahead ()
 system call would be invoked as follows on the ARM architecture with the EABI
 in little endian mode:
-
+.PP
 .in +4n
-.nf
+.EX
 syscall(SYS_readahead, fd, 0,
         (unsigned int) (offset & 0xFFFFFFFF),
         (unsigned int) (offset >> 32),
         count);
-.fi
+.EE
 .in
 .PP
 Since the offset argument is 64 bits, and the first argument
@@ -127,16 +144,16 @@ That means inserting a dummy value into
 (the second argument of 0).
 Care also must be taken so that the split follows endian conventions
 (according to the C ABI for the platform).
-
+.PP
 Similar issues can occur on MIPS with the O32 ABI,
-on PowerPC with the 32-bit ABI, and on Xtensa.
+on PowerPC and parisc with the 32-bit ABI, and on Xtensa.
 .\" Mike Frysinger: this issue ends up forcing MIPS
 .\" O32 to take 7 arguments to syscall()
-
+.PP
 .\" See arch/parisc/kernel/sys_parisc.c.
 Note that while the parisc C ABI also uses aligned register pairs,
-it uses a shim layer to hide the issue from userspace.
-
+it uses a shim layer to hide the issue from user space.
+.PP
 The affected system calls are
 .BR fadvise64_64 (2),
 .BR ftruncate64 (2),
@@ -147,7 +164,7 @@ The affected system calls are
 .BR sync_file_range (2),
 and
 .BR truncate64 (2).
-
+.PP
 .\" You need to look up the syscalls directly in the kernel source to see if
 .\" they should be in this list.  For example, look at fs/read_write.c and
 .\" the function signatures that do:
@@ -158,7 +175,7 @@ such as
 .BR _llseek (2),
 .BR preadv (2),
 .BR preadv2 (2),
-.BR pwritev (2).
+.BR pwritev (2),
 and
 .BR pwritev2 (2).
 Welcome to the wonderful world of historical baggage.
@@ -166,48 +183,50 @@ Welcome to the wonderful world of historical baggage.
 Every architecture has its own way of invoking and passing arguments to the
 kernel.
 The details for various architectures are listed in the two tables below.
-
+.PP
 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
 .BR vdso (7)),
 the register used to indicate the system call number,
-the register used to return the system call result,
+the register(s) used to return the system call result,
 and the register used to signal an error.
 .if t \{\
 .ft CW
 \}
 .TS
-l2     l2      l2      l2      l2      l.
-arch/ABI       instruction     syscall #       retval  error   Notes
+l2     l2      l2      l2      l1      l2      l.
+Arch/ABI       Instruction     System  Ret     Ret     Error   Notes
+               call #  val     val2
 _
-alpha  callsys v0      a0      a3      [1]
-arc    trap0   r8      r0      -
-arm/OABI       swi NR  -       a1      -       [2]
-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     r8      r10     [1]
-m68k   trap #0 d0      d0      -
-microblaze     brki r14,8      r12     r3      -
-mips   syscall v0      v0      a3      [1]
-nios2  trap    r2      r2      r7
-parisc ble 0x100(%sr2, %r0)    r20     r28     -
-powerpc        sc      r0      r3      r0      [1]
-s390   svc 0   r1      r2      -       [3]
-s390x  svc 0   r1      r2      -       [3]
-superh trap #0x17      r3      r0      -       [4]
-sparc/32       t 0x10  g1      o0      psr/csr [1]
-sparc/64       t 0x6d  g1      o0      psr/csr [1]
-tile   swint1  R10     R00     R01     [1]
-x86_64 syscall rax     rax     -       [5]
-x32    syscall rax     rax     -       [5]
-xtensa syscall a2      a2      -
+alpha  callsys v0      v0      a4      a3      1, 6
+arc    trap0   r8      r0      -       -
+arm/OABI       swi NR  -       a1      -       -       2
+arm/EABI       swi 0x0 r7      r0      r1      -
+arm64  svc #0  x8      x0      x1      -
+blackfin       excpt 0x0       P0      R0      -       -
+i386   int $0x80       eax     eax     edx     -
+ia64   break 0x100000  r15     r8      r9      r10     1, 6
+m68k   trap #0 d0      d0      -       -
+microblaze     brki r14,8      r12     r3      -       -
+mips   syscall v0      v0      v1      a3      1, 6
+nios2  trap    r2      r2      -       r7
+parisc ble 0x100(%sr2, %r0)    r20     r28     -       -
+powerpc        sc      r0      r3      -       r0      1
+powerpc64      sc      r0      r3      -       cr0.SO  1
+riscv  ecall   a7      a0      a1      -
+s390   svc 0   r1      r2      r3      -       3
+s390x  svc 0   r1      r2      r3      -       3
+superh trap #0x17      r3      r0      r1      -       4, 6
+sparc/32       t 0x10  g1      o0      o1      psr/csr 1, 6
+sparc/64       t 0x6d  g1      o0      o1      psr/csr 1, 6
+tile   swint1  R10     R00     -       R01     1
+x86-64 syscall rax     rax     rdx     -       5
+x32    syscall rax     rax     rdx     -       5
+xtensa syscall a2      a2      -       -
 .TE
 .PP
 Notes:
-.RS 4
 .IP [1] 4
 On a few architectures,
 a register is used as a boolean
@@ -219,6 +238,11 @@ On sparc, the carry bit
 in the processor status register
 .RI ( psr )
 is used instead of a full register.
+On powerpc64, the summary overflow bit
+.RI ( SO )
+in field 0 of the condition register
+.RI ( cr0 )
+is used.
 .IP [2]
 .I NR
 is the system call number.
@@ -239,15 +263,60 @@ and so on up to
 .IR "trap #0x17"
 for 7-argument system calls.
 .IP [5]
-The x32 ABI uses the same instruction as the x86_64 ABI and is used on
-the same processors.
-To differentiate between them, the bit mask
-.I __X32_SYSCALL_BIT
-is bitwise-ORed into the system call number for system calls
-under the x32 ABI.
-Both system call tables are available though,
-so setting the bit is not a hard requirement.
+The x32 ABI shares syscall table with x86-64 ABI, but there are some
+nuances:
+.RS
+.IP \(bu 3
+In order to indicate that a system call is called under the x32 ABI,
+an additional bit,
+.BR __X32_SYSCALL_BIT ,
+is bitwise-ORed with the system call number.
+The ABI used by a process affects some process behaviors,
+including signal handling or system call restarting.
+.IP \(bu
+Since x32 has different sizes for
+.I long
+and pointer types, layouts of some (but not all;
+.I struct timeval
+or
+.I struct rlimit
+are 64-bit, for example) structures are different.
+In order to handle this,
+additional system calls are added to the system call table,
+starting from number 512
+(without the
+.BR __X32_SYSCALL_BIT ).
+For example,
+.B __NR_readv
+is defined as 19 for the x86-64 ABI and as
+.IR __X32_SYSCALL_BIT " | " \fB515\fP
+for the x32 ABI.
+Most of these additional system calls are actually identical
+to the system calls used for providing i386 compat.
+There are some notable exceptions, however, such as
+.BR preadv2 (2),
+which uses
+.I struct iovec
+entities with 4-byte pointers and sizes ("compat_iovec" in kernel terms),
+but passes an 8-byte
+.I pos
+argument in a single register and not two, as is done in every other ABI.
 .RE
+.IP [6]
+Some architectures
+(namely, Alpha, IA-64, MIPS, SuperH, sparc/32, and sparc/64)
+use an additional register ("Retval2" in the above table)
+to pass back a second return value from the
+.BR pipe (2)
+system call;
+Alpha uses this technique in the architecture-specific
+.BR getxpid (2),
+.BR getxuid (2),
+and
+.BR getxgid (2)
+system calls as well.
+Other architectures do not use the second return value register
+in the system call interface, even if it is defined in the System V ABI.
 .if t \{\
 .in
 .ft P
@@ -259,7 +328,7 @@ The second table shows the registers used to pass the system call arguments.
 \}
 .TS
 l      l2      l2      l2      l2      l2      l2      l2      l.
-arch/ABI       arg1    arg2    arg3    arg4    arg5    arg6    arg7    Notes
+Arch/ABI       arg1    arg2    arg3    arg4    arg5    arg6    arg7    Notes
 _
 alpha  a0      a1      a2      a3      a4      a5      -
 arc    r0      r1      r2      r3      r4      r5      -
@@ -271,28 +340,28 @@ i386      ebx     ecx     edx     esi     edi     ebp     -
 ia64   out0    out1    out2    out3    out4    out5    -
 m68k   d1      d2      d3      d4      d5      a0      -
 microblaze     r5      r6      r7      r8      r9      r10     -
-mips/o32       a0      a1      a2      a3      -       -       -       [1]
+mips/o32       a0      a1      a2      a3      -       -       -       1
 mips/n32,64    a0      a1      a2      a3      a4      a5      -
 nios2  r4      r5      r6      r7      r8      r9      -
 parisc r26     r25     r24     r23     r22     r21     -
 powerpc        r3      r4      r5      r6      r7      r8      r9
+powerpc64      r3      r4      r5      r6      r7      r8      -
+riscv  a0      a1      a2      a3      a4      a5      -
 s390   r2      r3      r4      r5      r6      r7      -
 s390x  r2      r3      r4      r5      r6      r7      -
 superh r4      r5      r6      r7      r0      r1      r2
 sparc/32       o0      o1      o2      o3      o4      o5      -
 sparc/64       o0      o1      o2      o3      o4      o5      -
 tile   R00     R01     R02     R03     R04     R05     -
-x86_64 rdi     rsi     rdx     r10     r8      r9      -
+x86-64 rdi     rsi     rdx     r10     r8      r9      -
 x32    rdi     rsi     rdx     r10     r8      r9      -
 xtensa a6      a3      a4      a5      a8      a9      -
 .TE
 .PP
 Notes:
-.RS 4
 .IP [1] 4
 The mips/o32 system call convention passes
 arguments 5 through 8 on the user stack.
-.RE
 .if t \{\
 .in
 .ft P
@@ -301,7 +370,7 @@ arguments 5 through 8 on the user stack.
 Note that these tables don't cover the entire calling convention\(emsome
 architectures may indiscriminately clobber other registers not listed here.
 .SH EXAMPLE
-.nf
+.EX
 #define _GNU_SOURCE
 #include <unistd.h>
 #include <sys/syscall.h>
@@ -316,7 +385,7 @@ main(int argc, char *argv[])
     tid = syscall(SYS_gettid);
     syscall(SYS_tgkill, getpid(), tid, SIGHUP);
 }
-.fi
+.EE
 .SH SEE ALSO
 .BR _syscall (2),
 .BR intro (2),