diff options
-rw-r--r-- | arch/x86/Kconfig | 1 | ||||
-rw-r--r-- | arch/x86/kernel/process_32.c | 6 | ||||
-rw-r--r-- | arch/x86/kernel/process_64.c | 8 |
3 files changed, 8 insertions, 7 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 47365c7b9f47..55bced17dc95 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -88,6 +88,7 @@ config X86 | |||
88 | select HAVE_CMPXCHG_DOUBLE | 88 | select HAVE_CMPXCHG_DOUBLE |
89 | select HAVE_CMPXCHG_LOCAL | 89 | select HAVE_CMPXCHG_LOCAL |
90 | select HAVE_CONTEXT_TRACKING if X86_64 | 90 | select HAVE_CONTEXT_TRACKING if X86_64 |
91 | select HAVE_COPY_THREAD_TLS | ||
91 | select HAVE_C_RECORDMCOUNT | 92 | select HAVE_C_RECORDMCOUNT |
92 | select HAVE_DEBUG_KMEMLEAK | 93 | select HAVE_DEBUG_KMEMLEAK |
93 | select HAVE_DEBUG_STACKOVERFLOW | 94 | select HAVE_DEBUG_STACKOVERFLOW |
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index c09c99ccf3e3..f73c962fe636 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
@@ -128,8 +128,8 @@ void release_thread(struct task_struct *dead_task) | |||
128 | release_vm86_irqs(dead_task); | 128 | release_vm86_irqs(dead_task); |
129 | } | 129 | } |
130 | 130 | ||
131 | int copy_thread(unsigned long clone_flags, unsigned long sp, | 131 | int copy_thread_tls(unsigned long clone_flags, unsigned long sp, |
132 | unsigned long arg, struct task_struct *p) | 132 | unsigned long arg, struct task_struct *p, unsigned long tls) |
133 | { | 133 | { |
134 | struct pt_regs *childregs = task_pt_regs(p); | 134 | struct pt_regs *childregs = task_pt_regs(p); |
135 | struct task_struct *tsk; | 135 | struct task_struct *tsk; |
@@ -184,7 +184,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, | |||
184 | */ | 184 | */ |
185 | if (clone_flags & CLONE_SETTLS) | 185 | if (clone_flags & CLONE_SETTLS) |
186 | err = do_set_thread_area(p, -1, | 186 | err = do_set_thread_area(p, -1, |
187 | (struct user_desc __user *)childregs->si, 0); | 187 | (struct user_desc __user *)tls, 0); |
188 | 188 | ||
189 | if (err && p->thread.io_bitmap_ptr) { | 189 | if (err && p->thread.io_bitmap_ptr) { |
190 | kfree(p->thread.io_bitmap_ptr); | 190 | kfree(p->thread.io_bitmap_ptr); |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 843f92e4c711..71d7849a07f7 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
@@ -150,8 +150,8 @@ static inline u32 read_32bit_tls(struct task_struct *t, int tls) | |||
150 | return get_desc_base(&t->thread.tls_array[tls]); | 150 | return get_desc_base(&t->thread.tls_array[tls]); |
151 | } | 151 | } |
152 | 152 | ||
153 | int copy_thread(unsigned long clone_flags, unsigned long sp, | 153 | int copy_thread_tls(unsigned long clone_flags, unsigned long sp, |
154 | unsigned long arg, struct task_struct *p) | 154 | unsigned long arg, struct task_struct *p, unsigned long tls) |
155 | { | 155 | { |
156 | int err; | 156 | int err; |
157 | struct pt_regs *childregs; | 157 | struct pt_regs *childregs; |
@@ -207,10 +207,10 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, | |||
207 | #ifdef CONFIG_IA32_EMULATION | 207 | #ifdef CONFIG_IA32_EMULATION |
208 | if (is_ia32_task()) | 208 | if (is_ia32_task()) |
209 | err = do_set_thread_area(p, -1, | 209 | err = do_set_thread_area(p, -1, |
210 | (struct user_desc __user *)childregs->si, 0); | 210 | (struct user_desc __user *)tls, 0); |
211 | else | 211 | else |
212 | #endif | 212 | #endif |
213 | err = do_arch_prctl(p, ARCH_SET_FS, childregs->r8); | 213 | err = do_arch_prctl(p, ARCH_SET_FS, tls); |
214 | if (err) | 214 | if (err) |
215 | goto out; | 215 | goto out; |
216 | } | 216 | } |