aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv')
-rw-r--r--sysdeps/unix/sysv/linux/Makefile3
-rw-r--r--sysdeps/unix/sysv/linux/arm/syscalls.list6
-rw-r--r--sysdeps/unix/sysv/linux/i386/s_pread64.S9
-rw-r--r--sysdeps/unix/sysv/linux/i386/s_pwrite64.S9
-rw-r--r--sysdeps/unix/sysv/linux/i386/sigaction.c21
-rw-r--r--sysdeps/unix/sysv/linux/pread.c28
-rw-r--r--sysdeps/unix/sysv/linux/pwrite.c28
-rw-r--r--sysdeps/unix/sysv/linux/sigaction.c3
-rw-r--r--sysdeps/unix/sysv/linux/sigpending.c3
-rw-r--r--sysdeps/unix/sysv/linux/sigprocmask.c3
-rw-r--r--sysdeps/unix/sysv/linux/sigreturn.c3
-rw-r--r--sysdeps/unix/sysv/linux/sigsuspend.c5
-rw-r--r--sysdeps/unix/sysv/linux/sigtimedwait.c3
-rw-r--r--sysdeps/unix/sysv/linux/sigwaitinfo.c3
-rw-r--r--sysdeps/unix/sysv/linux/syscalls.list14
15 files changed, 106 insertions, 35 deletions
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index ffea9ef4bb..6903e0b6cd 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -111,7 +111,8 @@ endif
ifeq ($(subdir),signal)
sysdep_routines += rt_sigsuspend rt_sigprocmask rt_sigtimedwait \
- rt_sigqueueinfo rt_sigaction
+ rt_sigqueueinfo rt_sigaction rt_sigpending \
+ rt_sigreturn
endif
common-generated += bits/stdio_lim.h bits/stdio_lim.d
diff --git a/sysdeps/unix/sysv/linux/arm/syscalls.list b/sysdeps/unix/sysv/linux/arm/syscalls.list
new file mode 100644
index 0000000000..392a257194
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arm/syscalls.list
@@ -0,0 +1,6 @@
+# File name Caller Syscall name # args Strong name Weak names
+
+s_getgroups getgroups getgroups 2 __syscall_getgroups
+s_llseek llseek _llseek 5 __sys_llseek
+s_setgroups setgroups setgroups 2 __syscall_setgroups
+vm86 - vm86 1 __vm86 vm86
diff --git a/sysdeps/unix/sysv/linux/i386/s_pread64.S b/sysdeps/unix/sysv/linux/i386/s_pread64.S
index 22ce79b3f0..9e14aa815f 100644
--- a/sysdeps/unix/sysv/linux/i386/s_pread64.S
+++ b/sysdeps/unix/sysv/linux/i386/s_pread64.S
@@ -18,6 +18,7 @@
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
+#include <asm/errno.h>
/* Please consult the file sysdeps/unix/sysv/linux/i386/sysdep.h for
more information about the value -4095 used below.*/
@@ -25,6 +26,13 @@
.text
ENTRY (__syscall_pread64)
+#ifndef __NR_pread
+ movl $-ENOSYS,%eax
+# ifndef PIC
+ jmp syscall_error
+# endif
+#else
+
PUSHARGS_5 /* Save register contents. */
/* Load arguments. This is unfortunately a little bit of a problem
@@ -41,5 +49,6 @@ ENTRY (__syscall_pread64)
cmpl $-4095, %eax /* Check %eax for error. */
jae syscall_error /* Jump to error handler if error. */
ret /* Return to caller. */
+#endif
PSEUDO_END (__syscall_pread64)
diff --git a/sysdeps/unix/sysv/linux/i386/s_pwrite64.S b/sysdeps/unix/sysv/linux/i386/s_pwrite64.S
index 6a1987b72e..a21fe2f99f 100644
--- a/sysdeps/unix/sysv/linux/i386/s_pwrite64.S
+++ b/sysdeps/unix/sysv/linux/i386/s_pwrite64.S
@@ -18,6 +18,7 @@
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
+#include <asm/errno.h>
/* Please consult the file sysdeps/unix/sysv/linux/i386/sysdep.h for
more information about the value -4095 used below.*/
@@ -25,6 +26,13 @@
.text
ENTRY (__syscall_pwrite64)
+#ifndef __NR_pwrite
+ movl $-ENOSYS,%eax
+# ifndef PIC
+ jmp syscall_error
+# endif
+#else
+
PUSHARGS_5 /* Save register contents. */
/* Load arguments. This is unfortunately a little bit of a problem
@@ -41,5 +49,6 @@ ENTRY (__syscall_pwrite64)
cmpl $-4095, %eax /* Check %eax for error. */
jae syscall_error /* Jump to error handler if error. */
ret /* Return to caller. */
+#endif
PSEUDO_END (__syscall_pwrite64)
diff --git a/sysdeps/unix/sysv/linux/i386/sigaction.c b/sysdeps/unix/sysv/linux/i386/sigaction.c
index 90d61a08a1..05d187c432 100644
--- a/sysdeps/unix/sysv/linux/i386/sigaction.c
+++ b/sysdeps/unix/sysv/linux/i386/sigaction.c
@@ -47,19 +47,24 @@ __sigaction (int sig, const struct sigaction *act, struct sigaction *oact)
/* First try the RT signals. */
if (__libc_have_rt_sigs)
{
- struct sigaction nact;
+ struct sigaction nact, *nactp;
- nact.sa_handler = act->sa_handler;
- memcpy (&nact.sa_mask, &act->sa_mask, sizeof (sigset_t));
- nact.sa_flags = act->sa_flags;
+ if (act)
+ {
+ nact.sa_handler = act->sa_handler;
+ memcpy (&nact.sa_mask, &act->sa_mask, sizeof (sigset_t));
+ nact.sa_flags = act->sa_flags;
- nact.sa_restorer = ((act->sa_flags & SA_NOMASK)
- ? &&restore_nomask : &&restore);
+ nact.sa_restorer = ((act->sa_flags & SA_NOMASK)
+ ? &&restore_nomask : &&restore);
+ nactp = &nact;
+ }
+ else
+ nactp = NULL;
/* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */
- result = __syscall_rt_sigaction (sig, &nact, oact,
- _NSIG / (8 * sizeof (long int)));
+ result = __syscall_rt_sigaction (sig, nactp, oact, _NSIG / 8);
if (result >= 0 || errno != ENOSYS)
return result;
diff --git a/sysdeps/unix/sysv/linux/pread.c b/sysdeps/unix/sysv/linux/pread.c
index eeb26eb663..eb0d301fa1 100644
--- a/sysdeps/unix/sysv/linux/pread.c
+++ b/sysdeps/unix/sysv/linux/pread.c
@@ -17,12 +17,36 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <errno.h>
#include <unistd.h>
+extern ssize_t __syscall_pread64 (int fd, void *buf, size_t count,
+ off_t offset_hi, off_t offset_lo);
+
+static ssize_t __emulate_pread (int fd, void *buf, size_t count,
+ off_t offset) internal_function;
+
+
ssize_t
-__pread (int fd, void *buf, size_t nbytes, off_t offset)
+__pread (fd, buf, count, offset)
+ int fd;
+ void *buf;
+ size_t count;
+ off_t offset;
{
- return __pread64 (fd, buf, nbytes, (off64_t) offset);
+ ssize_t result;
+
+ /* First try the syscall. */
+ result = __syscall_pread64 (fd, buf, count, 0, offset);
+ if (result == -1 && errno == ENOSYS)
+ /* No system call available. Use the emulation. */
+ result = __emulate_pread (fd, buf, count, offset);
+
+ return result;
}
weak_alias (__pread, pread)
+
+#define __pread(fd, buf, count, offset) \
+ static internal_function __emulate_pread (fd, buf, count, offset)
+#include <sysdeps/posix/pread.c>
diff --git a/sysdeps/unix/sysv/linux/pwrite.c b/sysdeps/unix/sysv/linux/pwrite.c
index d8695db2a8..9ab3259fc6 100644
--- a/sysdeps/unix/sysv/linux/pwrite.c
+++ b/sysdeps/unix/sysv/linux/pwrite.c
@@ -17,12 +17,36 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <errno.h>
#include <unistd.h>
+extern ssize_t __syscall_pwrite64 (int fd, const void *buf, size_t count,
+ off_t offset_hi, off_t offset_lo);
+
+static ssize_t __emulate_pwrite (int fd, const void *buf, size_t count,
+ off_t offset) internal_function;
+
+
ssize_t
-__pwrite (int fd, const void *buf, size_t nbytes, off_t offset)
+__pwrite (fd, buf, count, offset)
+ int fd;
+ const void *buf;
+ size_t count;
+ off_t offset;
{
- return __pwrite64 (fd, buf, nbytes, (off64_t) offset);
+ ssize_t result;
+
+ /* First try the syscall. */
+ result = __syscall_pwrite64 (fd, buf, count, 0, offset);
+ if (result == -1 && errno == ENOSYS)
+ /* No system call available. Use the emulation. */
+ result = __emulate_pwrite (fd, buf, count, offset);
+
+ return result;
}
weak_alias (__pwrite, pwrite)
+
+#define __pwrite(fd, buf, count, offset) \
+ static internal_function __emulate_pwrite (fd, buf, count, offset)
+#include <sysdeps/posix/pwrite.c>
diff --git a/sysdeps/unix/sysv/linux/sigaction.c b/sysdeps/unix/sysv/linux/sigaction.c
index 161f1b0529..1412c381d0 100644
--- a/sysdeps/unix/sysv/linux/sigaction.c
+++ b/sysdeps/unix/sysv/linux/sigaction.c
@@ -49,8 +49,7 @@ __sigaction (sig, act, oact)
{
/* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */
- int result = __syscall_rt_sigaction (sig, act, oact,
- _NSIG / (8 * sizeof (long int)));
+ int result = __syscall_rt_sigaction (sig, act, oact, _NSIG / 8);
if (result >= 0 || errno != ENOSYS)
return result;
diff --git a/sysdeps/unix/sysv/linux/sigpending.c b/sysdeps/unix/sysv/linux/sigpending.c
index 7b26bfbf12..4cecb8dc60 100644
--- a/sysdeps/unix/sysv/linux/sigpending.c
+++ b/sysdeps/unix/sysv/linux/sigpending.c
@@ -40,8 +40,7 @@ sigpending (set)
{
/* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */
- int result = __syscall_rt_sigpending (set,
- _NSIG / (8 * sizeof (long int)));
+ int result = __syscall_rt_sigpending (set, _NSIG / 8);
if (result >= 0 || errno != ENOSYS)
return result;
diff --git a/sysdeps/unix/sysv/linux/sigprocmask.c b/sysdeps/unix/sysv/linux/sigprocmask.c
index f436ba8f2c..dc262c88f4 100644
--- a/sysdeps/unix/sysv/linux/sigprocmask.c
+++ b/sysdeps/unix/sysv/linux/sigprocmask.c
@@ -41,8 +41,7 @@ __sigprocmask (how, set, oset)
{
/* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */
- int result = __syscall_rt_sigprocmask (how, set, oset,
- _NSIG / (8 * sizeof (long int)));
+ int result = __syscall_rt_sigprocmask (how, set, oset, _NSIG / 8);
if (result >= 0 || errno != ENOSYS)
return result;
diff --git a/sysdeps/unix/sysv/linux/sigreturn.c b/sysdeps/unix/sysv/linux/sigreturn.c
index ecef3d67ad..540dfdf388 100644
--- a/sysdeps/unix/sysv/linux/sigreturn.c
+++ b/sysdeps/unix/sysv/linux/sigreturn.c
@@ -38,8 +38,7 @@ __sigreturn (scp)
{
/* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */
- int result = __syscall_rt_sigreturn (scp,
- _NSIG / (8 * sizeof (long int)));
+ int result = __syscall_rt_sigreturn (scp, _NSIG / 8);
if (result >= 0 || errno != ENOSYS)
return result;
diff --git a/sysdeps/unix/sysv/linux/sigsuspend.c b/sysdeps/unix/sysv/linux/sigsuspend.c
index faea1c35e1..2cf34eb9b1 100644
--- a/sysdeps/unix/sysv/linux/sigsuspend.c
+++ b/sysdeps/unix/sysv/linux/sigsuspend.c
@@ -21,7 +21,7 @@
#include <unistd.h>
extern int __syscall_sigsuspend (int, unsigned long int, unsigned long int);
-extern int __syscall_rt_sigsuspend (sigset_t *, size_t);
+extern int __syscall_rt_sigsuspend (const sigset_t *, size_t);
/* The variable is shared between all wrappers around signal handling
@@ -40,8 +40,7 @@ __sigsuspend (set)
{
/* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */
- int result = __syscall_rt_sigsuspend (set,
- _NSIG / (8 * sizeof (long int)));
+ int result = __syscall_rt_sigsuspend (set, _NSIG / 8);
if (result >= 0 || errno != ENOSYS)
return result;
diff --git a/sysdeps/unix/sysv/linux/sigtimedwait.c b/sysdeps/unix/sysv/linux/sigtimedwait.c
index b022ec35f7..90854c64d9 100644
--- a/sysdeps/unix/sysv/linux/sigtimedwait.c
+++ b/sysdeps/unix/sysv/linux/sigtimedwait.c
@@ -31,7 +31,6 @@ __sigtimedwait (set, info, timeout)
{
/* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */
- return __syscall_rt_sigtimedwait (set, info, timeout,
- _NSIG / (8 * sizeof (long int)));
+ return __syscall_rt_sigtimedwait (set, info, timeout, _NSIG / 8);
}
weak_alias (__sigtimedwait, sigtimedwait)
diff --git a/sysdeps/unix/sysv/linux/sigwaitinfo.c b/sysdeps/unix/sysv/linux/sigwaitinfo.c
index ac98fb46e0..5f41ba054b 100644
--- a/sysdeps/unix/sysv/linux/sigwaitinfo.c
+++ b/sysdeps/unix/sysv/linux/sigwaitinfo.c
@@ -30,7 +30,6 @@ __sigwaitinfo (set, info)
{
/* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */
- return __syscall_rt_sigtimedwait (set, info, NULL,
- _NSIG / (8 * sizeof (long int)));
+ return __syscall_rt_sigtimedwait (set, info, NULL, _NSIG / 8);
}
weak_alias (__sigwaitinfo, sigwaitinfo)
diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list
index 08dceca3f6..ed760af2ab 100644
--- a/sysdeps/unix/sysv/linux/syscalls.list
+++ b/sysdeps/unix/sysv/linux/syscalls.list
@@ -35,13 +35,13 @@ pipe - pipe 1 __pipe pipe
prctl EXTRA prctl 5 prctl
query_module EXTRA query_module 5 query_module
quotactl EXTRA quotactl 4 quotactl
-rt_sigaction sigaction rt_sigaction 4 __syscall_rt_sigaction
-rt_sigpending sigpendding rt_sigpending 2 __syscall_rt_sigpending
-rt_sigprocmask sigprocmask rt_sigprocmask 4 __syscall_rt_sigprocmask
-rt_sigqueueinfo sigqueue rt_sigqueueinfo 3 __syscall_rt_sigqueueinfo
-rt_sigreturn sigreturn rt_sigreturn 1 __syscall_rt_sigreturn
-rt_sigsuspend sigsuspend rt_sigsuspend 2 __syscall_rt_sigsuspend
-rt_sigtimedwait sigtimedwait rt_sigtimedwait 4 __syscall_rt_sigtimedwait
+rt_sigaction - rt_sigaction 4 __syscall_rt_sigaction
+rt_sigpending - rt_sigpending 2 __syscall_rt_sigpending
+rt_sigprocmask - rt_sigprocmask 4 __syscall_rt_sigprocmask
+rt_sigqueueinfo - rt_sigqueueinfo 3 __syscall_rt_sigqueueinfo
+rt_sigreturn - rt_sigreturn 1 __syscall_rt_sigreturn
+rt_sigsuspend - rt_sigsuspend 2 __syscall_rt_sigsuspend
+rt_sigtimedwait - rt_sigtimedwait 4 __syscall_rt_sigtimedwait
s_getdents EXTRA getdents 3 __getdents
s_getpriority getpriority getpriority 2 __syscall_getpriority
s_poll poll poll 3 __syscall_poll