summaryrefslogtreecommitdiff
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
parentf3ddd173806fd5c60b3f034528ca24542aecc5b9 (diff)
downloadmusl-f630df09b1fd954eda16e2f779da0b5ecc9d80d3.tar.gz
musl-f630df09b1fd954eda16e2f779da0b5ecc9d80d3.tar.bz2
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).
-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