aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162>2009-04-21 01:41:10 +0000
committerpbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162>2009-04-21 01:41:10 +0000
commit0b1bcb00fb2baf5f3227dd9cd849fa69bf50d7a8 (patch)
tree8306c1a98cbc08e5c99e04c9ab6278ac6e1099be /linux-user/mips
parentMIPS: Raise SIGSEGV, not SIGILL when an access faults. (diff)
downloadqemu-kvm-0b1bcb00fb2baf5f3227dd9cd849fa69bf50d7a8.tar.gz
qemu-kvm-0b1bcb00fb2baf5f3227dd9cd849fa69bf50d7a8.tar.bz2
qemu-kvm-0b1bcb00fb2baf5f3227dd9cd849fa69bf50d7a8.zip
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
Diffstat (limited to 'linux-user/mips')
-rw-r--r--linux-user/mips/syscall.h3
1 files changed, 3 insertions, 0 deletions
diff --git a/linux-user/mips/syscall.h b/linux-user/mips/syscall.h
index 9dfcc1f20..3deb862cc 100644
--- a/linux-user/mips/syscall.h
+++ b/linux-user/mips/syscall.h
@@ -221,4 +221,7 @@ struct target_pt_regs {
+/* Nasty hack: define a fake errno value for use by sigreturn. */
+#define TARGET_QEMU_ESIGRETURN 255
+
#define UNAME_MACHINE "mips"