dect
/
linux-2.6
Archived
13
0
Fork 0

x86: tls prevent_tail_call

Fix a kernel bug (vmware boot problem) reported by Tomasz Grobelny,
which occurs with certain .config variants and gccs.

The x86 TLS cleanup in commit efd1ca52d0
made the sys_set_thread_area and sys_get_thread_area functions ripe for
tail call optimization.  If the compiler chooses to use it for them, it
can clobber the user trap frame because these are asmlinkage functions.

Reported-by: Tomasz Grobelny <tomasz@grobelny.oswiecenia.net>
Signed-off-by: Roland McGrath <roland@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Roland McGrath 2008-02-26 13:00:18 -08:00 committed by Ingo Molnar
parent c0f4133b8f
commit 3d00daf446
1 changed files with 6 additions and 2 deletions

View File

@ -91,7 +91,9 @@ int do_set_thread_area(struct task_struct *p, int idx,
asmlinkage int sys_set_thread_area(struct user_desc __user *u_info)
{
return do_set_thread_area(current, -1, u_info, 1);
int ret = do_set_thread_area(current, -1, u_info, 1);
prevent_tail_call(ret);
return ret;
}
@ -139,7 +141,9 @@ int do_get_thread_area(struct task_struct *p, int idx,
asmlinkage int sys_get_thread_area(struct user_desc __user *u_info)
{
return do_get_thread_area(current, -1, u_info);
int ret = do_get_thread_area(current, -1, u_info);
prevent_tail_call(ret);
return ret;
}
int regset_tls_active(struct task_struct *target,