getgid.2, getpid.2, getuid.2, pipe.2, syscall.2: Describe 2nd return value peculiarity

Some architectures (ab)use second return value register for additional
return value in some system calls. Let's describe this.

Signed-off-by: Eugene Syromiatnikov <esyr@redhat.com>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
This commit is contained in:
Eugene Syromiatnikov 2019-01-04 16:08:06 +01:00 committed by Michael Kerrisk
parent f3f3ab82ee
commit 70ea1968cc
5 changed files with 121 additions and 27 deletions

View File

@ -59,6 +59,25 @@ The glibc
and
.BR getegid ()
wrapper functions transparently deal with the variations across kernel versions.
.PP
On Alpha, instead of pair of
.BR getgid "() and " getegid ()
system calls, single
.BR getxgid ()
system call is provided, which returns a pair of real and effective GIDs.
The glibc
.BR getgid ()
and
.BR getegid ()
wrapper functions transparently deal with this.
See
.BR syscall (2)
for details regarding register mapping.
Other examples of such peculiarity are Alpha-specific
.BR getxpid "(2) and " getxuid (2),
along with
.BR pipe (2)
on several architectures.
.SH SEE ALSO
.BR getresgid (2),
.BR setgid (2),

View File

@ -136,6 +136,25 @@ calls to
always invoke the actual system call, rather than returning a cached value.
.\" FIXME .
.\" Review progress of https://bugzilla.redhat.com/show_bug.cgi?id=1469757
.PP
On Alpha, instead of pair of
.BR getpid "() and " getppid ()
system calls, single
.BR getxpid ()
system call is provided, which returns a pair of PID and parent PID.
The glibc
.BR getpid ()
and
.BR getppid ()
wrapper functions transparently deal with this.
See
.BR syscall (2)
for details regarding register mapping.
Other examples of such peculiarity are Alpha-specific
.BR getxuid "(2) and " getxgid (2),
along with
.BR pipe (2)
on several architectures.
.SH SEE ALSO
.BR clone (2),
.BR fork (2),

View File

@ -70,6 +70,25 @@ The glibc
and
.BR geteuid ()
wrapper functions transparently deal with the variations across kernel versions.
.PP
On Alpha, instead of pair of
.BR getuid "() and " geteuid ()
system calls, single
.BR getxuid ()
system call is provided, which returns a pair of real and effective UIDs.
The glibc
.BR getuid ()
and
.BR geteuid ()
wrapper functions transparently deal with this.
See
.BR syscall (2)
for details regarding register mapping.
Other examples of such peculiarity are Alpha-specific
.BR getxpid "(2) and " getxgid (2),
along with
.BR pipe (2)
on several architectures.
.SH SEE ALSO
.BR getresuid (2),
.BR setreuid (2),

View File

@ -40,6 +40,13 @@ pipe, pipe2 \- create pipe
.nf
.B #include <unistd.h>
.PP
/* On Alpha, IA-64, MIPS, SuperH, and SPARC/SPARC64; see NOTES */
.B struct fd_pair {
.B " long fd[2];"
.B "};"
.B struct fd_pair pipe();
.PP
/* On all other architectures */
.BI "int pipe(int " pipefd "[2]);"
.BR "#define _GNU_SOURCE" " /* See feature_test_macros(7) */"
@ -184,6 +191,25 @@ has been reached and the caller is not privileged; see
was added to Linux in version 2.6.27;
glibc support is available starting with
version 2.9.
.SH NOTES
.\" See http://math-atlas.sourceforge.net/devel/assembly/64.psabi.1.33.ps.Z
.\" for example, section 3.2.1 "Registers and the Stack Frame".
SystemV ABI on some architectures allows using more than one register
for returning multiple values; several architectures
(namely, Alpha, IA-64, MIPS, SuperH, and SPARC/SPARC64)
(ab)use this feature in order to implement
.BR pipe ()
system call in a functional manner: it doesn't take any arguments and returns
a pair of file descriptors as a return value on success.
The glibc
.BR pipe ()
wrapper function transparently deal with this.
See
.BR syscall (2)
for information regarding registers used for storing second file descriptor.
Other examples of such peculiarity are
.BR getxpid (2)/ getxuid (2)/ getxgid (2)
on Alpha.
.SH CONFORMING TO
.BR pipe ():
POSIX.1-2001, POSIX.1-2008.

View File

@ -172,39 +172,39 @@ The first table lists the instruction used to transition to kernel mode
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 l2 l2 l.
arch/ABI instruction syscall # retval retval2 error Notes
_
alpha callsys v0 v0 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]
riscv scall a7 a0 -
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]
riscv scall 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:
@ -279,6 +279,17 @@ 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, and SPARC/SPARC64)
use second return value register in order to pass second return value in
.BR pipe (2)
system call;
Alpha uses it in the architecture-specific
.BR getxpid "(2), " getxuid "(2), and " 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 SystemV ABI.
.RE
.if t \{\
.in