diff --git a/ChangeLog b/ChangeLog index a6011dfc06..6ba5af12ed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2002-10-11 Ulrich Drepper + * sysdeps/unix/sysv/linux/sigwait.c (__sigwait): Use + INTERNAL_SYSCALL is possible. + + * sysdeps/unix/sysv/linux/i386/sysdep.h + (INTERNAL_SYSCALL_ERROR_P): New define. + (INTERNAL_SYSCALL_ERRNO): Likewise. + * sysdeps/unix/sysv/linux/i386/profil-counter.h (profil_counter): Add hack to prevent the compiler from clobbering the signal context. diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h index 87dfe9042c..ac7edb406c 100644 --- a/sysdeps/unix/sysv/linux/i386/sysdep.h +++ b/sysdeps/unix/sysv/linux/i386/sysdep.h @@ -291,9 +291,9 @@ asm (".L__X'%ebx = 1\n\t" #define INLINE_SYSCALL(name, nr, args...) \ ({ \ unsigned int resultvar = INTERNAL_SYSCALL(name, nr, args); \ - if (resultvar >= 0xfffff001) \ + if (INTERNAL_SYSCALL_ERROR_P (resultvar)) \ { \ - __set_errno (-resultvar); \ + __set_errno (INTERNAL_SYSCALL_ERRNO (resultvar)); \ resultvar = 0xffffffff; \ } \ (int) resultvar; }) @@ -315,6 +315,12 @@ asm (".L__X'%ebx = 1\n\t" : "i" (__NR_##name) ASMFMT_##nr(args) : "memory", "cc"); \ (int) resultvar; }) +#undef INTERNAL_SYSCALL_ERROR_P +#define INTERNAL_SYSCALL_ERROR_P(val) ((val) >= 0xfffff001) + +#undef INTERNAL_SYSCALL_ERRNO +#define INTERNAL_SYSCALL_ERRNO(val) (-(val)) + #define LOADARGS_0 #define LOADARGS_1 \ "bpushl .L__X'%k2, %k2\n\t" \ diff --git a/sysdeps/unix/sysv/linux/sigwait.c b/sysdeps/unix/sysv/linux/sigwait.c index 6eb4cf9532..121e5e0557 100644 --- a/sysdeps/unix/sysv/linux/sigwait.c +++ b/sysdeps/unix/sysv/linux/sigwait.c @@ -40,9 +40,19 @@ __sigwait (set, sig) /* XXX The size argument hopefully will have to be changed to the real size of the user-level sigset_t. */ - /* XXX INLINE_SYSCALL_NOERROR candiate. */ - ret = INLINE_SYSCALL (rt_sigtimedwait, 4, CHECK_SIGSET (set), - NULL, NULL, _NSIG / 8); +#ifdef INTERNAL_SYSCALL + ret = INTERNAL_SYSCALL (rt_sigtimedwait, 4, CHECK_SIGSET (set), + NULL, NULL, _NSIG / 8); + if (! INTERNAL_SYSCALL_ERROR_P (ret)) + { + *sig = ret; + ret = 0; + } + else + ret = INTERNAL_SYSCALL_ERRNO (ret); +#else + ret = INLINE_SYSCALL (rt_sigtimedwait, 4, CHECK_SIGSET (set), + NULL, NULL, _NSIG / 8); if (ret != -1) { *sig = ret; @@ -50,6 +60,7 @@ __sigwait (set, sig) } else ret = errno; +#endif return ret; }