aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sh
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2007-11-22 17:30:50 +0900
committerPaul Mundt <lethal@linux-sh.org>2008-01-28 13:18:55 +0900
commit332fd57b92d26e2ac6112340b98e92bb76117a41 (patch)
treefbbc00a900299ad91f46a74b8f2d42efaf4809af /arch/sh
parentsh: Get the SH-5 PCI support building. (diff)
downloadlinux-dev-332fd57b92d26e2ac6112340b98e92bb76117a41.tar.xz
linux-dev-332fd57b92d26e2ac6112340b98e92bb76117a41.zip
sh: Bring the SH-5 FPU in line with the SH-4 FPU API.
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to '')
-rw-r--r--arch/sh/kernel/cpu/sh5/fpu.c16
-rw-r--r--arch/sh/kernel/process_64.c4
-rw-r--r--arch/sh/kernel/ptrace_64.c4
-rw-r--r--arch/sh/kernel/signal_64.c2
-rw-r--r--arch/sh/kernel/traps_64.c4
5 files changed, 14 insertions, 16 deletions
diff --git a/arch/sh/kernel/cpu/sh5/fpu.c b/arch/sh/kernel/cpu/sh5/fpu.c
index d3f5e7468dfe..5a391b1a00e2 100644
--- a/arch/sh/kernel/cpu/sh5/fpu.c
+++ b/arch/sh/kernel/cpu/sh5/fpu.c
@@ -30,12 +30,12 @@
static union sh_fpu_union init_fpuregs = {
.hard = {
- .fp_regs = { [0 ... 63] = sNAN32 },
- .fpscr = FPSCR_INIT
+ .fp_regs = { [0 ... 63] = sNAN32 },
+ .fpscr = FPSCR_INIT
}
};
-inline void fpsave(struct sh_fpu_hard_struct *fpregs)
+void save_fpu(struct task_struct *tsk, struct pt_regs *regs)
{
asm volatile("fst.p %0, (0*8), fp0\n\t"
"fst.p %0, (1*8), fp2\n\t"
@@ -73,11 +73,10 @@ inline void fpsave(struct sh_fpu_hard_struct *fpregs)
"fgetscr fr63\n\t"
"fst.s %0, (32*8), fr63\n\t"
: /* no output */
- : "r" (fpregs)
+ : "r" (&tsk->thread.fpu.hard)
: "memory");
}
-
static inline void
fpload(struct sh_fpu_hard_struct *fpregs)
{
@@ -153,10 +152,10 @@ do_fpu_state_restore(unsigned long ex, struct pt_regs *regs)
return;
enable_fpu();
- if (last_task_used_math != NULL) {
+ if (last_task_used_math != NULL)
/* Other processes fpu state, save away */
- fpsave(&last_task_used_math->thread.fpu.hard);
- }
+ save_fpu(last_task_used_math, regs);
+
last_task_used_math = current;
if (used_math()) {
fpload(&current->thread.fpu.hard);
@@ -167,4 +166,3 @@ do_fpu_state_restore(unsigned long ex, struct pt_regs *regs)
}
disable_fpu();
}
-
diff --git a/arch/sh/kernel/process_64.c b/arch/sh/kernel/process_64.c
index 2dd97eecb44c..973dd1a3d292 100644
--- a/arch/sh/kernel/process_64.c
+++ b/arch/sh/kernel/process_64.c
@@ -480,7 +480,7 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu)
if (fpvalid) {
if (current == last_task_used_math) {
enable_fpu();
- fpsave(&tsk->thread.fpu.hard);
+ save_fpu(tsk, regs);
disable_fpu();
last_task_used_math = 0;
regs->sr |= SR_FD;
@@ -507,7 +507,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
#ifdef CONFIG_SH_FPU
if(last_task_used_math == current) {
enable_fpu();
- fpsave(&current->thread.fpu.hard);
+ save_fpu(current, regs);
disable_fpu();
last_task_used_math = NULL;
regs->sr |= SR_FD;
diff --git a/arch/sh/kernel/ptrace_64.c b/arch/sh/kernel/ptrace_64.c
index 51bb546365cb..e9cc6ebd2cea 100644
--- a/arch/sh/kernel/ptrace_64.c
+++ b/arch/sh/kernel/ptrace_64.c
@@ -75,7 +75,7 @@ get_fpu_long(struct task_struct *task, unsigned long addr)
if (last_task_used_math == task) {
enable_fpu();
- fpsave(&task->thread.fpu.hard);
+ save_fpu(task, regs);
disable_fpu();
last_task_used_math = 0;
regs->sr |= SR_FD;
@@ -111,7 +111,7 @@ put_fpu_long(struct task_struct *task, unsigned long addr, unsigned long data)
set_stopped_child_used_math(task);
} else if (last_task_used_math == task) {
enable_fpu();
- fpsave(&task->thread.fpu.hard);
+ save_fpu(task, regs);
disable_fpu();
last_task_used_math = 0;
regs->sr |= SR_FD;
diff --git a/arch/sh/kernel/signal_64.c b/arch/sh/kernel/signal_64.c
index 08f403e23662..922891960c33 100644
--- a/arch/sh/kernel/signal_64.c
+++ b/arch/sh/kernel/signal_64.c
@@ -212,7 +212,7 @@ setup_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
if (current == last_task_used_math) {
enable_fpu();
- fpsave(&current->thread.fpu.hard);
+ save_fpu(current, regs);
disable_fpu();
last_task_used_math = NULL;
regs->sr |= SR_FD;
diff --git a/arch/sh/kernel/traps_64.c b/arch/sh/kernel/traps_64.c
index 0f4ea3ac3e0b..b8020f26b635 100644
--- a/arch/sh/kernel/traps_64.c
+++ b/arch/sh/kernel/traps_64.c
@@ -618,7 +618,7 @@ static int misaligned_fpu_load(struct pt_regs *regs,
indexed by register number. */
if (last_task_used_math == current) {
enable_fpu();
- fpsave(&current->thread.fpu.hard);
+ save_fpu(current, regs);
disable_fpu();
last_task_used_math = NULL;
regs->sr |= SR_FD;
@@ -691,7 +691,7 @@ static int misaligned_fpu_store(struct pt_regs *regs,
indexed by register number. */
if (last_task_used_math == current) {
enable_fpu();
- fpsave(&current->thread.fpu.hard);
+ save_fpu(current, regs);
disable_fpu();
last_task_used_math = NULL;
regs->sr |= SR_FD;