allow i386 __set_thread_area to be called more than once
authorRich Felker <dalias@aerifal.cx>
Mon, 13 Apr 2015 21:26:08 +0000 (17:26 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 13 Apr 2015 21:26:08 +0000 (17:26 -0400)
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).

src/thread/i386/__set_thread_area.s

index ad53815..1d85268 100644 (file)
@@ -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