diff options
author | David S. Miller <davem@davemloft.net> | 2008-07-31 23:40:46 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-07-31 23:40:46 -0400 |
commit | 0a4949c4414af2eb91414bcd8e2a8ac3706f7dde (patch) | |
tree | 5f05f6f539741587127900bbdd838a2e882fcdbf /arch | |
parent | dbf3e950679b2588e554baa4da94c445c7903e24 (diff) |
sparc64: Do not clobber %g7 in setcontext() trap.
That's the userland thread register, so we should never try to change
it like this.
Based upon glibc bug nptl/6577 and suggestions by Jakub Jelinek.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/sparc64/kernel/signal.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/arch/sparc64/kernel/signal.c b/arch/sparc64/kernel/signal.c index d1b84456a9ee..ca5a6ae3a6e2 100644 --- a/arch/sparc64/kernel/signal.c +++ b/arch/sparc64/kernel/signal.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * arch/sparc64/kernel/signal.c | 2 | * arch/sparc64/kernel/signal.c |
3 | * | 3 | * |
4 | * Copyright (C) 1991, 1992 Linus Torvalds | 4 | * Copyright (C) 1991, 1992 Linus Torvalds |
5 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 5 | * Copyright (C) 1995, 2008 David S. Miller (davem@davemloft.net) |
6 | * Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx) | 6 | * Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx) |
7 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) | 7 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) |
8 | * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | 8 | * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) |
@@ -91,7 +91,9 @@ asmlinkage void sparc64_set_context(struct pt_regs *regs) | |||
91 | err |= __get_user(regs->u_regs[UREG_G4], (&(*grp)[MC_G4])); | 91 | err |= __get_user(regs->u_regs[UREG_G4], (&(*grp)[MC_G4])); |
92 | err |= __get_user(regs->u_regs[UREG_G5], (&(*grp)[MC_G5])); | 92 | err |= __get_user(regs->u_regs[UREG_G5], (&(*grp)[MC_G5])); |
93 | err |= __get_user(regs->u_regs[UREG_G6], (&(*grp)[MC_G6])); | 93 | err |= __get_user(regs->u_regs[UREG_G6], (&(*grp)[MC_G6])); |
94 | err |= __get_user(regs->u_regs[UREG_G7], (&(*grp)[MC_G7])); | 94 | |
95 | /* Skip %g7 as that's the thread register in userspace. */ | ||
96 | |||
95 | err |= __get_user(regs->u_regs[UREG_I0], (&(*grp)[MC_O0])); | 97 | err |= __get_user(regs->u_regs[UREG_I0], (&(*grp)[MC_O0])); |
96 | err |= __get_user(regs->u_regs[UREG_I1], (&(*grp)[MC_O1])); | 98 | err |= __get_user(regs->u_regs[UREG_I1], (&(*grp)[MC_O1])); |
97 | err |= __get_user(regs->u_regs[UREG_I2], (&(*grp)[MC_O2])); | 99 | err |= __get_user(regs->u_regs[UREG_I2], (&(*grp)[MC_O2])); |