65 lines
2.0 KiB
Diff
65 lines
2.0 KiB
Diff
|
From b7c83887c1c86140ffaab86d4d1fca5a81e86c2d Mon Sep 17 00:00:00 2001
|
||
|
From: Ulrich Hecht <uli@suse.de>
|
||
|
Date: Thu, 16 Apr 2009 15:14:12 +0200
|
||
|
Subject: [PATCH 13/16] i386-linux-user NPTL support
|
||
|
|
||
|
Makes NPTL binaries run by implementing TLS.
|
||
|
|
||
|
Signed-off-by: Ulrich Hecht <uli@suse.de>
|
||
|
---
|
||
|
configure | 1 +
|
||
|
linux-user/syscall.c | 16 ++++++++++++++--
|
||
|
2 files changed, 15 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/configure b/configure
|
||
|
index 5f463b0..0ec7ff0 100755
|
||
|
--- a/configure
|
||
|
+++ b/configure
|
||
|
@@ -2283,6 +2283,7 @@ TARGET_ABI_DIR=""
|
||
|
case "$target_arch2" in
|
||
|
i386)
|
||
|
target_phys_bits=32
|
||
|
+ target_nptl="yes"
|
||
|
;;
|
||
|
x86_64)
|
||
|
TARGET_BASE_ARCH=i386
|
||
|
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
|
||
|
index a74869e..ec67a14 100644
|
||
|
--- a/linux-user/syscall.c
|
||
|
+++ b/linux-user/syscall.c
|
||
|
@@ -3584,8 +3584,14 @@ static int do_fork(CPUState *env, unsigned int flags, abi_ulong newsp,
|
||
|
ts->child_tidptr = child_tidptr;
|
||
|
}
|
||
|
|
||
|
- if (nptl_flags & CLONE_SETTLS)
|
||
|
+ if (nptl_flags & CLONE_SETTLS) {
|
||
|
+#if defined(TARGET_I386) && defined(TARGET_ABI32)
|
||
|
+ do_set_thread_area(new_env, newtls);
|
||
|
+ cpu_x86_load_seg(new_env, R_GS, new_env->segs[R_GS].selector);
|
||
|
+#else
|
||
|
cpu_set_tls (new_env, newtls);
|
||
|
+#endif
|
||
|
+ }
|
||
|
|
||
|
/* Grab a mutex so that thread setup appears atomic. */
|
||
|
pthread_mutex_lock(&clone_lock);
|
||
|
@@ -3657,8 +3663,14 @@ static int do_fork(CPUState *env, unsigned int flags, abi_ulong newsp,
|
||
|
if (flags & CLONE_PARENT_SETTID)
|
||
|
put_user_u32(gettid(), parent_tidptr);
|
||
|
ts = (TaskState *)env->opaque;
|
||
|
- if (flags & CLONE_SETTLS)
|
||
|
+ if (flags & CLONE_SETTLS) {
|
||
|
+#if defined(TARGET_I386) && defined(TARGET_ABI32)
|
||
|
+ do_set_thread_area(env, newtls);
|
||
|
+ cpu_x86_load_seg(env, R_GS, env->segs[R_GS].selector);
|
||
|
+#else
|
||
|
cpu_set_tls (env, newtls);
|
||
|
+#endif
|
||
|
+ }
|
||
|
if (flags & CLONE_CHILD_CLEARTID)
|
||
|
ts->child_tidptr = child_tidptr;
|
||
|
#endif
|
||
|
--
|
||
|
1.6.4.2
|
||
|
|