MIPS signal handling fixes.
authorpbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162>
Tue, 21 Apr 2009 01:41:10 +0000 (01:41 +0000)
committerpbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162>
Tue, 21 Apr 2009 01:41:10 +0000 (01:41 +0000)
commit0fb60bd6ab16336e9f7d91b90beb7d6766cfce78
tree8306c1a98cbc08e5c99e04c9ab6278ac6e1099be
parent189efbd987bc39889f71d307ed22f56fe2c6bd54
MIPS signal handling fixes.

Also fixes a register corruption bug in do_sigreturn. When "returning"
from sigreturn we are actually restoring the virtual cpu state from the
signal frame.  This is actually surprisingly hard to observe in practice.

Typically an thread be blocked in a FUTEX_WAIT call when the signal arrives,
so the effect is a spurious syscall success and the introduction of a
subtle race condition.

On x86/arm a syscall modifies a single word sized register, so
do_sigreturn can just return that value.  On MIPS a syscall clobbers
multiple registers, so we need additional smarts.  My solution is to
invent a magic errno value that means "don't touch CPU state".

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@7194 c046a42c-6fe2-441c-8c8c-71466251a162
linux-user/main.c
linux-user/mips/syscall.h
linux-user/signal.c