From c761cdf5a082d0d22d18f2d70443da7d064e2187 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 21 Aug 2002 02:35:30 +0000 Subject: Update. * sysdeps/i386/useldt.h: Go back to using 16-bit instructions when loading/reading segment registers. Some old hardware doesn't handle the 32-bit instructions as expected. * sysdeps/i386/tls.h: Likewise. --- linuxthreads/ChangeLog | 5 +++++ linuxthreads/sysdeps/i386/tls.h | 6 +++--- linuxthreads/sysdeps/i386/useldt.h | 10 +++++----- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index ce61798bbd..2be82510d0 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,5 +1,10 @@ 2002-08-20 Ulrich Drepper + * sysdeps/i386/useldt.h: Go back to using 16-bit instructions when + loading/reading segment registers. Some old hardware doesn't + handle the 32-bit instructions as expected. + * sysdeps/i386/tls.h: Likewise. + * sysdeps/i386/tls.h (TLS_DO_SET_THREAD_AREA): Second parameter is renamed to secondcall and use is negated. (TLS_SETUP_GS_SEGMENT): Likewise. diff --git a/linuxthreads/sysdeps/i386/tls.h b/linuxthreads/sysdeps/i386/tls.h index 0bec077730..a168c008b7 100644 --- a/linuxthreads/sysdeps/i386/tls.h +++ b/linuxthreads/sysdeps/i386/tls.h @@ -123,8 +123,8 @@ typedef struct int result; \ if (secondcall) \ ldt_entry.entry_number = ({ int _gs; \ - asm ("movl %%gs, %0" : "=q" (_gs)); \ - _gs >> 3; }); \ + asm ("movw %%gs, %w0" : "=q" (_gs)); \ + (_gs & 0xffff) >> 3; }); \ asm volatile (TLS_LOAD_EBX \ "int $0x80\n\t" \ TLS_LOAD_EBX \ @@ -164,7 +164,7 @@ typedef struct __gs = TLS_SETUP_GS_SEGMENT (_descr, secondcall); \ if (__builtin_expect (__gs, 7) != -1) \ { \ - asm ("movl %0, %%gs" : : "q" (__gs)); \ + asm ("movw %w0, %%gs" : : "q" (__gs)); \ __gs = 0; \ } \ __gs; \ diff --git a/linuxthreads/sysdeps/i386/useldt.h b/linuxthreads/sysdeps/i386/useldt.h index ff42853668..8c77c4a34b 100644 --- a/linuxthreads/sysdeps/i386/useldt.h +++ b/linuxthreads/sysdeps/i386/useldt.h @@ -72,7 +72,7 @@ extern int __modify_ldt (int, struct modify_ldt_ldt_s *, size_t); 1, 0, 0, 0, 0, 1, 0 }; \ if (__modify_ldt (1, &ldt_entry, sizeof (ldt_entry)) != 0) \ abort (); \ - asm ("movl %0, %%gs" : : "q" (nr * 8 + 7)); \ + asm ("movw %w0, %%gs" : : "q" (nr * 8 + 7)); \ }) /* When using the new set_thread_area call, we don't need to change %gs @@ -83,13 +83,13 @@ extern int __modify_ldt (int, struct modify_ldt_ldt_s *, size_t); ({ \ int __gs; \ struct modify_ldt_ldt_s ldt_entry = \ - { ({ asm ("movl %%gs, %0" : "=q" (__gs)); __gs >> 3; }), \ + { ({ asm ("movw %%gs, %w0" : "=q" (__gs)); (__gs & 0xffff) >> 3; }), \ (unsigned long int) descr, sizeof (struct _pthread_descr_struct), \ 1, 0, 0, 0, 0, 1, 0 }; \ if (__builtin_expect (INLINE_SYSCALL (set_thread_area, 1, &ldt_entry) == 0, \ 1)) \ - asm ("movl %0, %%gs" :: "q" (__gs)); \ - else \ + asm ("movw %w0, %%gs" :: "q" (__gs)); \ + else \ __gs = -1; \ __gs; \ }) @@ -117,7 +117,7 @@ extern int __have_no_set_thread_area; #define FREE_THREAD(descr, nr) \ { \ int __gs; \ - __asm__ __volatile__ ("movl %%gs, %0" : "=q" (__gs)); \ + __asm__ __volatile__ ("movw %%gs, %w0" : "=q" (__gs)); \ if (__builtin_expect (__gs & 4, 0)) \ { \ struct modify_ldt_ldt_s ldt_entry = \ -- cgit 1.4.1