diff options
author | Rich Felker <dalias@aerifal.cx> | 2015-04-13 17:26:08 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2015-04-13 17:26:08 -0400 |
commit | f630df09b1fd954eda16e2f779da0b5ecc9d80d3 (patch) | |
tree | ffd7214107c40ed9ab6d321a72184efc4b4b8533 | |
parent | f3ddd173806fd5c60b3f034528ca24542aecc5b9 (diff) | |
download | musl-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.s | 6 |
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 |