|
@@ -24,6 +24,7 @@
|
|
|
#include <stdlib.h> /* For abort(). */
|
|
|
|
|
|
|
|
|
+
|
|
|
/* We don't want to include the kernel header. So duplicate the
|
|
|
information. */
|
|
|
|
|
@@ -76,7 +77,7 @@ extern int __modify_ldt (int, struct modify_ldt_ldt_s *, size_t);
|
|
|
|
|
|
#ifdef __PIC__
|
|
|
# define USETLS_EBX_ARG "r"
|
|
|
-# define USETLS_LOAD_EBX "xchgl %3, %%ebx\n\t"
|
|
|
+# define USETLS_LOAD_EBX "xchgl %1, %%ebx\n\t"
|
|
|
#else
|
|
|
# define USETLS_EBX_ARG "b"
|
|
|
# define USETLS_LOAD_EBX
|
|
@@ -108,8 +109,10 @@ extern int __modify_ldt (int, struct modify_ldt_ldt_s *, size_t);
|
|
|
"movl %2, %%eax\n\t" \
|
|
|
"int $0x80\n\t" \
|
|
|
USETLS_LOAD_EBX \
|
|
|
- : "&a" (__result) \
|
|
|
- : USETLS_EBX_ARG (&ldt_entry), "i" (__NR_set_thread_area)); \
|
|
|
+ : "=&a" (__result) \
|
|
|
+ : USETLS_EBX_ARG (&ldt_entry), "i" (__NR_set_thread_area), \
|
|
|
+ "m" (ldt_entry) \
|
|
|
+ : "memory"); \
|
|
|
if (__result == 0) \
|
|
|
asm ("movw %w0, %%gs" :: "q" (__gs)); \
|
|
|
else \
|
|
@@ -126,8 +129,10 @@ extern int __modify_ldt (int, struct modify_ldt_ldt_s *, size_t);
|
|
|
"movl %2, %%eax\n\t" \
|
|
|
"int $0x80\n\t" \
|
|
|
USETLS_LOAD_EBX \
|
|
|
- : "&a" (__result) \
|
|
|
- : USETLS_EBX_ARG (&ldt_entry), "i" (__NR_set_thread_area)); \
|
|
|
+ : "=&a" (__result) \
|
|
|
+ : USETLS_EBX_ARG (&ldt_entry), "i" (__NR_set_thread_area), \
|
|
|
+ "m" (ldt_entry) \
|
|
|
+ : "memory"); \
|
|
|
if (__result == 0) \
|
|
|
{ \
|
|
|
__gs = (ldt_entry.entry_number << 3) + 3; \
|