about summary refs log tree commit diff
path: root/src/thread
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2015-06-20 02:54:30 +0000
committerRich Felker <dalias@aerifal.cx>2015-06-20 02:54:30 +0000
commitce3688eca920aa77549323f84e21f33522397115 (patch)
tree1fe74536da26344a9454ebc34bc5adc31d411b44 /src/thread
parent75eceb3ae824d54e865686c0c538551aeebf3372 (diff)
downloadmusl-ce3688eca920aa77549323f84e21f33522397115.tar.gz
musl-ce3688eca920aa77549323f84e21f33522397115.tar.xz
musl-ce3688eca920aa77549323f84e21f33522397115.zip
work around mips detached thread exit breakage due to kernel regression
linux kernel commit 46e12c07b3b9603c60fc1d421ff18618241cb081 caused
the mips syscall mechanism to fail with EFAULT when the userspace
stack pointer is invalid, breaking __unmapself used for detached
thread exit. the workaround is to set $sp to a known-valid, readable
address, and the simplest one to obtain is the address of the current
function, which is available (per o32 calling convention) in $25.
Diffstat (limited to 'src/thread')
-rw-r--r--src/thread/mips/__unmapself.s1
1 files changed, 1 insertions, 0 deletions
diff --git a/src/thread/mips/__unmapself.s b/src/thread/mips/__unmapself.s
index 9aa03712..ba139dc8 100644
--- a/src/thread/mips/__unmapself.s
+++ b/src/thread/mips/__unmapself.s
@@ -2,6 +2,7 @@
 .global __unmapself
 .type   __unmapself,@function
 __unmapself:
+	move $sp, $25
 	li $2, 4091
 	syscall
 	li $4, 0