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 <tanguy.bouzeloc@xxxxxxxxx> > To: ralf@xxxxxxxxxxxxxx > Cc: linux-mips@xxxxxxxxxxxxxx, Tanguy Bouzeloc <tanguy.bouzeloc@xxxxxxxxx> > 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 bug ... Where it really bits is sigreturn and similar which use the following stunt: /* * Don't let your children do this ... */ __asm__ __volatile__( "move\t$29, %0\n\t" "j\tsyscall_exit" :/* no outputs */ :"r" (®s)); /* 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. Ralf