Movatterモバイル変換
[0]ホーム
This is the mail archive of thelibc-alpha@sourceware.orgmailing list for theglibc project.
[PATCH 12/14] Fix {INLINE,INTERNAL}_SYSCALL macros for x32
- From: Adhemerval Zanella <adhemerval dot zanella at linaro dot org>
- To: libc-alpha at sourceware dot org
- Cc: Adhemerval Zanella <adhemerval dot zanella at linaro dot com>
- Date: Thu, 3 Aug 2017 10:11:12 -0300
- Subject: [PATCH 12/14] Fix {INLINE,INTERNAL}_SYSCALL macros for x32
- Authentication-results: sourceware.org; auth=none
- References: <1501765874-6201-1-git-send-email-adhemerval.zanella@linaro.org>
From: Adhemerval Zanella <adhemerval.zanella@linaro.com>The problem for x32 is the {INTERNAL,INLINE}_SYSCALL C macros explicitcast the arguments to 'long int', thus passing as 32 bits argumentsthat should be passed to 64 bits.Previous x32 implementation uses the auto-generated syscalls fromassembly macros (syscalls.list), so the {INTERNAL,INLINE}_SYSCALLmacros are never used with 64 bit argument in x32 (which areinternally broken for this ILP).To fix it I used a strategy similar to MIPS64n32 (although bothABI 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 argumentsto 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 usingmacros (it adds some readability) and removed the ununsedINTERNAL_SYSCALL_NCS_TYPES define (since the patch idea is exactly toavoid 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.--- ChangeLog | 48 ++++++ sysdeps/unix/sysv/linux/x86_64/sysdep.h | 251 ++++++++++++++++------------- sysdeps/unix/sysv/linux/x86_64/x32/times.c | 24 +-- 3 files changed, 203 insertions(+), 120 deletions(-)diff --git a/ChangeLog b/ChangeLogindex 9ed9789..a5f917f 100644--- a/ChangeLog+++ b/ChangeLog@@ -1,5 +1,53 @@ 2017-08-02 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.+ * sysdeps/generic/not-cancel.h (sigsuspend_not_cancel): Remove macro. * sysdeps/unix/sysv/linux/not-cancel.h (sigsuspend_not_cancel):diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.hindex 880e496..f299bf2 100644--- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h+++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h@@ -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)--# 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)+/* 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))++#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_VSYSCALL1 -# 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_1ASM_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_2ASM_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_3ASM_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_4ASM_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_5ASM_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_6ASM_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__ */ diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/times.c b/sysdeps/unix/sysv/linux/x86_64/x32/times.cindex d56106e..8763047 100644--- a/sysdeps/unix/sysv/linux/x86_64/x32/times.c+++ b/sysdeps/unix/sysv/linux/x86_64/x32/times.c@@ -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) \-- 2.7.4
[8]ページ先頭