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.
Created attachment 7866 [details] Defining INLINE_SYSCALL_NOERR_NCS in mips/bits/syscalls.h