diff options
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/generic/bits/types.h | 4 | ||||
-rw-r--r-- | sysdeps/unix/alpha/sysdep.h | 165 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/alpha/syscalls.list | 27 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/alpha/sysdep.h | 12 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/setgroups.c | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ttyname.c | 17 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ttyname_r.c | 17 |
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 } |