Bug 11491

Summary: _syscall_noerr do not handle syscall values in range [-EMAXERRNO; 0[ on MIPS
Product: uClibc Reporter: Volodymyr Boyko <boyko.cxx>
Component: OtherAssignee: unassigned
Status: NEW ---    
Severity: major CC: boyko.cxx, uclibc-cvs
Priority: P3    
Version: 0.9.33.2   
Target Milestone: ---   
Hardware: Other   
OS: Linux   
Host: Target:
Build:
Attachments: Defining INLINE_SYSCALL_NOERR_NCS in mips/bits/syscalls.h

Description Volodymyr Boyko 2018-11-07 02:15:45 UTC
On Linux/MIPS (O32 ABI) for system call we have two result registers - v0 and a3. 
v0 contains actual syscall result on success or error number on fail, a3 set to 0/1 for indicating syscall success/fail. (if a3 == 1, v0 contains errno).
Now as we can see from definition of handle_sys (arch/mips/kernel/scall32-o32.S), handler treats returned by syscall function (let's call "original") values in range [-EMAXERRNO; 0[ as -errno, a3 is set to 1 and final returned (to userspace) value is (-original).
Currently ulibc does not fully handle this mips syscall convention - wrappers declared though _syscall_noerr (time, times) are not working properly.
Comment 1 Volodymyr Boyko 2018-11-07 02:46:30 UTC
Created attachment 7866 [details]
Defining INLINE_SYSCALL_NOERR_NCS in mips/bits/syscalls.h