[1/2] Fix {INLINE,INTERNAL}_SYSCALL macros for x32

Message ID 1471369364-23828-1-git-send-email-adhemerval.zanella@linaro.org
State Dropped
Headers

Commit Message

Adhemerval Zanella Netto Aug. 16, 2016, 5:42 p.m. UTC
  From: Adhemerval Zanella <adhemerval.zanella@linaro.com>

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 as 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.
---
 sysdeps/unix/sysv/linux/x86_64/sysdep.h    | 252 ++++++++++++++++-------------
 sysdeps/unix/sysv/linux/x86_64/x32/times.c |  24 +--
 3 files changed, 206 insertions(+), 120 deletions(-)
  

Comments

Adhemerval Zanella Netto Nov. 16, 2016, 12:12 p.m. UTC | #1
Ping.

On 16/08/2016 14:42, Adhemerval Zanella wrote:
> From: Adhemerval Zanella <adhemerval.zanella@linaro.com>
> 
> 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 as 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.
> ---
>  sysdeps/unix/sysv/linux/x86_64/sysdep.h    | 252 ++++++++++++++++-------------
>  sysdeps/unix/sysv/linux/x86_64/x32/times.c |  24 +--
>  3 files changed, 206 insertions(+), 120 deletions(-)
> 
> diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
> index 1a671e1..ae5b475 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
> @@ -188,6 +188,7 @@
>  # define DOARGS_6 DOARGS_5
>  
>  #else	/* !__ASSEMBLER__ */
> +
>  /* Define a macro which expands inline into the wrapper code for a system
>     call.  */
>  # undef INLINE_SYSCALL
> @@ -221,33 +222,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 +377,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__ */
>  
>  
> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/times.c b/sysdeps/unix/sysv/linux/x86_64/x32/times.c
> index c7d8c09..ca11c2a 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) \
>
  
Adhemerval Zanella Netto Feb. 7, 2017, 7:14 p.m. UTC | #2
Ping (x2).

On 16/11/2016 10:12, Adhemerval Zanella wrote:
> Ping.
> 
> On 16/08/2016 14:42, Adhemerval Zanella wrote:
>> From: Adhemerval Zanella <adhemerval.zanella@linaro.com>
>>
>> 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 as 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.
>> ---
>>  sysdeps/unix/sysv/linux/x86_64/sysdep.h    | 252 ++++++++++++++++-------------
>>  sysdeps/unix/sysv/linux/x86_64/x32/times.c |  24 +--
>>  3 files changed, 206 insertions(+), 120 deletions(-)
>>
>> diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
>> index 1a671e1..ae5b475 100644
>> --- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h
>> +++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
>> @@ -188,6 +188,7 @@
>>  # define DOARGS_6 DOARGS_5
>>  
>>  #else	/* !__ASSEMBLER__ */
>> +
>>  /* Define a macro which expands inline into the wrapper code for a system
>>     call.  */
>>  # undef INLINE_SYSCALL
>> @@ -221,33 +222,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 +377,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__ */
>>  
>>  
>> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/times.c b/sysdeps/unix/sysv/linux/x86_64/x32/times.c
>> index c7d8c09..ca11c2a 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) \
>>
  
Adhemerval Zanella Netto Feb. 15, 2017, 1:11 p.m. UTC | #3
Ping (x3).  This is required to fix {INLINE,INTERNAL} macros on x32 and also
for the cancellation work.

On 07/02/2017 17:14, Adhemerval Zanella wrote:
> Ping (x2).
> 
> On 16/11/2016 10:12, Adhemerval Zanella wrote:
>> Ping.
>>
>> On 16/08/2016 14:42, Adhemerval Zanella wrote:
>>> From: Adhemerval Zanella <adhemerval.zanella@linaro.com>
>>>
>>> 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 as 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.
>>> ---
>>>  sysdeps/unix/sysv/linux/x86_64/sysdep.h    | 252 ++++++++++++++++-------------
>>>  sysdeps/unix/sysv/linux/x86_64/x32/times.c |  24 +--
>>>  3 files changed, 206 insertions(+), 120 deletions(-)
>>>
>>> diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
>>> index 1a671e1..ae5b475 100644
>>> --- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h
>>> +++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
>>> @@ -188,6 +188,7 @@
>>>  # define DOARGS_6 DOARGS_5
>>>  
>>>  #else	/* !__ASSEMBLER__ */
>>> +
>>>  /* Define a macro which expands inline into the wrapper code for a system
>>>     call.  */
>>>  # undef INLINE_SYSCALL
>>> @@ -221,33 +222,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 +377,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__ */
>>>  
>>>  
>>> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/times.c b/sysdeps/unix/sysv/linux/x86_64/x32/times.c
>>> index c7d8c09..ca11c2a 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) \
>>>
  

Patch

diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
index 1a671e1..ae5b475 100644
--- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
@@ -188,6 +188,7 @@ 
 # define DOARGS_6 DOARGS_5
 
 #else	/* !__ASSEMBLER__ */
+
 /* Define a macro which expands inline into the wrapper code for a system
    call.  */
 # undef INLINE_SYSCALL
@@ -221,33 +222,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 +377,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__ */
 
 
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/times.c b/sysdeps/unix/sysv/linux/x86_64/x32/times.c
index c7d8c09..ca11c2a 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) \