1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-01 10:06:57 +03:00

Use shmat syscall for Linux implementation

This patch add a direct call to shmat syscall if it is supported by
kernel features.

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

	* sysdeps/unix/sysv/linux/alpha/syscalls.list (shmat): Remove.
	* sysdeps/unix/sysv/linux/arm/syscalls.list (shmat): Likewise.
	* sysdeps/unix/sysv/linux/generic/syscalls.list (shmat): Likewise.
	* sysdeps/unix/sysv/linux/hppa/syscalls.list (shmat): Likewise.
	* sysdeps/unix/sysv/linux/ia64/syscalls.list (shmat): Likewise.
	* sysdeps/unix/sysv/linux/microblaze/syscalls.list (shmat): Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/syscalls.list (shmat):
	Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list (shmat):
	Likewise.
	* sysdeps/unix/sysv/linux/x86_64/syscalls.list (shmat): Likewise.
	* sysdeps/unix/sysv/linux/alpha/kernel-features.h (__NR_shmat):
	Define to __NR_osf_shmat.
	* sysdeps/unix/sysv/linux/shmat.c (shmat): Use shmat syscall if it is
	defined.
This commit is contained in:
Adhemerval Zanella
2016-10-26 18:04:48 -02:00
parent 1afc369f1a
commit 8232e7d209
12 changed files with 31 additions and 22 deletions

View File

@ -1,5 +1,21 @@
2016-12-28 Adhemerval Zanella <adhemerval.zanella@linaro.org> 2016-12-28 Adhemerval Zanella <adhemerval.zanella@linaro.org>
* sysdeps/unix/sysv/linux/alpha/syscalls.list (shmat): Remove.
* sysdeps/unix/sysv/linux/arm/syscalls.list (shmat): Likewise.
* sysdeps/unix/sysv/linux/generic/syscalls.list (shmat): Likewise.
* sysdeps/unix/sysv/linux/hppa/syscalls.list (shmat): Likewise.
* sysdeps/unix/sysv/linux/ia64/syscalls.list (shmat): Likewise.
* sysdeps/unix/sysv/linux/microblaze/syscalls.list (shmat): Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/syscalls.list (shmat):
Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list (shmat):
Likewise.
* sysdeps/unix/sysv/linux/x86_64/syscalls.list (shmat): Likewise.
* sysdeps/unix/sysv/linux/alpha/kernel-features.h (__NR_shmat):
Define to __NR_osf_shmat.
* sysdeps/unix/sysv/linux/shmat.c (shmat): Use shmat syscall if it is
defined.
* sysvipc/Makefile (tests): Add test-sysvsem. * sysvipc/Makefile (tests): Add test-sysvsem.
* sysvipc/test-sysvsem.c: New file. * sysvipc/test-sysvsem.c: New file.

View File

@ -29,4 +29,7 @@
#undef __ASSUME_STATFS64 #undef __ASSUME_STATFS64
#define __ASSUME_STATFS64 0 #define __ASSUME_STATFS64 0
/* Alpha defines SysV ipc shmat syscall with a different name. */
#define __NR_shmat __NR_osf_shmat
#endif /* _KERNEL_FEATURES_H */ #endif /* _KERNEL_FEATURES_H */

View File

@ -1,6 +1,5 @@
# File name Caller Syscall name # args Strong name Weak names # File name Caller Syscall name # args Strong name Weak names
shmat - osf_shmat i:ipi __shmat shmat
oldshmctl EXTRA shmctl i:iip __old_shmctl shmctl@GLIBC_2.0 oldshmctl EXTRA shmctl i:iip __old_shmctl shmctl@GLIBC_2.0
shmdt - shmdt i:s __shmdt shmdt shmdt - shmdt i:s __shmdt shmdt
shmget - shmget i:iii __shmget shmget shmget - shmget i:iii __shmget shmget

View File

@ -23,7 +23,6 @@ personality EXTRA personality Ei:i __personality personality
# Semaphore and shm system calls. msgctl, shmctl, and semctl have C # Semaphore and shm system calls. msgctl, shmctl, and semctl have C
# wrappers (to set __IPC_64). # wrappers (to set __IPC_64).
shmat - shmat i:ipi __shmat shmat
shmdt - shmdt i:s __shmdt shmdt shmdt - shmdt i:s __shmdt shmdt
shmget - shmget i:iii __shmget shmget shmget - shmget i:iii __shmget shmget

View File

@ -3,7 +3,6 @@
# SysV APIs # SysV APIs
shmget - shmget i:iii __shmget shmget shmget - shmget i:iii __shmget shmget
shmctl - shmctl i:iip __shmctl shmctl shmctl - shmctl i:iip __shmctl shmctl
shmat - shmat i:ipi __shmat shmat
shmdt - shmdt i:s __shmdt shmdt shmdt - shmdt i:s __shmdt shmdt
# Socket APIs # Socket APIs

View File

@ -1,7 +1,6 @@
# File name Caller Syscall name # args Strong name Weak names # File name Caller Syscall name # args Strong name Weak names
# semaphore and shm system calls # semaphore and shm system calls
shmat - shmat i:ipi __shmat shmat
shmctl - shmctl i:iip __shmctl shmctl shmctl - shmctl i:iip __shmctl shmctl
shmdt - shmdt i:s __shmdt shmdt shmdt - shmdt i:s __shmdt shmdt
shmget - shmget i:iii __shmget shmget shmget - shmget i:iii __shmget shmget

View File

@ -5,7 +5,6 @@ umount2 - umount 2 __umount2 umount2
getpriority - getpriority i:ii __getpriority getpriority getpriority - getpriority i:ii __getpriority getpriority
# semaphore and shm system calls # semaphore and shm system calls
shmat - shmat i:ipi __shmat shmat
shmctl - shmctl i:iip __shmctl shmctl shmctl - shmctl i:iip __shmctl shmctl
shmdt - shmdt i:s __shmdt shmdt shmdt - shmdt i:s __shmdt shmdt
shmget - shmget i:iii __shmget shmget shmget - shmget i:iii __shmget shmget

View File

@ -8,6 +8,5 @@ personality EXTRA personality Ei:i __personality personality
# Semaphore and shm system calls. msgctl, shmctl, and semctl have C # Semaphore and shm system calls. msgctl, shmctl, and semctl have C
# wrappers (to set __IPC_64). # wrappers (to set __IPC_64).
shmat - shmat i:ipi __shmat shmat
shmdt - shmdt i:s __shmdt shmdt shmdt - shmdt i:s __shmdt shmdt
shmget - shmget i:iii __shmget shmget shmget - shmget i:iii __shmget shmget

View File

@ -2,6 +2,5 @@
# Semaphore and shm system calls. msgctl, shmctl, and semctl have C # Semaphore and shm system calls. msgctl, shmctl, and semctl have C
# wrappers (to set __IPC_64). # wrappers (to set __IPC_64).
shmat - shmat i:ipi __shmat shmat
shmdt - shmdt i:s __shmdt shmdt shmdt - shmdt i:s __shmdt shmdt
shmget - shmget i:iii __shmget shmget shmget - shmget i:iii __shmget shmget

View File

@ -1,7 +1,6 @@
# File name Caller Syscall name # args Strong name Weak names # File name Caller Syscall name # args Strong name Weak names
# semaphore and shm system calls # semaphore and shm system calls
shmat - shmat i:ipi __shmat shmat
shmctl - shmctl i:iip __shmctl shmctl shmctl - shmctl i:iip __shmctl shmctl
shmdt - shmdt i:s __shmdt shmdt shmdt - shmdt i:s __shmdt shmdt
shmget - shmget i:iii __shmget shmget shmget - shmget i:iii __shmget shmget

View File

@ -16,13 +16,10 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <errno.h> #include <sys/msg.h>
#include <sys/shm.h>
#include <ipc_priv.h> #include <ipc_priv.h>
#include <sysdep.h> #include <sysdep.h>
#include <unistd.h> #include <errno.h>
#include <sys/syscall.h>
/* Attach the shared memory segment associated with SHMID to the data /* Attach the shared memory segment associated with SHMID to the data
segment of the calling process. SHMADDR and SHMFLG determine how segment of the calling process. SHMADDR and SHMFLG determine how
@ -31,17 +28,19 @@
void * void *
shmat (int shmid, const void *shmaddr, int shmflg) shmat (int shmid, const void *shmaddr, int shmflg)
{ {
#ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
return (void*) INLINE_SYSCALL_CALL (shmat, shmid, shmaddr, shmflg);
#else
INTERNAL_SYSCALL_DECL(err); INTERNAL_SYSCALL_DECL(err);
unsigned long resultvar; unsigned long resultvar;
void *raddr; void *raddr;
resultvar = INTERNAL_SYSCALL (ipc, err, 5, IPCOP_shmat, resultvar = INTERNAL_SYSCALL_CALL (ipc, err, IPCOP_shmat, shmid, shmflg,
shmid, shmflg, &raddr, shmaddr);
(long int) &raddr,
(void *) shmaddr);
if (INTERNAL_SYSCALL_ERROR_P (resultvar, err)) if (INTERNAL_SYSCALL_ERROR_P (resultvar, err))
return (void *) INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (resultvar, return (void *) INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (resultvar,
err)); err));
return raddr; return raddr;
#endif
} }

View File

@ -6,7 +6,6 @@ pread64 - pread64 Ci:ipii __libc_pread __libc_pread64 __pread64 pread64 __prea
preadv64 - preadv Ci:ipii preadv64 preadv preadv64 - preadv Ci:ipii preadv64 preadv
pwrite64 - pwrite64 Ci:ipii __libc_pwrite __libc_pwrite64 __pwrite64 pwrite64 __pwrite pwrite pwrite64 - pwrite64 Ci:ipii __libc_pwrite __libc_pwrite64 __pwrite64 pwrite64 __pwrite pwrite
pwritev64 - pwritev Ci:ipii pwritev64 pwritev pwritev64 - pwritev Ci:ipii pwritev64 pwritev
shmat - shmat i:ipi __shmat shmat
shmctl - shmctl i:iip __shmctl shmctl shmctl - shmctl i:iip __shmctl shmctl
shmdt - shmdt i:s __shmdt shmdt shmdt - shmdt i:s __shmdt shmdt
shmget - shmget i:iii __shmget shmget shmget - shmget i:iii __shmget shmget