On Mon, Sep 30, 2013 at 04:22:49PM +0200, Tanguy Bouzeloc wrote:
> Date: Mon, 30 Sep 2013 16:22:49 +0200
> From: Tanguy Bouzeloc <email@example.com>
> To: firstname.lastname@example.org
> Cc: email@example.com, Tanguy Bouzeloc <firstname.lastname@example.org>
> Subject: [PATCH] MIPS: fix forced successful syscalls
> On mips any syscalls who return a value between -MAXERRNO (1133) and
> -1, is considered as an error (the error flag is set and return value
> is the positive value of the error number).
> But some syscalls can return values between -MAXERRNO and -1 like
> sys_time and sys_times. In this case the userspace return value is
> -return value of the syscall and the error flag set.
> This patch add a TIF_NOERROR thread flag which indicates that the
> return value of a syscall is always correct.
To my personal embarassment I have to admit that I knew about this since the
day the syscall wrapper was written - but was considering it an acceptable
Where it really bits is sigreturn and similar which use the following
* Don't let your children do this ...
:/* no outputs */
/* Unreached */
to keep the syscall return path from tampering with the return value.
The scall*.S part of your patch is clearing TIF_NOERROR using a non-atomic
LW/SW sequence. This needs to be done atomically or the thread's flags
variable might get corrupted. This is complicated by MIPS I, R5900 and
afair some older oddball not-quite MIPS II CPUs lacking LL/SC rsp. LLD/SCD.