Consolidate Linux semtimedop implementation

This patch consolidates the semtimedop Linux implementation in only
one default file, sysdeps/unix/sysv/linux/semtimedop.c.  If tries to use
the direct syscall if it is supported, otherwise will use the old ipc
multiplex mechanism.

Checked on x86_64, i686, powerpc64le, aarch64, and armhf.

	* sysdeps/unix/sysv/linux/alpha/syscalls.list (semtimedop): Remove.
	* sysdeps/unix/sysv/linux/arm/syscalls.list (semtimedop): Likewise.
	* sysdeps/unix/sysv/linux/generic/syscalls.list (semtimedop):
	Likewise.
	* sysdeps/unix/sysv/linux/hppa/syscalls.list (semtimedop): Likewise.
	* sysdeps/unix/sysv/linux/ia64/syscalls.list (semtimedop): Likewise.
	* sysdeps/unix/sysv/linux/microblaze/syscalls.list (semtimedop):
	Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/syscalls.list (semtimedop):
	Likewise.
	* sysdeps/unix/sysv/linux/x86_64/syscalls.list (semtimedop): Likewise.
	* sysdeps/unix/sysv/linux/m68k/semtimedop.S: Remove file.
	* sysdeps/unix/sysv/linux/s390/semtimedop.c: Reorganize headers and
	add a comment about s390 syscall difference from default one.
	* sysdeps/unix/sysv/linux/semtimedop.c (semtimedop): Use semtimedop
	syscall if it is defined.
This commit is contained in:
Adhemerval Zanella 2016-10-26 17:51:37 -02:00
parent 0f97184020
commit 38cee35b0c
12 changed files with 31 additions and 88 deletions

View File

@ -1,5 +1,22 @@
2016-12-28 Adhemerval Zanella <adhemerval.zanella@linaro.org>
* sysdeps/unix/sysv/linux/alpha/syscalls.list (semtimedop): Remove.
* sysdeps/unix/sysv/linux/arm/syscalls.list (semtimedop): Likewise.
* sysdeps/unix/sysv/linux/generic/syscalls.list (semtimedop):
Likewise.
* sysdeps/unix/sysv/linux/hppa/syscalls.list (semtimedop): Likewise.
* sysdeps/unix/sysv/linux/ia64/syscalls.list (semtimedop): Likewise.
* sysdeps/unix/sysv/linux/microblaze/syscalls.list (semtimedop):
Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/syscalls.list (semtimedop):
Likewise.
* sysdeps/unix/sysv/linux/x86_64/syscalls.list (semtimedop): Likewise.
* sysdeps/unix/sysv/linux/m68k/semtimedop.S: Remove file.
* sysdeps/unix/sysv/linux/s390/semtimedop.c: Reorganize headers and
add a comment about s390 syscall difference from default one.
* sysdeps/unix/sysv/linux/semtimedop.c (semtimedop): Use semtimedop
syscall if it is defined.
* sysdeps/unix/sysv/linux/alpha/syscalls.list (semop): Remove.
* sysdeps/unix/sysv/linux/arm/syscalls.list (semop): Likewise.
* sysdeps/unix/sysv/linux/generic/syscalls.list (semop): Likewise.

View File

@ -4,7 +4,6 @@ shmat - osf_shmat i:ipi __shmat shmat
oldshmctl EXTRA shmctl i:iip __old_shmctl shmctl@GLIBC_2.0
shmdt - shmdt i:s __shmdt shmdt
shmget - shmget i:iii __shmget shmget
semtimedop - semtimedop i:ipip semtimedop
sigstack - sigstack 2 sigstack

View File

@ -26,7 +26,6 @@ personality EXTRA personality Ei:i __personality personality
shmat - shmat i:ipi __shmat shmat
shmdt - shmdt i:s __shmdt shmdt
shmget - shmget i:iii __shmget shmget
semtimedop - semtimedop i:ipip semtimedop
# proper socket implementations:
accept - accept Ci:iBN __libc_accept __accept accept

View File

@ -1,7 +1,6 @@
# File name Caller Syscall name # args Strong name Weak names
# SysV APIs
semtimedop - semtimedop i:ipip semtimedop
shmget - shmget i:iii __shmget shmget
shmctl - shmctl i:iip __shmctl shmctl
shmat - shmat i:ipi __shmat shmat

View File

@ -5,7 +5,6 @@ shmat - shmat i:ipi __shmat shmat
shmctl - shmctl i:iip __shmctl shmctl
shmdt - shmdt i:s __shmdt shmdt
shmget - shmget i:iii __shmget shmget
semtimedop - semtimedop i:ipip semtimedop
# proper socket implementations:
accept - accept Ci:iBN __libc_accept __accept accept

View File

@ -9,7 +9,6 @@ shmat - shmat i:ipi __shmat shmat
shmctl - shmctl i:iip __shmctl shmctl
shmdt - shmdt i:s __shmdt shmdt
shmget - shmget i:iii __shmget shmget
semtimedop - semtimedop i:ipip semtimedop
# proper socket implementations:
accept - accept Ci:iBN __libc_accept __accept accept

View File

@ -1,69 +0,0 @@
/* Copyright (C) 2003-2016 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Schwab <schwab@suse.de>, 2003.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#define SYSOP_semtimedop 4
#define SVRSP 8 /* saved register space */
#define PARMS 4+SVRSP /* space for 3 saved regs */
#define SEMID PARMS
#define SOPS SEMID+4
#define NSOPS SOPS+4
#define TIMEOUT NSOPS+4
.text
ENTRY (semtimedop)
/* Save registers. */
move.l %d2, %a1
move.l %d3, -(%sp)
cfi_adjust_cfa_offset (4)
move.l %d5, -(%sp)
cfi_adjust_cfa_offset (4)
cfi_register (%d2, %a1)
cfi_rel_offset (%d3, 0)
cfi_rel_offset (%d5, 4)
move.l #SYSOP_semtimedop, %d1
move.l SEMID(%sp), %d2
move.l NSOPS(%sp), %d3
move.l SOPS(%sp), %d5
move.l TIMEOUT(%sp), %a0
move.l #SYS_ify (ipc), %d0
trap #0
/* Restore registers. */
move.l (%sp)+, %d5
cfi_adjust_cfa_offset (-4)
cfi_restore (%d5)
move.l (%sp)+, %d3
cfi_adjust_cfa_offset (-4)
cfi_restore (%d3)
move.l %a1, %d2
cfi_restore (%d2)
/* Check for error. */
tst.l %d0
jmi SYSCALL_ERROR_LABEL
/* Successful; return the syscall's value. */
ret
PSEUDO_END (semtimedop)

View File

@ -11,4 +11,3 @@ personality EXTRA personality Ei:i __personality personality
shmat - shmat i:ipi __shmat shmat
shmdt - shmdt i:s __shmdt shmdt
shmget - shmget i:iii __shmget shmget
semtimedop - semtimedop i:ipip semtimedop

View File

@ -5,4 +5,3 @@
shmat - shmat i:ipi __shmat shmat
shmdt - shmdt i:s __shmdt shmdt
shmget - shmget i:iii __shmget shmget
semtimedop - semtimedop i:ipip semtimedop

View File

@ -16,12 +16,10 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <errno.h>
#include <sys/sem.h>
#include <ipc_priv.h>
#include <sysdep.h>
#include <sys/syscall.h>
#include <errno.h>
/* Perform user-defined atomical operation of array of semaphores. */
@ -29,6 +27,10 @@ int
semtimedop (int semid, struct sembuf *sops, size_t nsops,
const struct timespec *timeout)
{
return INLINE_SYSCALL (ipc, 5, IPCOP_semtimedop,
semid, (int) nsops, timeout, sops);
/* The s390 sys_ipc variant has only five parameters instead of six
(as for default variant) and the only difference is the handling of
SEMTIMEDOP where on s390 the third parameter is used as a pointer
to a struct timespec where the generic variant uses fifth parameter. */
return INLINE_SYSCALL_CALL (ipc, IPCOP_semtimedop, semid, nsops, timeout,
sops);
}

View File

@ -16,12 +16,10 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <errno.h>
#include <sys/sem.h>
#include <ipc_priv.h>
#include <sysdep.h>
#include <sys/syscall.h>
#include <errno.h>
/* Perform user-defined atomical operation of array of semaphores. */
@ -29,7 +27,10 @@ int
semtimedop (int semid, struct sembuf *sops, size_t nsops,
const struct timespec *timeout)
{
return INLINE_SYSCALL (ipc, 6, IPCOP_semtimedop,
semid, (int) nsops, 0, sops,
timeout);
#ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
return INLINE_SYSCALL_CALL (semtimedop, semid, sops, nsops, timeout);
#else
return INLINE_SYSCALL_CALL (ipc, IPCOP_semtimedop, semid, nsops, 0, sops,
timeout);
#endif
}

View File

@ -10,7 +10,6 @@ shmat - shmat i:ipi __shmat shmat
shmctl - shmctl i:iip __shmctl shmctl
shmdt - shmdt i:s __shmdt shmdt
shmget - shmget i:iii __shmget shmget
semtimedop - semtimedop i:ipip semtimedop
syscall_clock_gettime EXTRA clock_gettime Ei:ip __syscall_clock_gettime