summary refs log tree commit diff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/generic/bits/types.h4
-rw-r--r--sysdeps/unix/alpha/sysdep.h165
-rw-r--r--sysdeps/unix/sysv/linux/alpha/syscalls.list27
-rw-r--r--sysdeps/unix/sysv/linux/alpha/sysdep.h12
-rw-r--r--sysdeps/unix/sysv/linux/i386/setgroups.c2
-rw-r--r--sysdeps/unix/sysv/linux/ttyname.c17
-rw-r--r--sysdeps/unix/sysv/linux/ttyname_r.c17
7 files changed, 196 insertions, 48 deletions
diff --git a/sysdeps/generic/bits/types.h b/sysdeps/generic/bits/types.h
index 2b3edab5e4..8bb6c78b6a 100644
--- a/sysdeps/generic/bits/types.h
+++ b/sysdeps/generic/bits/types.h
@@ -93,7 +93,7 @@ typedef unsigned long int __fd_mask;
 /* It's easier to assume 8-bit bytes than to get CHAR_BIT.  */
 #define	__NFDBITS	(sizeof (unsigned long int) * 8)
 #define	__FDELT(d)	((d) / __NFDBITS)
-#define	__FDMASK(d)	((unsigned long int) 1 << ((d) % __NFDBITS))
+#define	__FDMASK(d)	((__fd_mask) 1 << ((d) % __NFDBITS))
 
 /* fd_set for select and pselect.  */
 typedef struct
@@ -102,8 +102,10 @@ typedef struct
        from the user namespace.  */
 #ifdef __USE_XOPEN
     __fd_mask fds_bits[(__FD_SETSIZE + (__NFDBITS - 1)) / __NFDBITS];
+# define __FDS_BITS(set) ((set)->fds_bits)
 #else
     __fd_mask __fds_bits[(__FD_SETSIZE + (__NFDBITS - 1)) / __NFDBITS];
+# define __FDS_BITS(set) ((set)->__fds_bits)
 #endif
   } __fd_set;
 
diff --git a/sysdeps/unix/alpha/sysdep.h b/sysdeps/unix/alpha/sysdep.h
index f43c7f8edf..80cb3e2486 100644
--- a/sysdeps/unix/alpha/sysdep.h
+++ b/sysdeps/unix/alpha/sysdep.h
@@ -109,4 +109,167 @@ __LABEL(name)					\
 
 #define MOVE(x,y)	mov x,y
 
-#endif
+#else /* !ASSEMBLER */
+
+/* Define a macro which expands inline into the wrapper code for a
+   system call.  */
+
+#undef INLINE_SYSCALL
+#define INLINE_SYSCALL(name, nr, args...)  INLINE_SYSCALL1(name, nr, args)
+
+#define INLINE_SYSCALL1(name, nr, args...)	\
+({						\
+	long _sc_ret, _sc_err;			\
+	inline_syscall##nr(name, args);		\
+	if (_sc_err)				\
+	  {					\
+	    __set_errno (_sc_ret);		\
+	    _sc_ret = -1L;			\
+	  }					\
+	_sc_ret;				\
+})
+
+#define inline_syscall_clobbers				\
+	"$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8",	\
+	"$22", "$23", "$24", "$25", "$27", "$28"
+
+/* It is moderately important optimization-wise to limit the lifetime
+   of the hard-register variables as much as possible.  Thus we copy
+   in/out as close to the asm as possible.  */
+
+#define inline_syscall0(name)			\
+{						\
+	register long _sc_0 __asm__("$0");	\
+	register long _sc_19 __asm__("$19");	\
+						\
+	_sc_0 = __NR_##name;			\
+	__asm__("callsys # %0 %1 <= %2"		\
+		: "=r"(_sc_0), "=r"(_sc_19)	\
+		: "0"(_sc_0)			\
+		: inline_syscall_clobbers);	\
+	_sc_ret = _sc_0, _sc_err = _sc_19;	\
+}
+
+#define inline_syscall1(name,arg1)		\
+{						\
+	register long _sc_0 __asm__("$0");	\
+	register long _sc_16 __asm__("$16");	\
+	register long _sc_19 __asm__("$19");	\
+						\
+	_sc_0 = __NR_##name;			\
+	_sc_16 = (long) (arg1);			\
+	__asm__("callsys # %0 %1 <= %2 %3"	\
+		: "=r"(_sc_0), "=r"(_sc_19)	\
+		: "0"(_sc_0), "r"(_sc_16)	\
+		: inline_syscall_clobbers);	\
+	_sc_ret = _sc_0, _sc_err = _sc_19;	\
+}
+
+#define inline_syscall2(name,arg1,arg2)			\
+{							\
+	register long _sc_0 __asm__("$0");		\
+	register long _sc_16 __asm__("$16");		\
+	register long _sc_17 __asm__("$17");		\
+	register long _sc_19 __asm__("$19");		\
+							\
+	_sc_0 = __NR_##name;				\
+	_sc_16 = (long) (arg1);				\
+	_sc_17 = (long) (arg2);				\
+	__asm__("callsys # %0 %1 <= %2 %3 %4"		\
+		: "=r"(_sc_0), "=r"(_sc_19)		\
+		: "0"(_sc_0), "r"(_sc_16), "r"(_sc_17)	\
+		: inline_syscall_clobbers);		\
+	_sc_ret = _sc_0, _sc_err = _sc_19;		\
+}
+
+#define inline_syscall3(name,arg1,arg2,arg3)		\
+{							\
+	register long _sc_0 __asm__("$0");		\
+	register long _sc_16 __asm__("$16");		\
+	register long _sc_17 __asm__("$17");		\
+	register long _sc_18 __asm__("$18");		\
+	register long _sc_19 __asm__("$19");		\
+							\
+	_sc_0 = __NR_##name;				\
+	_sc_16 = (long) (arg1);				\
+	_sc_17 = (long) (arg2);				\
+	_sc_18 = (long) (arg3);				\
+	__asm__("callsys # %0 %1 <= %2 %3 %4 %5"	\
+		: "=r"(_sc_0), "=r"(_sc_19)		\
+		: "0"(_sc_0), "r"(_sc_16), "r"(_sc_17),	\
+		  "r"(_sc_18)				\
+		: inline_syscall_clobbers);		\
+	_sc_ret = _sc_0, _sc_err = _sc_19;		\
+}
+
+#define inline_syscall4(name,arg1,arg2,arg3,arg4)	\
+{							\
+	register long _sc_0 __asm__("$0");		\
+	register long _sc_16 __asm__("$16");		\
+	register long _sc_17 __asm__("$17");		\
+	register long _sc_18 __asm__("$18");		\
+	register long _sc_19 __asm__("$19");		\
+							\
+	_sc_0 = __NR_##name;				\
+	_sc_16 = (long) (arg1);				\
+	_sc_17 = (long) (arg2);				\
+	_sc_18 = (long) (arg3);				\
+	_sc_19 = (long) (arg4);				\
+	__asm__("callsys # %0 %1 <= %2 %3 %4 %5 %6"	\
+		: "=r"(_sc_0), "=r"(_sc_19)		\
+		: "0"(_sc_0), "r"(_sc_16), "r"(_sc_17),	\
+		  "r"(_sc_18), "1"(_sc_19)		\
+		: inline_syscall_clobbers);		\
+	_sc_ret = _sc_0, _sc_err = _sc_19;		\
+}
+
+#define inline_syscall5(name,arg1,arg2,arg3,arg4,arg5)	\
+{							\
+	register long _sc_0 __asm__("$0");		\
+	register long _sc_16 __asm__("$16");		\
+	register long _sc_17 __asm__("$17");		\
+	register long _sc_18 __asm__("$18");		\
+	register long _sc_19 __asm__("$19");		\
+	register long _sc_20 __asm__("$20");		\
+							\
+	_sc_0 = __NR_##name;				\
+	_sc_16 = (long) (arg1);				\
+	_sc_17 = (long) (arg2);				\
+	_sc_18 = (long) (arg3);				\
+	_sc_19 = (long) (arg4);				\
+	_sc_20 = (long) (arg5);				\
+	__asm__("callsys # %0 %1 <= %2 %3 %4 %5 %6 %7"	\
+		: "=r"(_sc_0), "=r"(_sc_19)		\
+		: "0"(_sc_0), "r"(_sc_16), "r"(_sc_17),	\
+		  "r"(_sc_18), "1"(_sc_19), "r"(_sc_20)	\
+		: inline_syscall_clobbers);		\
+	_sc_ret = _sc_0, _sc_err = _sc_19;		\
+}
+
+#define inline_syscall6(name,arg1,arg2,arg3,arg4,arg5,arg6)	\
+{								\
+	register long _sc_0 __asm__("$0");			\
+	register long _sc_16 __asm__("$16");			\
+	register long _sc_17 __asm__("$17");			\
+	register long _sc_18 __asm__("$18");			\
+	register long _sc_19 __asm__("$19");			\
+	register long _sc_20 __asm__("$20");			\
+	register long _sc_21 __asm__("$21");			\
+								\
+	_sc_0 = __NR_##name;					\
+	_sc_16 = (long) (arg1);					\
+	_sc_17 = (long) (arg2);					\
+	_sc_18 = (long) (arg3);					\
+	_sc_19 = (long) (arg4);					\
+	_sc_20 = (long) (arg5);					\
+	_sc_21 = (long) (arg6);					\
+	__asm__("callsys # %0 %1 <= %2 %3 %4 %5 %6 %7 %8"	\
+		: "=r"(_sc_0), "=r"(_sc_19)			\
+		: "0"(_sc_0), "r"(_sc_16), "r"(_sc_17),		\
+		  "r"(_sc_18), "1"(_sc_19), "r"(_sc_20),	\
+		  "r"(_sc_21)					\
+		: inline_syscall_clobbers);			\
+	_sc_ret = _sc_0, _sc_err = _sc_19;			\
+}
+
+#endif /* ASSEMBLER */
diff --git a/sysdeps/unix/sysv/linux/alpha/syscalls.list b/sysdeps/unix/sysv/linux/alpha/syscalls.list
index b48f538211..9f002b2ad1 100644
--- a/sysdeps/unix/sysv/linux/alpha/syscalls.list
+++ b/sysdeps/unix/sysv/linux/alpha/syscalls.list
@@ -79,30 +79,3 @@ old_adjtimex	-	old_adjtimex	1	__adjtimex_tv32  __adjtimex@GLIBC_2.0 adjtimex@GLI
 
 # and one for timeval64 entry points
 adjtimex	adjtime	adjtimex	1	__syscall_adjtimex_tv64
-
-# System calls with wrappers.
-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_sigsuspend	-	rt_sigsuspend	2	__syscall_rt_sigsuspend
-rt_sigtimedwait	-	rt_sigtimedwait	4	__syscall_rt_sigtimedwait
-s_getcwd	getcwd	getcwd		2	__syscall_getcwd
-s_getdents	getdents getdents	3	__syscall_getdents
-s_getpriority	getpriority getpriority	2	__syscall_getpriority
-s_getresgid	getresgid getresgid	3	__syscall_getresgid
-s_getresuid	getresuid getresuid	3	__syscall_getresuid
-s_poll		poll	poll		3	__syscall_poll
-s_ptrace	ptrace	ptrace		4	__syscall_ptrace
-s_reboot	reboot	reboot		3	__syscall_reboot
-s_sigaction	sigaction sigaction	3	__syscall_sigaction
-s_sigpending	sigpending sigpending	1	__syscall_sigpending
-s_sigprocmask	sigprocmask sigprocmask	3	__syscall_sigprocmask
-s_sigsuspend	sigsuspend sigsuspend	3	__syscall_sigsuspend
-s_sysctl	sysctl	_sysctl		1	__syscall__sysctl
-sys_fstat	fxstat	fstat		2	__syscall_fstat
-sys_lstat	lxstat	lstat		2	__syscall_lstat
-sys_mknod	xmknod	mknod		3	__syscall_mknod
-sys_readv	readv	readv		3	__syscall_readv
-sys_stat	xstat	stat		2	__syscall_stat
-sys_writev	writev	writev		3	__syscall_writev
diff --git a/sysdeps/unix/sysv/linux/alpha/sysdep.h b/sysdeps/unix/sysv/linux/alpha/sysdep.h
index 29d973f5b9..1a3cf37c6d 100644
--- a/sysdeps/unix/sysv/linux/alpha/sysdep.h
+++ b/sysdeps/unix/sysv/linux/alpha/sysdep.h
@@ -55,3 +55,15 @@
 #define __NR_osf_shmat		209
 #define __NR_osf_getsysinfo	256
 #define __NR_osf_setsysinfo	257
+
+/*
+ * In order to get the hidden arguments for rt_sigaction set up
+ * properly, we need to call the assembly version.  Detect this in the
+ * INLINE_SYSCALL macro, and fail to expand inline in that case.
+ */
+
+#undef INLINE_SYSCALL
+#define INLINE_SYSCALL(name, nr, args...)	\
+	(__NR_##name == __NR_rt_sigaction	\
+	 ? __syscall_##name(args)		\
+	 : INLINE_SYSCALL1(name, nr, args))
diff --git a/sysdeps/unix/sysv/linux/i386/setgroups.c b/sysdeps/unix/sysv/linux/i386/setgroups.c
index 4266145d01..e57004f8ac 100644
--- a/sysdeps/unix/sysv/linux/i386/setgroups.c
+++ b/sysdeps/unix/sysv/linux/i386/setgroups.c
@@ -36,7 +36,7 @@ setgroups (n, groups)
      size_t n;
      const gid_t *groups;
 {
-  if (n < 0 || n > __sysconf (_SC_NGROUPS_MAX))
+  if (n > (size_t) __sysconf (_SC_NGROUPS_MAX))
     {
       __set_errno (EINVAL);
       return -1;
diff --git a/sysdeps/unix/sysv/linux/ttyname.c b/sysdeps/unix/sysv/linux/ttyname.c
index 35eb4b4696..6ea406a8b8 100644
--- a/sysdeps/unix/sysv/linux/ttyname.c
+++ b/sysdeps/unix/sysv/linux/ttyname.c
@@ -30,15 +30,14 @@
 
 char *__ttyname = NULL;
 
-static char * getttyname __P ((const char *dev, int fd, dev_t mydev,
+static char * getttyname __P ((const char *dev, dev_t mydev,
 			       ino_t myino, int save, int *dostat))
      internal_function;
 
 static char *
 internal_function
-getttyname (dev, fd, mydev, myino, save, dostat)
+getttyname (dev, mydev, myino, save, dostat)
      const char *dev;
-     int fd;
      dev_t mydev;
      ino_t myino;
      int save;
@@ -142,9 +141,9 @@ ttyname (fd)
   if (stat ("/dev/pts", &st1) == 0 && S_ISDIR (st1.st_mode))
     {
 #ifdef _STATBUF_ST_RDEV
-      name = getttyname ("/dev/pts", fd, st.st_rdev, st.st_ino, save, &dostat);
+      name = getttyname ("/dev/pts", st.st_rdev, st.st_ino, save, &dostat);
 #else
-      name = getttyname ("/dev/pts", fd, st.st_dev, st.st_ino, save, &dostat);
+      name = getttyname ("/dev/pts", st.st_dev, st.st_ino, save, &dostat);
 #endif
     }
   else
@@ -156,9 +155,9 @@ ttyname (fd)
   if (!name && dostat != -1)
     {
 #ifdef _STATBUF_ST_RDEV
-      name = getttyname ("/dev", fd, st.st_rdev, st.st_ino, save, &dostat);
+      name = getttyname ("/dev", st.st_rdev, st.st_ino, save, &dostat);
 #else
-      name = getttyname ("/dev", fd, st.st_dev, st.st_ino, save, &dostat);
+      name = getttyname ("/dev", st.st_dev, st.st_ino, save, &dostat);
 #endif
     }
 
@@ -166,9 +165,9 @@ ttyname (fd)
     {
       dostat = 1;
 #ifdef _STATBUF_ST_RDEV
-      name = getttyname ("/dev", fd, st.st_rdev, st.st_ino, save, &dostat);
+      name = getttyname ("/dev", st.st_rdev, st.st_ino, save, &dostat);
 #else
-      name = getttyname ("/dev", fd, st.st_dev, st.st_ino, save, &dostat);
+      name = getttyname ("/dev", st.st_dev, st.st_ino, save, &dostat);
 #endif
     }
 
diff --git a/sysdeps/unix/sysv/linux/ttyname_r.c b/sysdeps/unix/sysv/linux/ttyname_r.c
index 449942a96d..fe68e10b4d 100644
--- a/sysdeps/unix/sysv/linux/ttyname_r.c
+++ b/sysdeps/unix/sysv/linux/ttyname_r.c
@@ -28,14 +28,13 @@
 
 #include <stdio-common/_itoa.h>
 
-static int getttyname_r __P ((int fd, char *buf, size_t buflen,
+static int getttyname_r __P ((char *buf, size_t buflen,
 			      dev_t mydev, ino_t myino, int save,
 			      int *dostat)) internal_function;
 
 static int
 internal_function
-getttyname_r (fd, buf, buflen, mydev, myino, save, dostat)
-     int fd;
+getttyname_r (buf, buflen, mydev, myino, save, dostat)
      char *buf;
      size_t buflen;
      dev_t mydev;
@@ -152,10 +151,10 @@ __ttyname_r (fd, buf, buflen)
   if (stat (buf, &st1) == 0 && S_ISDIR (st1.st_mode))
     {
 #ifdef _STATBUF_ST_RDEV
-      ret = getttyname_r (fd, buf, buflen, st.st_rdev, st.st_ino, save,
+      ret = getttyname_r (buf, buflen, st.st_rdev, st.st_ino, save,
 			  &dostat);
 #else
-      ret = getttyname_r (fd, buf, buflen, st.st_dev, st.st_ino, save,
+      ret = getttyname_r (buf, buflen, st.st_dev, st.st_ino, save,
 			  &dostat);
 #endif
     }
@@ -170,10 +169,10 @@ __ttyname_r (fd, buf, buflen)
       buf[sizeof ("/dev/") - 1] = '\0';
       buflen += sizeof ("pts/") - 1;
 #ifdef _STATBUF_ST_RDEV
-      ret = getttyname_r (fd, buf, buflen, st.st_rdev, st.st_ino, save,
+      ret = getttyname_r (buf, buflen, st.st_rdev, st.st_ino, save,
 			  &dostat);
 #else
-      ret = getttyname_r (fd, buf, buflen, st.st_dev, st.st_ino, save,
+      ret = getttyname_r (buf, buflen, st.st_dev, st.st_ino, save,
 			  &dostat);
 #endif
     }
@@ -183,10 +182,10 @@ __ttyname_r (fd, buf, buflen)
       buf[sizeof ("/dev/") - 1] = '\0';
       dostat = 1;
 #ifdef _STATBUF_ST_RDEV
-      ret = getttyname_r (fd, buf, buflen, st.st_rdev, st.st_ino,
+      ret = getttyname_r (buf, buflen, st.st_rdev, st.st_ino,
 			  save, &dostat);
 #else
-      ret = getttyname_r (fd, buf, buflen, st.st_dev, st.st_ino,
+      ret = getttyname_r (buf, buflen, st.st_dev, st.st_ino,
 			  save, &dostat);
 #endif
     }