summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/common/bits/syscalls-common.h
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/common/bits/syscalls-common.h')
-rw-r--r--libc/sysdeps/linux/common/bits/syscalls-common.h18
1 files changed, 16 insertions, 2 deletions
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