summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2009-07-09 15:09:29 -0400
committerMike Frysinger <vapier@gentoo.org>2009-07-09 15:11:46 -0400
commit763bbf9e9a27426c9be8322dca5ddf2cb4dbc464 (patch)
tree1bdc0f8f1b01f27fdf9eb5c919d02ce73630d99e
parent5ca445cb7b0e1ed549ff1db454c6a0460e2e0833 (diff)
syscall: unify part 2: NCS variety
Declare common NCS (non-constant syscall) variants and convert the existing ports over to this. Signed-off-by: Mike Frysinger <vapier@gentoo.org>
-rw-r--r--libc/sysdeps/linux/alpha/bits/syscalls.h8
-rw-r--r--libc/sysdeps/linux/arm/bits/syscalls.h16
-rw-r--r--libc/sysdeps/linux/avr32/bits/syscalls.h4
-rw-r--r--libc/sysdeps/linux/bfin/bits/syscalls.h4
-rw-r--r--libc/sysdeps/linux/common/bits/syscalls-common.h18
-rw-r--r--libc/sysdeps/linux/common/bits/syscalls.h2
-rw-r--r--libc/sysdeps/linux/i386/bits/syscalls.h6
-rw-r--r--libc/sysdeps/linux/ia64/bits/syscalls.h9
-rw-r--r--libc/sysdeps/linux/mips/bits/syscalls.h4
-rw-r--r--libc/sysdeps/linux/powerpc/bits/syscalls.h14
-rw-r--r--libc/sysdeps/linux/sh/bits/syscalls.h23
-rw-r--r--libc/sysdeps/linux/sparc/bits/syscalls.h5
-rw-r--r--libc/sysdeps/linux/x86_64/bits/syscalls.h2
-rw-r--r--libc/sysdeps/linux/xtensa/bits/syscalls.h3
14 files changed, 40 insertions, 78 deletions
diff --git a/libc/sysdeps/linux/alpha/bits/syscalls.h b/libc/sysdeps/linux/alpha/bits/syscalls.h
index 6be26971f..ee56788a6 100644
--- a/libc/sysdeps/linux/alpha/bits/syscalls.h
+++ b/libc/sysdeps/linux/alpha/bits/syscalls.h
@@ -26,10 +26,10 @@
#ifndef __ASSEMBLER__
-#define INLINE_SYSCALL(name, nr, args...) \
+#define INLINE_SYSCALL_NCS(name, nr, args...) \
({ \
long _sc_ret, _sc_err; \
- inline_syscall##nr(__NR_##name, args); \
+ inline_syscall##nr(name, args); \
if (__builtin_expect (_sc_err, 0)) \
{ \
__set_errno (_sc_ret); \
@@ -38,10 +38,10 @@
_sc_ret; \
})
-#define INTERNAL_SYSCALL(name, err_out, nr, args...) \
+#define INTERNAL_SYSCALL_NCS(name, err_out, nr, args...) \
({ \
long _sc_ret, _sc_err; \
- inline_syscall##nr(__NR_##name, args); \
+ inline_syscall##nr(name, args); \
err_out = _sc_err; \
_sc_ret; \
})
diff --git a/libc/sysdeps/linux/arm/bits/syscalls.h b/libc/sysdeps/linux/arm/bits/syscalls.h
index 2ad725544..1a854ffab 100644
--- a/libc/sysdeps/linux/arm/bits/syscalls.h
+++ b/libc/sysdeps/linux/arm/bits/syscalls.h
@@ -30,8 +30,8 @@
#include <errno.h>
-#define INLINE_SYSCALL(name, nr, args...) \
- ({ unsigned int _inline_sys_result = INTERNAL_SYSCALL (name, , nr, args); \
+#define INLINE_SYSCALL_NCS(name, nr, args...) \
+ ({ unsigned int _inline_sys_result = INTERNAL_SYSCALL_NCS (name, , nr, args); \
if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (_inline_sys_result, ), 0)) \
{ \
__set_errno (INTERNAL_SYSCALL_ERRNO (_inline_sys_result, )); \
@@ -41,12 +41,12 @@
#if !defined(__thumb__)
#if defined(__ARM_EABI__)
-#define INTERNAL_SYSCALL(name, err, nr, args...) \
+#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
({unsigned int __sys_result; \
{ \
register int _a1 __asm__ ("r0"), _nr __asm__ ("r7"); \
LOAD_ARGS_##nr (args) \
- _nr = SYS_ify(name); \
+ _nr = (name); \
__asm__ __volatile__ ("swi 0x0 @ syscall " #name \
: "=r" (_a1) \
: "r" (_nr) ASM_ARGS_##nr \
@@ -56,14 +56,14 @@
(int) __sys_result; })
#else /* defined(__ARM_EABI__) */
-#define INTERNAL_SYSCALL(name, err, nr, args...) \
+#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
({ unsigned int __sys_result; \
{ \
register int _a1 __asm__ ("a1"); \
LOAD_ARGS_##nr (args) \
__asm__ __volatile__ ("swi %1 @ syscall " #name \
: "=r" (_a1) \
- : "i" (SYS_ify(name)) ASM_ARGS_##nr \
+ : "i" (name) ASM_ARGS_##nr \
: "memory"); \
__sys_result = _a1; \
} \
@@ -73,13 +73,13 @@
/* We can't use push/pop inside the asm because that breaks
unwinding (ie. thread cancellation).
*/
-#define INTERNAL_SYSCALL(name, err, nr, args...) \
+#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
({ unsigned int __sys_result; \
{ \
int _sys_buf[2]; \
register int _a1 __asm__ ("a1"); \
register int *_v3 __asm__ ("v3") = _sys_buf; \
- *_v3 = (int) (SYS_ify(name)); \
+ *_v3 = (int) (name); \
LOAD_ARGS_##nr (args) \
__asm__ __volatile__ ("str r7, [v3, #4]\n" \
"\tldr r7, [v3]\n" \
diff --git a/libc/sysdeps/linux/avr32/bits/syscalls.h b/libc/sysdeps/linux/avr32/bits/syscalls.h
index e473b10ba..48f15d473 100644
--- a/libc/sysdeps/linux/avr32/bits/syscalls.h
+++ b/libc/sysdeps/linux/avr32/bits/syscalls.h
@@ -8,10 +8,10 @@
#include <errno.h>
-#define INTERNAL_SYSCALL(name, err, nr, args...) \
+#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
({ \
register int _a1 __asm__("r12"); \
- register int _scno __asm__("r8") = SYS_ify(name); \
+ register int _scno __asm__("r8") = name; \
LOAD_ARGS_##nr (args); \
__asm__ __volatile__("scall /* syscall " #name " */" \
: "=r" (_a1) \
diff --git a/libc/sysdeps/linux/bfin/bits/syscalls.h b/libc/sysdeps/linux/bfin/bits/syscalls.h
index 478ea2dfd..6230b03d8 100644
--- a/libc/sysdeps/linux/bfin/bits/syscalls.h
+++ b/libc/sysdeps/linux/bfin/bits/syscalls.h
@@ -6,13 +6,13 @@
#ifndef __ASSEMBLER__
-#define INTERNAL_SYSCALL(name, err, nr, args...) \
+#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
({ \
long __res; \
__asm__ __volatile__ ( \
"excpt 0;\n\t" \
: "=q0" (__res) \
- : "qA" (__NR_##name) ASMFMT_##nr(args) \
+ : "qA" (name) ASMFMT_##nr(args) \
: "memory","CC"); \
__res; \
})
diff --git a/libc/sysdeps/linux/common/bits/syscalls-common.h b/libc/sysdeps/linux/common/bits/syscalls-common.h
index 81c82c801..2aef89c6e 100644
--- a/libc/sysdeps/linux/common/bits/syscalls-common.h
+++ b/libc/sysdeps/linux/common/bits/syscalls-common.h
@@ -31,10 +31,15 @@
/* Define a macro which expands into the inline wrapper code for a system call */
#ifndef INLINE_SYSCALL
-# define INLINE_SYSCALL(name, nr, args...) \
+# define INLINE_SYSCALL(name, nr, args...) INLINE_SYSCALL_NCS(__NR_##name, nr, args)
+#endif
+
+/* Just like INLINE_SYSCALL(), but take a non-constant syscall (NCS) argument */
+#ifndef INLINE_SYSCALL_NCS
+# define INLINE_SYSCALL_NCS(name, nr, args...) \
({ \
INTERNAL_SYSCALL_DECL(err); \
- long res = INTERNAL_SYSCALL(name, err, nr, args); \
+ long res = INTERNAL_SYSCALL_NCS(name, err, nr, args); \
if (unlikely(INTERNAL_SYSCALL_ERROR_P(res, err))) { \
__set_errno(INTERNAL_SYSCALL_ERRNO(res, err)); \
res = -1L; \
@@ -43,6 +48,15 @@
})
#endif
+/* No point in forcing people to implement both when they only need one */
+#ifndef INTERNAL_SYSCALL
+# define INTERNAL_SYSCALL(name, err, nr, args...) INTERNAL_SYSCALL_NCS(__NR_##name, err, nr, args)
+#endif
+
+#ifndef INTERNAL_SYSCALL_NCS
+# error your port needs to define INTERNAL_SYSCALL_NCS in bits/syscalls.h
+#endif
+
#ifndef _syscall0
#define C_DECL_ARGS_0() void
diff --git a/libc/sysdeps/linux/common/bits/syscalls.h b/libc/sysdeps/linux/common/bits/syscalls.h
index e7c6b035d..03d08d1d3 100644
--- a/libc/sysdeps/linux/common/bits/syscalls.h
+++ b/libc/sysdeps/linux/common/bits/syscalls.h
@@ -6,4 +6,4 @@
*/
#error You have not provided architecture specific bits/syscalls.h
-#error You should need to define only INTERNAL_SYSCALL
+#error You should need to define only INTERNAL_SYSCALL_NCS
diff --git a/libc/sysdeps/linux/i386/bits/syscalls.h b/libc/sysdeps/linux/i386/bits/syscalls.h
index 343b096f1..8a98a0e08 100644
--- a/libc/sysdeps/linux/i386/bits/syscalls.h
+++ b/libc/sysdeps/linux/i386/bits/syscalls.h
@@ -96,16 +96,16 @@ __asm__ (".L__X'%ebx = 1\n\t"
".endm\n\t");
#endif
-#define INTERNAL_SYSCALL(name, err, nr, args...) \
+#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
({ \
register unsigned int resultvar; \
- __asm__ __volatile__ ( \
+ __asm__ __volatile__ ( \
LOADARGS_##nr \
"movl %1, %%eax\n\t" \
"int $0x80\n\t" \
RESTOREARGS_##nr \
: "=a" (resultvar) \
- : "i" (__NR_##name) ASMFMT_##nr(args) : "memory", "cc"); \
+ : "i" (name) ASMFMT_##nr(args) : "memory", "cc"); \
(int) resultvar; })
#define LOADARGS_0
diff --git a/libc/sysdeps/linux/ia64/bits/syscalls.h b/libc/sysdeps/linux/ia64/bits/syscalls.h
index 81b2cf402..9fda3d07a 100644
--- a/libc/sysdeps/linux/ia64/bits/syscalls.h
+++ b/libc/sysdeps/linux/ia64/bits/syscalls.h
@@ -61,12 +61,9 @@
: "memory" ASM_CLOBBERS_##nr); \
_retval = _r8;
-#define DO_INLINE_SYSCALL(name, nr, args...) \
- DO_INLINE_SYSCALL_NCS (__NR_##name, nr, ##args)
-
-#define INLINE_SYSCALL(name, nr, args...) \
+#define INLINE_SYSCALL_NCS(name, nr, args...) \
({ \
- DO_INLINE_SYSCALL_NCS (__NR_##name, nr, args) \
+ DO_INLINE_SYSCALL_NCS (name, nr, args) \
if (_r10 == -1) \
{ \
__set_errno (_retval); \
@@ -81,8 +78,6 @@
DO_INLINE_SYSCALL_NCS (name, nr, args) \
err = _r10; \
_retval; })
-#define INTERNAL_SYSCALL(name, err, nr, args...) \
- INTERNAL_SYSCALL_NCS (__NR_##name, err, nr, ##args)
#define INTERNAL_SYSCALL_ERROR_P(val, err) (err == -1)
diff --git a/libc/sysdeps/linux/mips/bits/syscalls.h b/libc/sysdeps/linux/mips/bits/syscalls.h
index 07e0fe439..363991368 100644
--- a/libc/sysdeps/linux/mips/bits/syscalls.h
+++ b/libc/sysdeps/linux/mips/bits/syscalls.h
@@ -19,9 +19,9 @@
/* Define a macro which expands into the inline wrapper code for a system
call. */
-#define INLINE_SYSCALL(name, nr, args...) \
+#define INLINE_SYSCALL_NCS(name, nr, args...) \
({ INTERNAL_SYSCALL_DECL(err); \
- long result_var = INTERNAL_SYSCALL (name, err, nr, args); \
+ long result_var = INTERNAL_SYSCALL_NCS (name, err, nr, args); \
if ( INTERNAL_SYSCALL_ERROR_P (result_var, err) ) \
{ \
__set_errno (INTERNAL_SYSCALL_ERRNO (result_var, err)); \
diff --git a/libc/sysdeps/linux/powerpc/bits/syscalls.h b/libc/sysdeps/linux/powerpc/bits/syscalls.h
index e11c362c8..f689c60ae 100644
--- a/libc/sysdeps/linux/powerpc/bits/syscalls.h
+++ b/libc/sysdeps/linux/powerpc/bits/syscalls.h
@@ -130,18 +130,6 @@
(int) r3; \
})
-# define INLINE_SYSCALL(name, nr, args...) \
- ({ \
- INTERNAL_SYSCALL_DECL (sc_err); \
- long int sc_ret = INTERNAL_SYSCALL (name, sc_err, nr, args); \
- if (INTERNAL_SYSCALL_ERROR_P (sc_ret, sc_err)) \
- { \
- __set_errno (INTERNAL_SYSCALL_ERRNO (sc_ret, sc_err)); \
- sc_ret = -1L; \
- } \
- sc_ret; \
- })
-
/* 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.
@@ -177,8 +165,6 @@
err = r0; \
(int) r3; \
})
-# define INTERNAL_SYSCALL(name, err, nr, args...) \
- INTERNAL_SYSCALL_NCS (__NR_##name, err, nr, ##args)
# define INTERNAL_SYSCALL_ERROR_P(val, err) \
((void) (val), __builtin_expect ((err) & (1 << 28), 0))
diff --git a/libc/sysdeps/linux/sh/bits/syscalls.h b/libc/sysdeps/linux/sh/bits/syscalls.h
index 6e7ddbb3c..c69dce537 100644
--- a/libc/sysdeps/linux/sh/bits/syscalls.h
+++ b/libc/sysdeps/linux/sh/bits/syscalls.h
@@ -112,29 +112,6 @@
register long int r1 __asm__ ("%r1") = (long int) (_arg6); \
register long int r2 __asm__ ("%r2") = (long int) (_arg7)
-#define INLINE_SYSCALL(name, nr, args...) \
- ({ \
- unsigned int __resultvar = INTERNAL_SYSCALL (name, , nr, args); \
- if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (__resultvar, ), 0)) \
- { \
- __set_errno (INTERNAL_SYSCALL_ERRNO (__resultvar, )); \
- __resultvar = 0xffffffff; \
- } \
- (int) __resultvar; })
-
-#define INTERNAL_SYSCALL(name, err, nr, args...) \
- ({ \
- unsigned long int resultvar; \
- register long int r3 __asm__ ("%r3") = SYS_ify (name); \
- SUBSTITUTE_ARGS_##nr(args); \
- \
- __asm__ volatile (SYSCALL_INST_STR##nr SYSCALL_INST_PAD \
- : "=z" (resultvar) \
- : "r" (r3) ASMFMT_##nr \
- : "memory"); \
- \
- (int) resultvar; })
-
/* The _NCS variant allows non-constant syscall numbers. */
#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
({ \
diff --git a/libc/sysdeps/linux/sparc/bits/syscalls.h b/libc/sysdeps/linux/sparc/bits/syscalls.h
index 55420104b..78f143911 100644
--- a/libc/sysdeps/linux/sparc/bits/syscalls.h
+++ b/libc/sysdeps/linux/sparc/bits/syscalls.h
@@ -35,11 +35,6 @@
#define DEBUG_SYSCALL(name) do{} while(0)
#endif
-
-#define INTERNAL_SYSCALL( name, err, nr, args...) \
- INTERNAL_SYSCALL_NCS( __NR_##name, err, nr, args )
-
-
#define INTERNAL_SYSCALL_NCS(sys_num, err, nr, args...) \
({ \
unsigned int __res; \
diff --git a/libc/sysdeps/linux/x86_64/bits/syscalls.h b/libc/sysdeps/linux/x86_64/bits/syscalls.h
index 3aabe67c6..d16addb4a 100644
--- a/libc/sysdeps/linux/x86_64/bits/syscalls.h
+++ b/libc/sysdeps/linux/x86_64/bits/syscalls.h
@@ -76,8 +76,6 @@
: "=a" (resultvar) \
: "0" (name) ASM_ARGS_##nr : "memory", "cc", "r11", "cx"); \
(long) resultvar; })
-#define INTERNAL_SYSCALL(name, err, nr, args...) \
- INTERNAL_SYSCALL_NCS (__NR_##name, err, nr, ##args)
#define LOAD_ARGS_0()
#define LOAD_REGS_0
diff --git a/libc/sysdeps/linux/xtensa/bits/syscalls.h b/libc/sysdeps/linux/xtensa/bits/syscalls.h
index 6b87acea4..cc6c41e10 100644
--- a/libc/sysdeps/linux/xtensa/bits/syscalls.h
+++ b/libc/sysdeps/linux/xtensa/bits/syscalls.h
@@ -81,8 +81,5 @@
: "memory"); \
(long) _a2; })
-#define INTERNAL_SYSCALL(name, err, nr, args...) \
- INTERNAL_SYSCALL_NCS (__NR_##name, err, nr, ##args)
-
#endif /* not __ASSEMBLER__ */
#endif /* _BITS_SYSCALLS_H */