Messages in this thread Patch in this message | | | Subject | Re: [PATCH 11/27] [AARCH64] Syscalls for ILP32 are passed always via 64bit values. | From | "Zhangjian (Bamvor)" <> | Date | Tue, 21 Jun 2016 19:42:21 +0800 |
| |
Hi,
On 2016/6/21 15:56, Andreas Schwab wrote: > Yury Norov <ynorov@caviumnetworks.com> writes: > >> diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep.h b/sysdeps/unix/sysv/linux/aarch64/sysdep.h >> index 1ffabc2..42f89c8 100644 >> --- a/sysdeps/unix/sysv/linux/aarch64/sysdep.h >> +++ b/sysdeps/unix/sysv/linux/aarch64/sysdep.h >> @@ -161,11 +161,11 @@ >> call. */ >> # undef INLINE_SYSCALL >> # define INLINE_SYSCALL(name, nr, args...) \ >> - ({ unsigned long _sys_result = INTERNAL_SYSCALL (name, , nr, args); \ >> + ({ unsigned long long _sys_result = INTERNAL_SYSCALL (name, , nr, args); \ >> if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (_sys_result, ), 0))\ >> { \ >> __set_errno (INTERNAL_SYSCALL_ERRNO (_sys_result, )); \ >> - _sys_result = (unsigned long) -1; \ >> + _sys_result = (unsigned long long) -1; \ >> } \ >> (long) _sys_result; }) > > The cast should be (long long). My understanding that we need more conversion, reference the follow patch:
From a0780d286277bf70bacfc0b20fe909a46b990f6e Mon Sep 17 00:00:00 2001 From: gaoyongliang <gaoyongliang@huawei.com> Date: Thu, 19 May 2016 18:19:05 +0800 Subject: [PATCH] ilp32 fix syscall return value to use long long
Signed-off-by: Yongliang Gao <gaoyongliang@huawei.com> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@huawei.com>
--- sysdeps/unix/sysdep.h | 2 +- sysdeps/unix/sysv/linux/aarch64/sysdep.h | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/sysdeps/unix/sysdep.h b/sysdeps/unix/sysdep.h index 71db7f8..09b6e75 100644 --- a/sysdeps/unix/sysdep.h +++ b/sysdeps/unix/sysdep.h @@ -31,7 +31,7 @@
#define SYSCALL_CANCEL(name, ...) \ ({ \ - long int sc_ret; \ + long long sc_ret; \ if (SINGLE_THREAD_P) \ sc_ret = INLINE_SYSCALL (name, __SYSCALL_NARGS(__VA_ARGS__), \ __VA_ARGS__); \ diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep.h b/sysdeps/unix/sysv/linux/aarch64/sysdep.h index fbf76c1..a696cc2 100644 --- a/sysdeps/unix/sysv/linux/aarch64/sysdep.h +++ b/sysdeps/unix/sysv/linux/aarch64/sysdep.h @@ -173,7 +173,7 @@ { \ iserr: \ __set_errno (INTERNAL_SYSCALL_ERRNO (sc_ret, sc_err)); \ - sc_ret = -1L; \ + sc_ret = -1LL; \ } \ out: \ sc_ret; \ @@ -216,7 +216,7 @@ : "=r" (_x0) \ : "r" (funcptr) ASM_ARGS_##nr \ : "x30", "memory"); \ - (long) _x0; \ + (long long) _x0; \ })
@@ -230,7 +230,7 @@ __set_errno (INTERNAL_SYSCALL_ERRNO (_sys_result, )); \ _sys_result = (unsigned long long) -1; \ } \ - (long) _sys_result; }) + (long long) _sys_result; })
# undef INTERNAL_SYSCALL_DECL # define INTERNAL_SYSCALL_DECL(err) do { } while (0) @@ -257,7 +257,7 @@
# undef INTERNAL_SYSCALL_ERROR_P # define INTERNAL_SYSCALL_ERROR_P(val, err) \ - ((unsigned long) (val) >= (unsigned long) -4095) + ((unsigned long long) (val) >= (unsigned long long) -4095)
# undef INTERNAL_SYSCALL_ERRNO # define INTERNAL_SYSCALL_ERRNO(val, err) (-(val)) -- 1.8.4.5
> Andreas. >
| |