This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 12/14] Fix {INLINE,INTERNAL}_SYSCALL macros for x32


Now that all non cancellable syscall wrapper are done with proper
function prototype, this patch for x32 is safe to be applied (take
from H.J. Lu replied on previous version [1]).

H.J. Lu, do you any other objection about it? I would like also
to push the 13/14 part [2].

[1] https://sourceware.org/ml/libc-alpha/2017-07/msg00124.html
[2] https://sourceware.org/ml/libc-alpha/2017-08/msg00103.html

On 03/08/2017 10:11, 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 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.
> ---
>  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/ChangeLog
> index 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.h
> index 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_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 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) \
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]