Hi Adhemerval, On 2/20/20 5:14 AM, Adhemerval Zanella wrote: > > > On 19/02/2020 18:40, Vineet Gupta wrote: >> On 2/10/20 11:20 AM, Adhemerval Zanella wrote: >>> It changes the nios INTERNAL_SYSCALL_RAW macro to return a negative >>> value instead of 'r2' register value on 'err' macro argument. >>> >>> The macro INTERNAL_SYSCALL_DECL is no longer required, and the >>> INTERNAL_SYSCALL_ERROR_P follows the other Linux kABIS. >>> >>> Checked with a build against nios2-linux-gnu. >>> --- >>> sysdeps/unix/sysv/linux/nios2/sysdep.h | 10 +++++----- >>> 1 file changed, 5 insertions(+), 5 deletions(-) >>> >>> diff --git a/sysdeps/unix/sysv/linux/nios2/sysdep.h b/sysdeps/unix/sysv/linux/nios2/sysdep.h >>> index b02730bd23..eab888df32 100644 >>> --- a/sysdeps/unix/sysv/linux/nios2/sysdep.h >>> +++ b/sysdeps/unix/sysv/linux/nios2/sysdep.h >>> @@ -157,13 +157,14 @@ >>> (int) result_var; }) >>> >>> #undef INTERNAL_SYSCALL_DECL >>> -#define INTERNAL_SYSCALL_DECL(err) unsigned int err __attribute__((unused)) >>> +#define INTERNAL_SYSCALL_DECL(err) do { } while (0) >>> >>> #undef INTERNAL_SYSCALL_ERROR_P >>> -#define INTERNAL_SYSCALL_ERROR_P(val, err) ((void) (val), (unsigned int) (err)) >>> +#define INTERNAL_SYSCALL_ERROR_P(val, err) \ >>> + ((unsigned long) (val) >= (unsigned long) -4095) >>> >>> #undef INTERNAL_SYSCALL_ERRNO >>> -#define INTERNAL_SYSCALL_ERRNO(val, err) ((void) (err), val) >>> +#define INTERNAL_SYSCALL_ERRNO(val, err) (-(val)) >>> >>> #undef INTERNAL_SYSCALL_RAW >>> #define INTERNAL_SYSCALL_RAW(name, err, nr, args...) \ >>> @@ -180,8 +181,7 @@ >>> : "+r" (_r2), "=r" (_err) \ >>> : ASM_ARGS_##nr \ >>> : __SYSCALL_CLOBBERS); \ >>> - _sys_result = _r2; \ >>> - err = _err; \ >>> + _sys_result = _err != 0 ? -_r2 : -_r2; \ >> >> Is there a typo here ? both cases seem to be -ve > > It is, thanks for catching it. I have pushed b790c8c2ed to fix and > double checked nios2 syscall handling (arch/nios2/kernel/entry.S:205) > to certify that the modification does follow nios2 kABI. Actually the reason I spotted it was trying to replicate similar changes in ARC port and it seems to be hosed now. It is quite likely a snaufu at my end, but I don't quite understand the new logic. Consider brk syscall which does __curbrk = (void *) INTERNAL_SYSCALL_CALL (brk, addr); Through a maze of defines this ends up calling INTERNAL_SYSCALL_RAW which seems be unconditionally converting !0 value (success) into -ve and returning it. So won't it convert a legit brk address return into a -ve and save in __curbrk. Am I not following this correctly ? Thx, -Vineet _______________________________________________ linux-snps-arc mailing list linux-snps-arc@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/linux-snps-arc