* [PATCH] Change INTERNAL_SYSCALL* so that it supports both arches which have error embedded in retval and arches which signal error otherwise
@ 2003-01-06 1:00 Jakub Jelinek
2003-01-06 1:19 ` Roland McGrath
0 siblings, 1 reply; 3+ messages in thread
From: Jakub Jelinek @ 2003-01-06 1:00 UTC (permalink / raw)
To: Ulrich Drepper, Roland McGrath, Richard Henderson; +Cc: Glibc hackers
Hi!
With this patch IA-64 and Alpha (the latter not in this patch) and
eventually SPARC* and ppc32 too can store syscall errno or error_p
separately from retval while keeping IA-32/x86-64 etc. sequences
unchanged.
The usage is like:
INTERNAL_SYSCALL_DECL (err);
retval = INTERNAL_SYSCALL (syscall_name, err, 3, arg1, arg2, arg3);
if (INTERNAL_SYSCALL_ERROR_P (retval, err))
errno_from_syscall = INTERNAL_SYSCALL_ERRNO (retval, err);
2003-01-06 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/ia64/sysdep.h (INTERNAL_SYSCALL,
INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO): Add err
argument.
(INTERNAL_SYSCALL_DECL): Define.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/sparc/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/i386/sysdep.h: Likewise.
(INLINE_SYSCALL): Adjust.
* sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/m68k/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/x86_64/sysdep.h: Likewise.
* elf/dl-misc.c (_dl_debug_vdprintf): Add INTERNAL_SYSCALL_DECL,
add err argument to INTERNAL_SYSCALL* macros.
* sysdeps/unix/sysv/linux/i386/brk.c (__brk): Likewise.
* sysdeps/unix/sysv/linux/i386/system.c (cancel_handler): Likewise.
* sysdeps/unix/sysv/linux/m68k/brk.c (__brk): Likewise.
* sysdeps/unix/sysv/linux/m68k/getpagesize.c (__getpagesize):
Likewise.
* sysdeps/unix/sysv/linux/sigwait.c (do_sigwait): Likewise.
* sysdeps/unix/sysv/linux/i386/sigaction.c (__libc_sigaction): Use
INLINE_SYSCALL instead of INTERNAL_SYSCALL and setting errno.
linuxthreads/
* sysdeps/unix/sysv/linux/sigwait.c (do_sigwait): Add
INTERNAL_SYSCALL_DECL, add err argument to INTERNAL_SYSCALL* macros.
nptl/
* sysdeps/pthread/pthread_sigmask.c (pthread_sigmask): Add
INTERNAL_SYSCALL_DECL, add err argument to INTERNAL_SYSCALL* macros.
* sysdeps/unix/sysv/linux/raise.c (raise): Likewise.
* init.c (__pthread_initialize_minimal_internal): Likewise.
--- libc/elf/dl-misc.c.jj 2002-12-20 13:34:41.000000000 +0100
+++ libc/elf/dl-misc.c 2003-01-05 23:18:08.000000000 +0100
@@ -1,5 +1,6 @@
/* Miscellaneous support functions for dynamic linker
- Copyright (C) 1997,1998,1999,2000,2001,2002 Free Software Foundation, Inc.
+ Copyright (C) 1997,1998,1999,2000,2001,2002,2003
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -248,7 +249,8 @@ _dl_debug_vdprintf (int fd, int tag_p, c
/* Finally write the result. */
#ifdef INTERNAL_SYSCALL
- INTERNAL_SYSCALL (writev, 3, fd, iov, niov);
+ INTERNAL_SYSCALL_DECL (err);
+ INTERNAL_SYSCALL (writev, err, 3, fd, iov, niov);
#elif RTLD_PRIVATE_ERRNO
/* We have to take this lock just to be sure we don't clobber the private
errno when it's being used by another thread that cares about it.
--- libc/linuxthreads/sysdeps/unix/sysv/linux/sigwait.c.jj 2003-01-03 01:39:19.000000000 +0100
+++ libc/linuxthreads/sysdeps/unix/sysv/linux/sigwait.c 2003-01-05 23:19:26.000000000 +0100
@@ -39,15 +39,16 @@ do_sigwait (const sigset_t *set, int *si
/* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */
#ifdef INTERNAL_SYSCALL
- ret = INTERNAL_SYSCALL (rt_sigtimedwait, 4, CHECK_SIGSET (set),
+ INTERNAL_SYSCALL_DECL (err);
+ ret = INTERNAL_SYSCALL (rt_sigtimedwait, err, 4, CHECK_SIGSET (set),
NULL, NULL, _NSIG / 8);
- if (! INTERNAL_SYSCALL_ERROR_P (ret))
+ if (! INTERNAL_SYSCALL_ERROR_P (ret, err))
{
*sig = ret;
ret = 0;
}
else
- ret = INTERNAL_SYSCALL_ERRNO (ret);
+ ret = INTERNAL_SYSCALL_ERRNO (ret, err);
#else
ret = INLINE_SYSCALL (rt_sigtimedwait, 4, CHECK_SIGSET (set),
NULL, NULL, _NSIG / 8);
--- libc/sysdeps/unix/sysv/linux/ia64/sysdep.h.jj 2003-01-01 03:38:13.000000000 +0100
+++ libc/sysdeps/unix/sysv/linux/ia64/sysdep.h 2003-01-05 22:53:48.000000000 +0100
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2000, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jes Sorensen, <Jes.Sorensen@cern.ch>, April 1999.
Based on code originally written by David Mosberger-Tang
@@ -134,8 +134,11 @@
} \
_retval; })
+#undef INTERNAL_SYSCALL_DECL
+#define INTERNAL_SYSCALL_DECL(err) long int err
+
#undef INTERNAL_SYSCALL
-#define INTERNAL_SYSCALL(name, nr, args...) \
+#define INTERNAL_SYSCALL(name, err, nr, args...) \
({ \
register long _r8 asm ("r8"); \
register long _r10 asm ("r10"); \
@@ -148,15 +151,14 @@
ASM_ARGS_##nr \
: "memory" ASM_CLOBBERS_##nr); \
_retval = _r8; \
- if (_r10 == -1) \
- _retval = -_retval; \
+ err = _r10; \
_retval; })
#undef INTERNAL_SYSCALL_ERROR_P
-#define INTERNAL_SYSCALL_ERROR_P(val) ((unsigned long) (val) >= -4095UL)
+#define INTERNAL_SYSCALL_ERROR_P(val, err) (err == -1)
#undef INTERNAL_SYSCALL_ERRNO
-#define INTERNAL_SYSCALL_ERRNO(val) (-(val))
+#define INTERNAL_SYSCALL_ERRNO(val, err) (val)
#define LOAD_ARGS_0() do { } while (0)
#define LOAD_ARGS_1(out0) \
--- libc/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h.jj 2002-10-25 12:34:50.000000000 +0200
+++ libc/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h 2003-01-05 23:15:14.000000000 +0100
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000,01,02 Free Software Foundation, Inc.
+/* Copyright (C) 2000,01,02,03 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
@@ -121,33 +121,37 @@
#undef INLINE_SYSCALL
#define INLINE_SYSCALL(name, nr, args...) \
({ \
- unsigned int err = INTERNAL_SYSCALL (name, nr, args); \
- if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (err), 0)) \
+ unsigned int _ret = INTERNAL_SYSCALL (name, , nr, args); \
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (_ret, ), 0)) \
{ \
- __set_errno (INTERNAL_SYSCALL_ERRNO (err)); \
- err = 0xffffffff; \
+ __set_errno (INTERNAL_SYSCALL_ERRNO (_ret, )); \
+ _ret = 0xffffffff; \
} \
- (int) err; })
+ (int) _ret; })
+
+#undef INTERNAL_SYSCALL_DECL
+#define INTERNAL_SYSCALL_DECL(err) do { } while (0)
#undef INTERNAL_SYSCALL
-#define INTERNAL_SYSCALL(name, nr, args...) \
+#define INTERNAL_SYSCALL(name, err, nr, args...) \
({ \
DECLARGS_##nr(args) \
- int err; \
+ int _ret; \
asm volatile ( \
LOADARGS_##nr \
"svc %b1\n\t" \
"lr %0,%%r2\n\t" \
- : "=d" (err) \
+ : "=d" (_ret) \
: "I" (__NR_##name) ASMFMT_##nr \
: "memory", "cc", "2", "3", "4", "5", "6"); \
- (int) err; })
+ (int) _ret; })
#undef INTERNAL_SYSCALL_ERROR_P
-#define INTERNAL_SYSCALL_ERROR_P(val) ((unsigned int) (val) >= 0xfffff001u)
+#define INTERNAL_SYSCALL_ERROR_P(val, err) \
+ ((unsigned int) (val) >= 0xfffff001u)
#undef INTERNAL_SYSCALL_ERRNO
-#define INTERNAL_SYSCALL_ERRNO(val) (-(val))
+#define INTERNAL_SYSCALL_ERRNO(val, err) (-(val))
#define DECLARGS_0()
#define DECLARGS_1(arg1) \
--- libc/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h.jj 2002-10-25 12:34:50.000000000 +0200
+++ libc/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h 2003-01-05 23:16:50.000000000 +0100
@@ -115,33 +115,37 @@
#undef INLINE_SYSCALL
#define INLINE_SYSCALL(name, nr, args...) \
({ \
- unsigned int err = INTERNAL_SYSCALL (name, nr, args); \
- if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (err), 0)) \
+ unsigned int _ret = INTERNAL_SYSCALL (name, , nr, args); \
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (_ret, ), 0)) \
{ \
- __set_errno (INTERNAL_SYSCALL_ERRNO (err)); \
- err = -1; \
+ __set_errno (INTERNAL_SYSCALL_ERRNO (_ret, )); \
+ _ret = -1; \
} \
- (int) err; })
+ (int) _ret; })
+
+#undef INTERNAL_SYSCALL_DECL
+#define INTERNAL_SYSCALL_DECL(err) do { } while (0)
#undef INTERNAL_SYSCALL
-#define INTERNAL_SYSCALL(name, nr, args...) \
+#define INTERNAL_SYSCALL(name, err, nr, args...) \
({ \
DECLARGS_##nr(args) \
- int err; \
+ int _ret; \
asm volatile ( \
LOADARGS_##nr \
"svc %b1\n\t" \
"lgr %0,%%r2\n\t" \
- : "=d" (err) \
+ : "=d" (_ret) \
: "I" (__NR_##name) ASMFMT_##nr \
: "memory", "cc", "2", "3", "4", "5", "6"); \
- (int) err; })
+ (int) _ret; })
#undef INTERNAL_SYSCALL_ERROR_P
-#define INTERNAL_SYSCALL_ERROR_P(val) ((unsigned int) (val) >= 0xfffff001u)
+#define INTERNAL_SYSCALL_ERROR_P(val, err) \
+ ((unsigned int) (val) >= 0xfffff001u)
#undef INTERNAL_SYSCALL_ERRNO
-#define INTERNAL_SYSCALL_ERRNO(val) (-(val))
+#define INTERNAL_SYSCALL_ERRNO(val, err) (-(val))
#define DECLARGS_0()
#define DECLARGS_1(arg1) \
--- libc/sysdeps/unix/sysv/linux/i386/sysdep.h.jj 2002-12-28 12:29:48.000000000 +0100
+++ libc/sysdeps/unix/sysv/linux/i386/sysdep.h 2003-01-05 22:48:43.000000000 +0100
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992,93,95,96,97,98,99,2000,02 Free Software Foundation, Inc.
+/* Copyright (C) 1992,1993,1995-2000,2002,2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper, <drepper@gnu.org>, August 1995.
@@ -313,10 +313,10 @@ asm (".L__X'%ebx = 1\n\t"
#undef INLINE_SYSCALL
#define INLINE_SYSCALL(name, nr, args...) \
({ \
- unsigned int resultvar = INTERNAL_SYSCALL (name, nr, args); \
- if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (resultvar), 0)) \
+ unsigned int resultvar = INTERNAL_SYSCALL (name, , nr, args); \
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (resultvar, ), 0)) \
{ \
- __set_errno (INTERNAL_SYSCALL_ERRNO (resultvar)); \
+ __set_errno (INTERNAL_SYSCALL_ERRNO (resultvar, )); \
resultvar = 0xffffffff; \
} \
(int) resultvar; })
@@ -328,7 +328,7 @@ asm (".L__X'%ebx = 1\n\t"
#undef INTERNAL_SYSCALL
#ifdef I386_USE_SYSENTER
# ifdef SHARED
-# define INTERNAL_SYSCALL(name, nr, args...) \
+# define INTERNAL_SYSCALL(name, err, nr, args...) \
({ \
unsigned int resultvar; \
asm volatile ( \
@@ -341,7 +341,7 @@ asm (".L__X'%ebx = 1\n\t"
ASMFMT_##nr(args) : "memory", "cc"); \
(int) resultvar; })
# else
-# define INTERNAL_SYSCALL(name, nr, args...) \
+# define INTERNAL_SYSCALL(name, err, nr, args...) \
({ \
unsigned int resultvar; \
asm volatile ( \
@@ -354,7 +354,7 @@ asm (".L__X'%ebx = 1\n\t"
(int) resultvar; })
# endif
#else
-# define INTERNAL_SYSCALL(name, nr, args...) \
+# define INTERNAL_SYSCALL(name, err, nr, args...) \
({ \
unsigned int resultvar; \
asm volatile ( \
@@ -367,11 +367,15 @@ asm (".L__X'%ebx = 1\n\t"
(int) resultvar; })
#endif
+#undef INTERNAL_SYSCALL_DECL
+#define INTERNAL_SYSCALL_DECL(err) do { } while (0)
+
#undef INTERNAL_SYSCALL_ERROR_P
-#define INTERNAL_SYSCALL_ERROR_P(val) ((unsigned int) (val) >= 0xfffff001u)
+#define INTERNAL_SYSCALL_ERROR_P(val, err) \
+ ((unsigned int) (val) >= 0xfffff001u)
#undef INTERNAL_SYSCALL_ERRNO
-#define INTERNAL_SYSCALL_ERRNO(val) (-(val))
+#define INTERNAL_SYSCALL_ERRNO(val, err) (-(val))
#define LOADARGS_0
#if defined I386_USE_SYSENTER && defined SHARED
--- libc/sysdeps/unix/sysv/linux/i386/brk.c.jj 2002-12-28 12:36:08.000000000 +0100
+++ libc/sysdeps/unix/sysv/linux/i386/brk.c 2003-01-05 23:24:29.000000000 +0100
@@ -1,5 +1,5 @@
/* brk system call for Linux/i386.
- Copyright (C) 1995, 1996, 2000, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 2000, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -36,7 +36,9 @@ __brk (void *addr)
{
void *__unbounded newbrk;
- newbrk = (void *__unbounded) INTERNAL_SYSCALL (brk, 1, __ptrvalue (addr));
+ INTERNAL_SYSCALL_DECL (err);
+ newbrk = (void *__unbounded) INTERNAL_SYSCALL (brk, err, 1,
+ __ptrvalue (addr));
__curbrk = newbrk;
--- libc/sysdeps/unix/sysv/linux/i386/sigaction.c.jj 2003-01-03 14:07:00.000000000 +0100
+++ libc/sysdeps/unix/sysv/linux/i386/sigaction.c 2003-01-05 23:29:15.000000000 +0100
@@ -131,15 +131,12 @@ __libc_sigaction (int sig, const struct
k_newact.sa_restorer = &restore;
}
- result = INTERNAL_SYSCALL (sigaction, 3, sig,
- act ? __ptrvalue (&k_newact) : 0,
- oact ? __ptrvalue (&k_oldact) : 0);
+ result = INLINE_SYSCALL (sigaction, 3, sig,
+ act ? __ptrvalue (&k_newact) : 0,
+ oact ? __ptrvalue (&k_oldact) : 0);
if (result < 0)
- {
- __set_errno (-result);
- return -1;
- }
+ return -1;
if (oact)
{
--- libc/sysdeps/unix/sysv/linux/i386/system.c.jj 2003-01-05 22:08:49.000000000 +0100
+++ libc/sysdeps/unix/sysv/linux/i386/system.c 2003-01-06 00:26:37.000000000 +0100
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -56,7 +56,8 @@ cancel_handler (void *arg)
{
pid_t child = *(pid_t *) arg;
- INTERNAL_SYSCALL (kill, 2, child, SIGKILL);
+ INTERNAL_SYSCALL_DECL (err);
+ INTERNAL_SYSCALL (kill, err, 2, child, SIGKILL);
TEMP_FAILURE_RETRY (__waitpid (child, NULL, 0));
--- libc/sysdeps/unix/sysv/linux/m68k/sysdep.h.jj 2002-12-28 12:29:48.000000000 +0100
+++ libc/sysdeps/unix/sysv/linux/m68k/sysdep.h 2003-01-05 23:12:40.000000000 +0100
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998, 2000, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Andreas Schwab, <schwab@issan.informatik.uni-dortmund.de>,
December 1995.
@@ -180,20 +180,23 @@ SYSCALL_ERROR_LABEL: \
call. */
#undef INLINE_SYSCALL
#define INLINE_SYSCALL(name, nr, args...) \
- ({ unsigned int _sys_result = INTERNAL_SYSCALL (name, nr, args); \
- if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (_sys_result), 0)) \
+ ({ unsigned int _sys_result = INTERNAL_SYSCALL (name, , nr, args); \
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (_sys_result, ), 0))\
{ \
- __set_errno (INTERNAL_SYSCALL_ERRNO (_sys_result)); \
+ __set_errno (INTERNAL_SYSCALL_ERRNO (_sys_result, )); \
_sys_result = (unsigned int) -1; \
} \
(int) _sys_result; })
+#undef INTERNAL_SYSCALL_DECL
+#define INTERNAL_SYSCALL_DECL(err) do { } while (0)
+
/* Define a macro which expands inline into the wrapper code for a system
call. This use is for internal calls that do not need to handle errors
normally. It will never touch errno. This returns just what the kernel
gave back. */
#undef INTERNAL_SYSCALL
-#define INTERNAL_SYSCALL(name, nr, args...) \
+#define INTERNAL_SYSCALL(name, err, nr, args...) \
({ unsigned int _sys_result; \
{ \
LOAD_ARGS_##nr (args) \
@@ -207,10 +210,11 @@ SYSCALL_ERROR_LABEL: \
(int) _sys_result; })
#undef INTERNAL_SYSCALL_ERROR_P
-#define INTERNAL_SYSCALL_ERROR_P(val) ((unsigned int) (val) >= -4095U)
+#define INTERNAL_SYSCALL_ERROR_P(val, err) \
+ ((unsigned int) (val) >= -4095U)
#undef INTERNAL_SYSCALL_ERRNO
-#define INTERNAL_SYSCALL_ERRNO(val) (-(val))
+#define INTERNAL_SYSCALL_ERRNO(val, err) (-(val))
#define LOAD_ARGS_0()
#define ASM_ARGS_0
--- libc/sysdeps/unix/sysv/linux/m68k/brk.c.jj 2002-12-28 12:29:48.000000000 +0100
+++ libc/sysdeps/unix/sysv/linux/m68k/brk.c 2003-01-05 23:29:56.000000000 +0100
@@ -1,5 +1,5 @@
/* brk system call for Linux/m68k.
- Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -33,7 +33,8 @@ __brk (void *addr)
{
void *newbrk;
- newbrk = (void *) INTERNAL_SYSCALL (brk, 1, addr);
+ INTERNAL_SYSCALL_DECL (err);
+ newbrk = (void *) INTERNAL_SYSCALL (brk, err, 1, addr);
__curbrk = newbrk;
if (newbrk < addr)
--- libc/sysdeps/unix/sysv/linux/m68k/getpagesize.c.jj 2002-12-28 12:29:48.000000000 +0100
+++ libc/sysdeps/unix/sysv/linux/m68k/getpagesize.c 2003-01-05 23:30:44.000000000 +0100
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Schwab <schwab@suse.de>.
@@ -37,9 +37,10 @@ __getpagesize ()
return GL(dl_pagesize);
#ifdef __NR_getpagesize
- result = INTERNAL_SYSCALL (getpagesize, 0);
+ INTERNAL_SYSCALL_DECL (err);
+ result = INTERNAL_SYSCALL (getpagesize, err, 0);
/* The only possible error is ENOSYS. */
- if (!INTERNAL_SYSCALL_ERROR_P (result))
+ if (!INTERNAL_SYSCALL_ERROR_P (result, err))
return result;
#endif
--- libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h.jj 2003-01-05 22:08:52.000000000 +0100
+++ libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h 2003-01-05 23:08:34.000000000 +0100
@@ -99,8 +99,11 @@
gave back in the non-error (CR0.SO cleared) case, otherwise (CR0.SO set)
the negation of the return value in the kernel gets reverted. */
-#undef INTERNAL_SYSCALL
-# define INTERNAL_SYSCALL(name, nr, args...) \
+# undef INTERNAL_SYSCALL_DECL
+# define INTERNAL_SYSCALL_DECL(err) do { } while (0)
+
+# undef INTERNAL_SYSCALL
+# define INTERNAL_SYSCALL(name, err, nr, args...) \
({ \
register long r0 __asm__ ("r0"); \
register long r3 __asm__ ("r3"); \
@@ -127,11 +130,12 @@
(int) r3; \
})
-#undef INTERNAL_SYSCALL_ERROR_P
-#define INTERNAL_SYSCALL_ERROR_P(val) ((unsigned long) (val) >= -4095U)
-
-#undef INTERNAL_SYSCALL_ERRNO
-#define INTERNAL_SYSCALL_ERRNO(val) (-(val))
+# undef INTERNAL_SYSCALL_ERROR_P
+# define INTERNAL_SYSCALL_ERROR_P(val, err) \
+ ((unsigned long) (val) >= -4095U)
+
+# undef INTERNAL_SYSCALL_ERRNO
+# define INTERNAL_SYSCALL_ERRNO(val, err) (-(val))
# define LOADARGS_0(name, dummy) \
r0 = __NR_##name
--- libc/sysdeps/unix/sysv/linux/sparc/sysdep.h.jj 2002-10-25 12:34:51.000000000 +0200
+++ libc/sysdeps/unix/sysv/linux/sparc/sysdep.h 2003-01-05 23:04:18.000000000 +0100
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jakub@redhat.com>, 2000.
@@ -24,15 +24,19 @@
#define INLINE_SYSCALL(name, nr, args...) \
inline_syscall##nr(__SYSCALL_STRING, name, args)
+#undef INTERNAL_SYSCALL_DECL
+#define INTERNAL_SYSCALL_DECL(err) do { } while (0)
+
#undef INTERNAL_SYSCALL
-#define INTERNAL_SYSCALL(name, nr, args...) \
+#define INTERNAL_SYSCALL(name, err, nr, args...) \
inline_syscall##nr(__INTERNAL_SYSCALL_STRING, name, args)
#undef INTERNAL_SYSCALL_ERROR_P
-#define INTERNAL_SYSCALL_ERROR_P(val) ((unsigned long) (val) >= -515L)
+#define INTERNAL_SYSCALL_ERROR_P(val, err) \
+ ((unsigned long) (val) >= -515L)
#undef INTERNAL_SYSCALL_ERRNO
-#define INTERNAL_SYSCALL_ERRNO(val) (-(val))
+#define INTERNAL_SYSCALL_ERRNO(val, err) (-(val))
#define inline_syscall0(string,name,dummy...) \
({ \
--- libc/sysdeps/unix/sysv/linux/x86_64/sysdep.h.jj 2002-10-25 12:34:52.000000000 +0200
+++ libc/sysdeps/unix/sysv/linux/x86_64/sysdep.h 2003-01-05 22:59:39.000000000 +0100
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001,02 Free Software Foundation, Inc.
+/* Copyright (C) 2001,02,03 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -186,16 +186,19 @@
#undef INLINE_SYSCALL
#define INLINE_SYSCALL(name, nr, args...) \
({ \
- unsigned long resultvar = INTERNAL_SYSCALL (name, nr, args); \
- if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (resultvar), 0)) \
+ unsigned long resultvar = INTERNAL_SYSCALL (name, , nr, args); \
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (resultvar, ), 0)) \
{ \
- __set_errno (INTERNAL_SYSCALL_ERRNO (resultvar)); \
+ __set_errno (INTERNAL_SYSCALL_ERRNO (resultvar, )); \
resultvar = (unsigned long) -1; \
} \
(long) resultvar; })
+#undef INTERNAL_SYSCALL_DECL
+#define INTERNAL_SYSCALL_DECL(err) do { } while (0)
+
#undef INTERNAL_SYSCALL
-#define INTERNAL_SYSCALL(name, nr, args...) \
+#define INTERNAL_SYSCALL(name, err, nr, args...) \
({ \
unsigned long resultvar; \
LOAD_ARGS_##nr (args) \
@@ -207,10 +210,11 @@
(long) resultvar; })
#undef INTERNAL_SYSCALL_ERROR_P
-#define INTERNAL_SYSCALL_ERROR_P(val) ((unsigned long) (val) >= -4095L)
+#define INTERNAL_SYSCALL_ERROR_P(val, err) \
+ ((unsigned long) (val) >= -4095L)
#undef INTERNAL_SYSCALL_ERRNO
-#define INTERNAL_SYSCALL_ERRNO(val) (-(val))
+#define INTERNAL_SYSCALL_ERRNO(val, err) (-(val))
#define LOAD_ARGS_0()
#define ASM_ARGS_0
--- libc/sysdeps/unix/sysv/linux/sigwait.c.jj 2002-12-16 00:20:56.000000000 +0100
+++ libc/sysdeps/unix/sysv/linux/sigwait.c 2003-01-05 23:31:27.000000000 +0100
@@ -39,15 +39,16 @@ do_sigwait (const sigset_t *set, int *si
/* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */
#ifdef INTERNAL_SYSCALL
- ret = INTERNAL_SYSCALL (rt_sigtimedwait, 4, CHECK_SIGSET (set),
+ INTERNAL_SYSCALL_DECL (err);
+ ret = INTERNAL_SYSCALL (rt_sigtimedwait, err, 4, CHECK_SIGSET (set),
NULL, NULL, _NSIG / 8);
- if (! INTERNAL_SYSCALL_ERROR_P (ret))
+ if (! INTERNAL_SYSCALL_ERROR_P (ret, err))
{
*sig = ret;
ret = 0;
}
else
- ret = INTERNAL_SYSCALL_ERRNO (ret);
+ ret = INTERNAL_SYSCALL_ERRNO (ret, err);
#else
ret = INLINE_SYSCALL (rt_sigtimedwait, 4, CHECK_SIGSET (set),
NULL, NULL, _NSIG / 8);
--- libc/nptl/sysdeps/pthread/pthread_sigmask.c.jj 2002-11-28 00:37:15.000000000 +0100
+++ libc/nptl/sysdeps/pthread/pthread_sigmask.c 2003-01-05 23:32:47.000000000 +0100
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -44,11 +44,12 @@ pthread_sigmask (how, newmask, oldmask)
#ifdef INTERNAL_SYSCALL
/* We know that realtime signals are available if NPTL is used. */
- int result = INTERNAL_SYSCALL (rt_sigprocmask, 4, how, newmask, oldmask,
- _NSIG / 8);
+ INTERNAL_SYSCALL_DECL (err);
+ int result = INTERNAL_SYSCALL (rt_sigprocmask, err, 4, how, newmask,
+ oldmask, _NSIG / 8);
- return (INTERNAL_SYSCALL_ERROR_P (result)
- ? INTERNAL_SYSCALL_ERRNO (result)
+ return (INTERNAL_SYSCALL_ERROR_P (result, err)
+ ? INTERNAL_SYSCALL_ERRNO (result, err)
: 0);
#else
return sigprocmask (how, newmask, oldmask) == -1 ? errno : 0;
--- libc/nptl/sysdeps/unix/sysv/linux/raise.c.jj 2002-12-20 12:17:13.000000000 +0100
+++ libc/nptl/sysdeps/unix/sysv/linux/raise.c 2003-01-05 23:33:32.000000000 +0100
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -33,7 +33,8 @@ raise (sig)
{
/* This system call is not supposed to fail. */
#ifdef INTERNAL_SYSCALL
- selftid = INTERNAL_SYSCALL (gettid, 0);
+ INTERNAL_SYSCALL_DECL (err);
+ selftid = INTERNAL_SYSCALL (gettid, err, 0);
#else
selftid = INLINE_SYSCALL (gettid, 0);
#endif
--- libc/nptl/init.c.jj 2003-01-05 20:44:18.000000000 +0100
+++ libc/nptl/init.c 2003-01-05 23:34:29.000000000 +0100
@@ -172,7 +172,8 @@ __pthread_initialize_minimal_internal (v
/* Minimal initialization of the thread descriptor. */
struct pthread *pd = THREAD_SELF;
- pd->tid = INTERNAL_SYSCALL (set_tid_address, 1, &pd->tid);
+ INTERNAL_SYSCALL_DECL (err);
+ pd->tid = INTERNAL_SYSCALL (set_tid_address, err, 1, &pd->tid);
THREAD_SETMEM (pd, specific[0], &pd->specific_1stblock[0]);
THREAD_SETMEM (pd, user_stack, true);
if (LLL_LOCK_INITIALIZER != 0)
Jakub
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] Change INTERNAL_SYSCALL* so that it supports both arches which have error embedded in retval and arches which signal error otherwise
2003-01-06 1:00 [PATCH] Change INTERNAL_SYSCALL* so that it supports both arches which have error embedded in retval and arches which signal error otherwise Jakub Jelinek
@ 2003-01-06 1:19 ` Roland McGrath
2003-01-06 1:39 ` Ulrich Drepper
0 siblings, 1 reply; 3+ messages in thread
From: Roland McGrath @ 2003-01-06 1:19 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Ulrich Drepper, Richard Henderson, Glibc hackers
> The usage is like:
> INTERNAL_SYSCALL_DECL (err);
> retval = INTERNAL_SYSCALL (syscall_name, err, 3, arg1, arg2, arg3);
> if (INTERNAL_SYSCALL_ERROR_P (retval, err))
> errno_from_syscall = INTERNAL_SYSCALL_ERRNO (retval, err);
I guess this is ok, but a little bulky. If it's always `int err' and
nonzero to indicate, on x86 that's something like "err = retval < 0 ?
-retval : 0;". Does the compiler really fail to eliminate all that work if
`err' is dead?
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] Change INTERNAL_SYSCALL* so that it supports both arches which have error embedded in retval and arches which signal error otherwise
2003-01-06 1:19 ` Roland McGrath
@ 2003-01-06 1:39 ` Ulrich Drepper
0 siblings, 0 replies; 3+ messages in thread
From: Ulrich Drepper @ 2003-01-06 1:39 UTC (permalink / raw)
To: Roland McGrath; +Cc: Jakub Jelinek, Richard Henderson, Glibc hackers
Roland McGrath wrote:
> I guess this is ok, but a little bulky. If it's always `int err' and
> nonzero to indicate, on x86 that's something like "err = retval < 0 ?
> -retval : 0;". Does the compiler really fail to eliminate all that work if
> `err' is dead?
I don't think it's "bulky" and I definitely don't want to take the
chance that gcc misses to optimize some variable out.
--
--------------. ,-. 444 Castro Street
Ulrich Drepper \ ,-----------------' \ Mountain View, CA 94041 USA
Red Hat `--' drepper at redhat.com `---------------------------
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2003-01-06 1:39 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-01-06 1:00 [PATCH] Change INTERNAL_SYSCALL* so that it supports both arches which have error embedded in retval and arches which signal error otherwise Jakub Jelinek
2003-01-06 1:19 ` Roland McGrath
2003-01-06 1:39 ` Ulrich Drepper
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).