about summary refs log tree commit diff
path: root/src/thread
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2015-04-13 17:26:08 -0400
committerRich Felker <dalias@aerifal.cx>2015-04-13 17:26:08 -0400
commitf630df09b1fd954eda16e2f779da0b5ecc9d80d3 (patch)
treeffd7214107c40ed9ab6d321a72184efc4b4b8533 /src/thread
parentf3ddd173806fd5c60b3f034528ca24542aecc5b9 (diff)
downloadmusl-f630df09b1fd954eda16e2f779da0b5ecc9d80d3.tar.gz
musl-f630df09b1fd954eda16e2f779da0b5ecc9d80d3.tar.xz
musl-f630df09b1fd954eda16e2f779da0b5ecc9d80d3.zip
allow i386 __set_thread_area to be called more than once
previously a new GDT slot was requested, even if one had already been
obtained by a previous call. instead extract the old slot number from
GS and reuse it if it was already set. the formula (GS-3)/8 for the
slot number automatically yields -1 (request for new slot) if GS is
zero (unset).
Diffstat (limited to 'src/thread')
-rw-r--r--src/thread/i386/__set_thread_area.s6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/thread/i386/__set_thread_area.s b/src/thread/i386/__set_thread_area.s
index ad538151..1d852689 100644
--- a/src/thread/i386/__set_thread_area.s
+++ b/src/thread/i386/__set_thread_area.s
@@ -6,7 +6,11 @@ __set_thread_area:
 	push $0x51
 	push $0xfffff
 	push 16(%esp)
-	push $-1
+	xor %edx,%edx
+	mov %gs,%dx
+	sub $3,%edx
+	sar $3,%edx
+	push %edx
 	mov %esp,%ebx
 	xor %eax,%eax
 	mov $243,%al