diff options
Diffstat (limited to 'libc/sysdeps/linux/common')
-rw-r--r-- | libc/sysdeps/linux/common/bits/syscalls-common.h | 18 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/bits/syscalls.h | 2 |
2 files changed, 17 insertions, 3 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 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 |