mirror of git://sourceware.org/git/glibc.git
Fix {INLINE,INTERNAL}_SYSCALL macros for x32
The problem for x32 is the {INTERNAL,INLINE}_SYSCALL C macros explicit cast the arguments to 'long int', thus passing as 32 bits arguments that should be passed to 64 bits. Previous x32 implementation uses the auto-generated syscalls from assembly macros (syscalls.list), so the {INTERNAL,INLINE}_SYSCALL macros are never used with 64 bit argument in x32 (which are internally broken for this ILP). To fix it I used a strategy similar to MIPS64n32 (although both ABI differs for some syscalls on how top pass 64-bits arguments) where argument types for kernel call are defined using GCC extension 'typeof' with a arithmetic operation. This allows 64-bits arguments to be defined while 32-bits argument will still passed as 32-bits. I also cleanup the {INLINE,INTERNAL}_SYSCALL definition by defining 'inline_syscallX' instead of constructing the argument passing using macros (it adds some readability) and removed the ununsed INTERNAL_SYSCALL_NCS_TYPES define (since the patch idea is exactly to avoid requiric explicit types passing). Tested on x86_64 and x32. * sysdeps/unix/sysv/linux/x86_64/sysdep.h (INTERNAL_SYSCALL_NCS_TYPES): Remove define. (LOAD_ARGS_0): Likewise. (LOAD_ARGS_1): Likewise. (LOAD_ARGS_2): Likewise. (LOAD_ARGS_3): Likewise. (LOAD_ARGS_4): Likewise. (LOAD_ARGS_5): Likewise. (LOAD_ARGS_6): Likewise. (LOAD_REGS_0): Likewise. (LOAD_REGS_1): Likewise. (LOAD_REGS_2): Likewise. (LOAD_REGS_3): Likewise. (LOAD_REGS_4): Likewise. (LOAD_REGS_5): Likewise. (LOAD_REGS_6): Likewise. (ASM_ARGS_0): Likewise. (ASM_ARGS_1): Likewise. (ASM_ARGS_2): Likewise. (ASM_ARGS_3): Likewise. (ASM_ARGS_4): Likewise. (ASM_ARGS_5): Likewise. (ASM_ARGS_6): Likewise. (LOAD_ARGS_TYPES_1): Likewise. (LOAD_ARGS_TYPES_2): Likewise. (LOAD_ARGS_TYPES_3): Likewise. (LOAD_ARGS_TYPES_4): Likewise. (LOAD_ARGS_TYPES_5): Likewise. (LOAD_ARGS_TYPES_6): Likewise. (LOAD_REGS_TYPES_1): Likewise. (LOAD_REGS_TYPES_2): Likewise. (LOAD_REGS_TYPES_3): Likewise. (LOAD_REGS_TYPES_4): Likewise. (LOAD_REGS_TYPES_5): Likewise. (LOAD_REGS_TYPES_6): Likewise. (TYPEFY): New define. (ARGIFY): Likewise. (internal_syscall0): Likewise. (internal_syscall1): Likewise. (internal_syscall2): Likewise. (internal_syscall3): Likewise. (internal_syscall4): Likewise. (internal_syscall5): Likewise. (internal_syscall6): Likewise. * sysdeps/unix/sysv/linux/x86_64/x32/times.c (INTERNAL_SYSCALL_NCS): Remove define. (internal_syscall1): Add define.
This commit is contained in:
parent
453a493d2b
commit
78ca091cdd
50
ChangeLog
50
ChangeLog
|
@ -1,3 +1,53 @@
|
|||
2017-08-22 Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
|
||||
* sysdeps/unix/sysv/linux/x86_64/sysdep.h
|
||||
(INTERNAL_SYSCALL_NCS_TYPES): Remove define.
|
||||
(LOAD_ARGS_0): Likewise.
|
||||
(LOAD_ARGS_1): Likewise.
|
||||
(LOAD_ARGS_2): Likewise.
|
||||
(LOAD_ARGS_3): Likewise.
|
||||
(LOAD_ARGS_4): Likewise.
|
||||
(LOAD_ARGS_5): Likewise.
|
||||
(LOAD_ARGS_6): Likewise.
|
||||
(LOAD_REGS_0): Likewise.
|
||||
(LOAD_REGS_1): Likewise.
|
||||
(LOAD_REGS_2): Likewise.
|
||||
(LOAD_REGS_3): Likewise.
|
||||
(LOAD_REGS_4): Likewise.
|
||||
(LOAD_REGS_5): Likewise.
|
||||
(LOAD_REGS_6): Likewise.
|
||||
(ASM_ARGS_0): Likewise.
|
||||
(ASM_ARGS_1): Likewise.
|
||||
(ASM_ARGS_2): Likewise.
|
||||
(ASM_ARGS_3): Likewise.
|
||||
(ASM_ARGS_4): Likewise.
|
||||
(ASM_ARGS_5): Likewise.
|
||||
(ASM_ARGS_6): Likewise.
|
||||
(LOAD_ARGS_TYPES_1): Likewise.
|
||||
(LOAD_ARGS_TYPES_2): Likewise.
|
||||
(LOAD_ARGS_TYPES_3): Likewise.
|
||||
(LOAD_ARGS_TYPES_4): Likewise.
|
||||
(LOAD_ARGS_TYPES_5): Likewise.
|
||||
(LOAD_ARGS_TYPES_6): Likewise.
|
||||
(LOAD_REGS_TYPES_1): Likewise.
|
||||
(LOAD_REGS_TYPES_2): Likewise.
|
||||
(LOAD_REGS_TYPES_3): Likewise.
|
||||
(LOAD_REGS_TYPES_4): Likewise.
|
||||
(LOAD_REGS_TYPES_5): Likewise.
|
||||
(LOAD_REGS_TYPES_6): Likewise.
|
||||
(TYPEFY): New define.
|
||||
(ARGIFY): Likewise.
|
||||
(internal_syscall0): Likewise.
|
||||
(internal_syscall1): Likewise.
|
||||
(internal_syscall2): Likewise.
|
||||
(internal_syscall3): Likewise.
|
||||
(internal_syscall4): Likewise.
|
||||
(internal_syscall5): Likewise.
|
||||
(internal_syscall6): Likewise.
|
||||
* sysdeps/unix/sysv/linux/x86_64/x32/times.c
|
||||
(INTERNAL_SYSCALL_NCS): Remove define.
|
||||
(internal_syscall1): Add define.
|
||||
|
||||
2017-08-22 Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
|
||||
|
||||
* math/w_remainder_compat.c: Remove duplicate inclusion of
|
||||
|
|
|
@ -221,33 +221,148 @@
|
|||
/* Registers clobbered by syscall. */
|
||||
# define REGISTERS_CLOBBERED_BY_SYSCALL "cc", "r11", "cx"
|
||||
|
||||
# define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
|
||||
({ \
|
||||
unsigned long int resultvar; \
|
||||
LOAD_ARGS_##nr (args) \
|
||||
LOAD_REGS_##nr \
|
||||
asm volatile ( \
|
||||
"syscall\n\t" \
|
||||
: "=a" (resultvar) \
|
||||
: "0" (name) ASM_ARGS_##nr : "memory", REGISTERS_CLOBBERED_BY_SYSCALL); \
|
||||
(long int) resultvar; })
|
||||
# undef INTERNAL_SYSCALL
|
||||
# define INTERNAL_SYSCALL(name, err, nr, args...) \
|
||||
INTERNAL_SYSCALL_NCS (__NR_##name, err, nr, ##args)
|
||||
/* Create a variable 'name' based on type 'X' to avoid explicit types.
|
||||
This is mainly used set use 64-bits arguments in x32. */
|
||||
#define TYPEFY(X, name) __typeof__ ((X) - (X)) name
|
||||
/* Explicit cast the argument to avoid integer from pointer warning on
|
||||
x32. */
|
||||
#define ARGIFY(X) ((__typeof__ ((X) - (X))) (X))
|
||||
|
||||
# define INTERNAL_SYSCALL_NCS_TYPES(name, err, nr, args...) \
|
||||
({ \
|
||||
unsigned long int resultvar; \
|
||||
LOAD_ARGS_TYPES_##nr (args) \
|
||||
LOAD_REGS_TYPES_##nr (args) \
|
||||
asm volatile ( \
|
||||
"syscall\n\t" \
|
||||
: "=a" (resultvar) \
|
||||
: "0" (name) ASM_ARGS_##nr : "memory", REGISTERS_CLOBBERED_BY_SYSCALL); \
|
||||
(long int) resultvar; })
|
||||
# undef INTERNAL_SYSCALL_TYPES
|
||||
# define INTERNAL_SYSCALL_TYPES(name, err, nr, args...) \
|
||||
INTERNAL_SYSCALL_NCS_TYPES (__NR_##name, err, nr, ##args)
|
||||
#undef INTERNAL_SYSCALL
|
||||
#define INTERNAL_SYSCALL(name, err, nr, args...) \
|
||||
internal_syscall##nr (SYS_ify (name), err, args)
|
||||
|
||||
#undef INTERNAL_SYSCALL_NCS
|
||||
#define INTERNAL_SYSCALL_NCS(number, err, nr, args...) \
|
||||
internal_syscall##nr (number, err, args)
|
||||
|
||||
#undef internal_syscall0
|
||||
#define internal_syscall0(number, err, dummy...) \
|
||||
({ \
|
||||
unsigned long int resultvar; \
|
||||
asm volatile ( \
|
||||
"syscall\n\t" \
|
||||
: "=a" (resultvar) \
|
||||
: "0" (number) \
|
||||
: "memory", REGISTERS_CLOBBERED_BY_SYSCALL); \
|
||||
(long int) resultvar; \
|
||||
})
|
||||
|
||||
#undef internal_syscall1
|
||||
#define internal_syscall1(number, err, arg1) \
|
||||
({ \
|
||||
unsigned long int resultvar; \
|
||||
TYPEFY (arg1, __arg1) = ARGIFY (arg1); \
|
||||
register TYPEFY (arg1, _a1) asm ("rdi") = __arg1; \
|
||||
asm volatile ( \
|
||||
"syscall\n\t" \
|
||||
: "=a" (resultvar) \
|
||||
: "0" (number), "r" (_a1) \
|
||||
: "memory", REGISTERS_CLOBBERED_BY_SYSCALL); \
|
||||
(long int) resultvar; \
|
||||
})
|
||||
|
||||
#undef internal_syscall2
|
||||
#define internal_syscall2(number, err, arg1, arg2) \
|
||||
({ \
|
||||
unsigned long int resultvar; \
|
||||
TYPEFY (arg2, __arg2) = ARGIFY (arg2); \
|
||||
TYPEFY (arg1, __arg1) = ARGIFY (arg1); \
|
||||
register TYPEFY (arg2, _a2) asm ("rsi") = __arg2; \
|
||||
register TYPEFY (arg1, _a1) asm ("rdi") = __arg1; \
|
||||
asm volatile ( \
|
||||
"syscall\n\t" \
|
||||
: "=a" (resultvar) \
|
||||
: "0" (number), "r" (_a1), "r" (_a2) \
|
||||
: "memory", REGISTERS_CLOBBERED_BY_SYSCALL); \
|
||||
(long int) resultvar; \
|
||||
})
|
||||
|
||||
#undef internal_syscall3
|
||||
#define internal_syscall3(number, err, arg1, arg2, arg3) \
|
||||
({ \
|
||||
unsigned long int resultvar; \
|
||||
TYPEFY (arg3, __arg3) = ARGIFY (arg3); \
|
||||
TYPEFY (arg2, __arg2) = ARGIFY (arg2); \
|
||||
TYPEFY (arg1, __arg1) = ARGIFY (arg1); \
|
||||
register TYPEFY (arg3, _a3) asm ("rdx") = __arg3; \
|
||||
register TYPEFY (arg2, _a2) asm ("rsi") = __arg2; \
|
||||
register TYPEFY (arg1, _a1) asm ("rdi") = __arg1; \
|
||||
asm volatile ( \
|
||||
"syscall\n\t" \
|
||||
: "=a" (resultvar) \
|
||||
: "0" (number), "r" (_a1), "r" (_a2), "r" (_a3) \
|
||||
: "memory", REGISTERS_CLOBBERED_BY_SYSCALL); \
|
||||
(long int) resultvar; \
|
||||
})
|
||||
|
||||
#undef internal_syscall4
|
||||
#define internal_syscall4(number, err, arg1, arg2, arg3, arg4) \
|
||||
({ \
|
||||
unsigned long int resultvar; \
|
||||
TYPEFY (arg4, __arg4) = ARGIFY (arg4); \
|
||||
TYPEFY (arg3, __arg3) = ARGIFY (arg3); \
|
||||
TYPEFY (arg2, __arg2) = ARGIFY (arg2); \
|
||||
TYPEFY (arg1, __arg1) = ARGIFY (arg1); \
|
||||
register TYPEFY (arg4, _a4) asm ("r10") = __arg4; \
|
||||
register TYPEFY (arg3, _a3) asm ("rdx") = __arg3; \
|
||||
register TYPEFY (arg2, _a2) asm ("rsi") = __arg2; \
|
||||
register TYPEFY (arg1, _a1) asm ("rdi") = __arg1; \
|
||||
asm volatile ( \
|
||||
"syscall\n\t" \
|
||||
: "=a" (resultvar) \
|
||||
: "0" (number), "r" (_a1), "r" (_a2), "r" (_a3), "r" (_a4) \
|
||||
: "memory", REGISTERS_CLOBBERED_BY_SYSCALL); \
|
||||
(long int) resultvar; \
|
||||
})
|
||||
|
||||
#undef internal_syscall5
|
||||
#define internal_syscall5(number, err, arg1, arg2, arg3, arg4, arg5) \
|
||||
({ \
|
||||
unsigned long int resultvar; \
|
||||
TYPEFY (arg5, __arg5) = ARGIFY (arg5); \
|
||||
TYPEFY (arg4, __arg4) = ARGIFY (arg4); \
|
||||
TYPEFY (arg3, __arg3) = ARGIFY (arg3); \
|
||||
TYPEFY (arg2, __arg2) = ARGIFY (arg2); \
|
||||
TYPEFY (arg1, __arg1) = ARGIFY (arg1); \
|
||||
register TYPEFY (arg5, _a5) asm ("r8") = __arg5; \
|
||||
register TYPEFY (arg4, _a4) asm ("r10") = __arg4; \
|
||||
register TYPEFY (arg3, _a3) asm ("rdx") = __arg3; \
|
||||
register TYPEFY (arg2, _a2) asm ("rsi") = __arg2; \
|
||||
register TYPEFY (arg1, _a1) asm ("rdi") = __arg1; \
|
||||
asm volatile ( \
|
||||
"syscall\n\t" \
|
||||
: "=a" (resultvar) \
|
||||
: "0" (number), "r" (_a1), "r" (_a2), "r" (_a3), "r" (_a4), \
|
||||
"r" (_a5) \
|
||||
: "memory", REGISTERS_CLOBBERED_BY_SYSCALL); \
|
||||
(long int) resultvar; \
|
||||
})
|
||||
|
||||
#undef internal_syscall6
|
||||
#define internal_syscall6(number, err, arg1, arg2, arg3, arg4, arg5, arg6) \
|
||||
({ \
|
||||
unsigned long int resultvar; \
|
||||
TYPEFY (arg6, __arg6) = ARGIFY (arg6); \
|
||||
TYPEFY (arg5, __arg5) = ARGIFY (arg5); \
|
||||
TYPEFY (arg4, __arg4) = ARGIFY (arg4); \
|
||||
TYPEFY (arg3, __arg3) = ARGIFY (arg3); \
|
||||
TYPEFY (arg2, __arg2) = ARGIFY (arg2); \
|
||||
TYPEFY (arg1, __arg1) = ARGIFY (arg1); \
|
||||
register TYPEFY (arg6, _a6) asm ("r9") = __arg6; \
|
||||
register TYPEFY (arg5, _a5) asm ("r8") = __arg5; \
|
||||
register TYPEFY (arg4, _a4) asm ("r10") = __arg4; \
|
||||
register TYPEFY (arg3, _a3) asm ("rdx") = __arg3; \
|
||||
register TYPEFY (arg2, _a2) asm ("rsi") = __arg2; \
|
||||
register TYPEFY (arg1, _a1) asm ("rdi") = __arg1; \
|
||||
asm volatile ( \
|
||||
"syscall\n\t" \
|
||||
: "=a" (resultvar) \
|
||||
: "0" (number), "r" (_a1), "r" (_a2), "r" (_a3), "r" (_a4), \
|
||||
"r" (_a5), "r" (_a6) \
|
||||
: "memory", REGISTERS_CLOBBERED_BY_SYSCALL); \
|
||||
(long int) resultvar; \
|
||||
})
|
||||
|
||||
# undef INTERNAL_SYSCALL_ERROR_P
|
||||
# define INTERNAL_SYSCALL_ERROR_P(val, err) \
|
||||
|
@ -261,88 +376,6 @@
|
|||
# define HAVE_GETTIMEOFDAY_VSYSCALL 1
|
||||
# define HAVE_GETCPU_VSYSCALL 1
|
||||
|
||||
# define LOAD_ARGS_0()
|
||||
# define LOAD_REGS_0
|
||||
# define ASM_ARGS_0
|
||||
|
||||
# define LOAD_ARGS_TYPES_1(t1, a1) \
|
||||
t1 __arg1 = (t1) (a1); \
|
||||
LOAD_ARGS_0 ()
|
||||
# define LOAD_REGS_TYPES_1(t1, a1) \
|
||||
register t1 _a1 asm ("rdi") = __arg1; \
|
||||
LOAD_REGS_0
|
||||
# define ASM_ARGS_1 ASM_ARGS_0, "r" (_a1)
|
||||
# define LOAD_ARGS_1(a1) \
|
||||
LOAD_ARGS_TYPES_1 (long int, a1)
|
||||
# define LOAD_REGS_1 \
|
||||
LOAD_REGS_TYPES_1 (long int, a1)
|
||||
|
||||
# define LOAD_ARGS_TYPES_2(t1, a1, t2, a2) \
|
||||
t2 __arg2 = (t2) (a2); \
|
||||
LOAD_ARGS_TYPES_1 (t1, a1)
|
||||
# define LOAD_REGS_TYPES_2(t1, a1, t2, a2) \
|
||||
register t2 _a2 asm ("rsi") = __arg2; \
|
||||
LOAD_REGS_TYPES_1(t1, a1)
|
||||
# define ASM_ARGS_2 ASM_ARGS_1, "r" (_a2)
|
||||
# define LOAD_ARGS_2(a1, a2) \
|
||||
LOAD_ARGS_TYPES_2 (long int, a1, long int, a2)
|
||||
# define LOAD_REGS_2 \
|
||||
LOAD_REGS_TYPES_2 (long int, a1, long int, a2)
|
||||
|
||||
# define LOAD_ARGS_TYPES_3(t1, a1, t2, a2, t3, a3) \
|
||||
t3 __arg3 = (t3) (a3); \
|
||||
LOAD_ARGS_TYPES_2 (t1, a1, t2, a2)
|
||||
# define LOAD_REGS_TYPES_3(t1, a1, t2, a2, t3, a3) \
|
||||
register t3 _a3 asm ("rdx") = __arg3; \
|
||||
LOAD_REGS_TYPES_2(t1, a1, t2, a2)
|
||||
# define ASM_ARGS_3 ASM_ARGS_2, "r" (_a3)
|
||||
# define LOAD_ARGS_3(a1, a2, a3) \
|
||||
LOAD_ARGS_TYPES_3 (long int, a1, long int, a2, long int, a3)
|
||||
# define LOAD_REGS_3 \
|
||||
LOAD_REGS_TYPES_3 (long int, a1, long int, a2, long int, a3)
|
||||
|
||||
# define LOAD_ARGS_TYPES_4(t1, a1, t2, a2, t3, a3, t4, a4) \
|
||||
t4 __arg4 = (t4) (a4); \
|
||||
LOAD_ARGS_TYPES_3 (t1, a1, t2, a2, t3, a3)
|
||||
# define LOAD_REGS_TYPES_4(t1, a1, t2, a2, t3, a3, t4, a4) \
|
||||
register t4 _a4 asm ("r10") = __arg4; \
|
||||
LOAD_REGS_TYPES_3(t1, a2, t2, a2, t3, a3)
|
||||
# define ASM_ARGS_4 ASM_ARGS_3, "r" (_a4)
|
||||
# define LOAD_ARGS_4(a1, a2, a3, a4) \
|
||||
LOAD_ARGS_TYPES_4 (long int, a1, long int, a2, long int, a3, \
|
||||
long int, a4)
|
||||
# define LOAD_REGS_4 \
|
||||
LOAD_REGS_TYPES_4 (long int, a1, long int, a2, long int, a3, \
|
||||
long int, a4)
|
||||
|
||||
# define LOAD_ARGS_TYPES_5(t1, a1, t2, a2, t3, a3, t4, a4, t5, a5) \
|
||||
t5 __arg5 = (t5) (a5); \
|
||||
LOAD_ARGS_TYPES_4 (t1, a1, t2, a2, t3, a3, t4, a4)
|
||||
# define LOAD_REGS_TYPES_5(t1, a1, t2, a2, t3, a3, t4, a4, t5, a5) \
|
||||
register t5 _a5 asm ("r8") = __arg5; \
|
||||
LOAD_REGS_TYPES_4 (t1, a1, t2, a2, t3, a3, t4, a4)
|
||||
# define ASM_ARGS_5 ASM_ARGS_4, "r" (_a5)
|
||||
# define LOAD_ARGS_5(a1, a2, a3, a4, a5) \
|
||||
LOAD_ARGS_TYPES_5 (long int, a1, long int, a2, long int, a3, \
|
||||
long int, a4, long int, a5)
|
||||
# define LOAD_REGS_5 \
|
||||
LOAD_REGS_TYPES_5 (long int, a1, long int, a2, long int, a3, \
|
||||
long int, a4, long int, a5)
|
||||
|
||||
# define LOAD_ARGS_TYPES_6(t1, a1, t2, a2, t3, a3, t4, a4, t5, a5, t6, a6) \
|
||||
t6 __arg6 = (t6) (a6); \
|
||||
LOAD_ARGS_TYPES_5 (t1, a1, t2, a2, t3, a3, t4, a4, t5, a5)
|
||||
# define LOAD_REGS_TYPES_6(t1, a1, t2, a2, t3, a3, t4, a4, t5, a5, t6, a6) \
|
||||
register t6 _a6 asm ("r9") = __arg6; \
|
||||
LOAD_REGS_TYPES_5 (t1, a1, t2, a2, t3, a3, t4, a4, t5, a5)
|
||||
# define ASM_ARGS_6 ASM_ARGS_5, "r" (_a6)
|
||||
# define LOAD_ARGS_6(a1, a2, a3, a4, a5, a6) \
|
||||
LOAD_ARGS_TYPES_6 (long int, a1, long int, a2, long int, a3, \
|
||||
long int, a4, long int, a5, long int, a6)
|
||||
# define LOAD_REGS_6 \
|
||||
LOAD_REGS_TYPES_6 (long int, a1, long int, a2, long int, a3, \
|
||||
long int, a4, long int, a5, long int, a6)
|
||||
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
|
||||
|
|
|
@ -19,17 +19,19 @@
|
|||
#include <sysdep.h>
|
||||
|
||||
/* Linux times system call returns 64-bit integer. */
|
||||
#undef INTERNAL_SYSCALL_NCS
|
||||
#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
|
||||
({ \
|
||||
unsigned long long int resultvar; \
|
||||
LOAD_ARGS_##nr (args) \
|
||||
LOAD_REGS_##nr \
|
||||
asm volatile ( \
|
||||
"syscall\n\t" \
|
||||
: "=a" (resultvar) \
|
||||
: "0" (name) ASM_ARGS_##nr : "memory", REGISTERS_CLOBBERED_BY_SYSCALL); \
|
||||
(long long int) resultvar; })
|
||||
#undef internal_syscall1
|
||||
#define internal_syscall1(number, err, arg1) \
|
||||
({ \
|
||||
unsigned long long int resultvar; \
|
||||
TYPEFY (arg1, __arg1) = ARGIFY (arg1); \
|
||||
register TYPEFY (arg1, _a1) asm ("rdi") = __arg1; \
|
||||
asm volatile ( \
|
||||
"syscall\n\t" \
|
||||
: "=a" (resultvar) \
|
||||
: "0" (number), "r" (_a1) \
|
||||
: "memory", REGISTERS_CLOBBERED_BY_SYSCALL); \
|
||||
(long long int) resultvar; \
|
||||
})
|
||||
|
||||
#undef INTERNAL_SYSCALL_ERROR_P
|
||||
#define INTERNAL_SYSCALL_ERROR_P(val, err) \
|
||||
|
|
Loading…
Reference in New Issue