diff options
author | Michael Trimarchi <trimarchi@gandalf.sssup.it> | 2009-04-03 13:32:33 -0400 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2009-04-04 11:48:11 -0400 |
commit | 01ab10393c510342ec4ce85df11ccfa3df06bbb2 (patch) | |
tree | ebf0493fa7b53941f830f8b300037f834eb85e59 /arch/sh/kernel/ptrace_32.c | |
parent | a27873cd234b4248dda342721d6262943e5fa235 (diff) |
sh: Fix up DSP context save/restore.
There were a number of issues with the DSP context save/restore code,
mostly left-over relics from when it was introduced on SH3-DSP with
little follow-up testing, resulting in things like task_pt_dspregs()
referencing incorrect state on the stack.
This follows the MIPS convention of tracking the DSP state in the
thread_struct and handling the state save/restore in switch_to() and
finish_arch_switch() respectively. The regset interface is also updated,
which allows us to finally be rid of task_pt_dspregs() and the special
cased task_pt_regs().
Signed-off-by: Michael Trimarchi <michael@evidence.eu.com>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/kernel/ptrace_32.c')
-rw-r--r-- | arch/sh/kernel/ptrace_32.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/arch/sh/kernel/ptrace_32.c b/arch/sh/kernel/ptrace_32.c index 29ca09d24ef8..f7b22dd83b0c 100644 --- a/arch/sh/kernel/ptrace_32.c +++ b/arch/sh/kernel/ptrace_32.c | |||
@@ -200,7 +200,8 @@ static int dspregs_get(struct task_struct *target, | |||
200 | unsigned int pos, unsigned int count, | 200 | unsigned int pos, unsigned int count, |
201 | void *kbuf, void __user *ubuf) | 201 | void *kbuf, void __user *ubuf) |
202 | { | 202 | { |
203 | const struct pt_dspregs *regs = task_pt_dspregs(target); | 203 | const struct pt_dspregs *regs = |
204 | (struct pt_dspregs *)&target->thread.dsp_status.dsp_regs; | ||
204 | int ret; | 205 | int ret; |
205 | 206 | ||
206 | ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf, regs, | 207 | ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf, regs, |
@@ -217,7 +218,8 @@ static int dspregs_set(struct task_struct *target, | |||
217 | unsigned int pos, unsigned int count, | 218 | unsigned int pos, unsigned int count, |
218 | const void *kbuf, const void __user *ubuf) | 219 | const void *kbuf, const void __user *ubuf) |
219 | { | 220 | { |
220 | struct pt_dspregs *regs = task_pt_dspregs(target); | 221 | struct pt_dspregs *regs = |
222 | (struct pt_dspregs *)&target->thread.dsp_status.dsp_regs; | ||
221 | int ret; | 223 | int ret; |
222 | 224 | ||
223 | ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, regs, | 225 | ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, regs, |