47 lines
1.5 KiB
Diff
47 lines
1.5 KiB
Diff
Index: linux-user/syscall.c
|
|
================================================================================
|
|
--- configure
|
|
+++ configure
|
|
@@ -1610,6 +1610,7 @@
|
|
echo "KVM_CFLAGS=$kvm_cflags" >> $config_mak
|
|
echo "#define CONFIG_KVM 1" >> $config_h
|
|
fi
|
|
+ target_nptl="yes"
|
|
;;
|
|
x86_64)
|
|
echo "TARGET_ARCH=x86_64" >> $config_mak
|
|
--- linux-user/syscall.c
|
|
+++ linux-user/syscall.c
|
|
@@ -3175,8 +3175,14 @@
|
|
flags &= ~CLONE_NPTL_FLAGS2;
|
|
|
|
/* TODO: Implement CLONE_CHILD_CLEARTID. */
|
|
- 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);
|
|
@@ -3247,8 +3253,14 @@
|
|
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
|
|
+ }
|
|
/* TODO: Implement CLONE_CHILD_CLEARTID. */
|
|
#endif
|
|
} else {
|