From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 107036 invoked by alias); 15 Feb 2017 13:11:55 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 107015 invoked by uid 89); 15 Feb 2017 13:11:53 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM,SPF_PASS autolearn=no version=3.3.2 spammy=3776, readability, typeof, differs X-HELO: mail-qt0-f171.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=y+tM4/Tc6UfQmzEvisnUTaLQKeljREo1ZXN9QFeARlw=; b=RotD0ni9QUjKKOkgEMkzPJsmcY2IisMJIsqyu3Yb6iquYlEr1tocxkgOkktY4ypkpm X5E2gT0bUrmnS85wJzDVPcjqzRJpdyTscaxgfnle4JZyJUPhxzgMyfz+q6mTl1G60QnU UQOyQKOj8ZW4+aHPHEViqmszdKhxPEiuKt+GPThqxs3DFpQkAnnMCJEVup6LOAoxV1ER JiqlTij/82q2hArmDZjQaZcyenvozSFZ3WG+OxIG91nYbyKWcCv+PC2vcDMnCfxSTcGW Fbe/uOJZca9MZs4d3IxGHXvTxMik2WE5CdYRWnldwrNowyZ4ZJbHes595FwztMrOReYA JWsw== X-Gm-Message-State: AMke39kIt/dRwd/Hr81/fb1VOMuC01Eh04UMbADC3ZzvHDgpK6CrEhrys+9Hg8Kh7bh4f3Jw X-Received: by 10.200.36.219 with SMTP id t27mr34583426qtt.255.1487164301478; Wed, 15 Feb 2017 05:11:41 -0800 (PST) Subject: Re: [PATCH 1/2] Fix {INLINE,INTERNAL}_SYSCALL macros for x32 To: libc-alpha@sourceware.org References: <1471369364-23828-1-git-send-email-adhemerval.zanella@linaro.org> <125a3cd9-cbd4-9bcf-820f-3bd46b6022e8@linaro.org> <2e340e32-1435-1de9-0126-cb7f9c57dd06@linaro.org> From: Adhemerval Zanella Message-ID: <04ff4c09-da69-2d48-7e2c-fa63f644a0cc@linaro.org> Date: Wed, 15 Feb 2017 13:11:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0 MIME-Version: 1.0 In-Reply-To: <2e340e32-1435-1de9-0126-cb7f9c57dd06@linaro.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-SW-Source: 2017-02/txt/msg00269.txt.bz2 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 >>> >>> 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 >>> >>> /* 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) \ >>>