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"
"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)
{
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(¤t->thread.fpu.hard);
}
disable_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;
#ifdef CONFIG_SH_FPU
if(last_task_used_math == current) {
enable_fpu();
- fpsave(¤t->thread.fpu.hard);
+ save_fpu(current, regs);
disable_fpu();
last_task_used_math = NULL;
regs->sr |= SR_FD;
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;
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;
if (current == last_task_used_math) {
enable_fpu();
- fpsave(¤t->thread.fpu.hard);
+ save_fpu(current, regs);
disable_fpu();
last_task_used_math = NULL;
regs->sr |= SR_FD;
indexed by register number. */
if (last_task_used_math == current) {
enable_fpu();
- fpsave(¤t->thread.fpu.hard);
+ save_fpu(current, regs);
disable_fpu();
last_task_used_math = NULL;
regs->sr |= SR_FD;
indexed by register number. */
if (last_task_used_math == current) {
enable_fpu();
- fpsave(¤t->thread.fpu.hard);
+ save_fpu(current, regs);
disable_fpu();
last_task_used_math = NULL;
regs->sr |= SR_FD;
--- /dev/null
+#ifndef __ASM_SH_FPU_H
+#define __ASM_SH_FPU_H
+
+#define SR_FD 0x00008000
+
+#ifndef __ASSEMBLY__
+#include <asm/ptrace.h>
+
+#ifdef CONFIG_SH_FPU
+static inline void release_fpu(struct pt_regs *regs)
+{
+ regs->sr |= SR_FD;
+}
+
+static inline void grab_fpu(struct pt_regs *regs)
+{
+ regs->sr &= ~SR_FD;
+}
+
+struct task_struct;
+
+extern void save_fpu(struct task_struct *__tsk, struct pt_regs *regs);
+#else
+#define release_fpu(regs) do { } while (0)
+#define grab_fpu(regs) do { } while (0)
+#define save_fpu(tsk, regs) do { } while (0)
+#endif
+
+#define unlazy_fpu(tsk, regs) do { \
+ if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) { \
+ save_fpu(tsk, regs); \
+ } \
+} while (0)
+
+#define clear_fpu(tsk, regs) do { \
+ if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) { \
+ clear_tsk_thread_flag(tsk, TIF_USEDFPU); \
+ release_fpu(regs); \
+ } \
+} while (0)
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* __ASM_SH_FPU_H */
#define __ASM_SH_PROCESSOR_H
#include <asm/cpu-features.h>
+#include <asm/fpu.h>
#ifndef __ASSEMBLY__
-
/*
* CPU type and hardware bug flags. Kept separately for each CPU.
*
* IMASK-bit:
* Interrupt level mask
*/
-#define SR_FD 0x00008000
#define SR_DSP 0x00001000
#define SR_IMASK 0x000000f0
: "r" (~SR_FD));
}
-static __inline__ void release_fpu(struct pt_regs *regs)
-{
- regs->sr |= SR_FD;
-}
-
-static __inline__ void grab_fpu(struct pt_regs *regs)
-{
- regs->sr &= ~SR_FD;
-}
-
-extern void save_fpu(struct task_struct *__tsk, struct pt_regs *regs);
-
-#define unlazy_fpu(tsk, regs) do { \
- if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) { \
- save_fpu(tsk, regs); \
- } \
-} while (0)
-
-#define clear_fpu(tsk, regs) do { \
- if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) { \
- clear_tsk_thread_flag(tsk, TIF_USEDFPU); \
- release_fpu(regs); \
- } \
-} while (0)
-
/* Double presision, NANS as NANS, rounding to nearest, no exceptions */
#define FPSCR_INIT 0x00080000
* Single step bit
*
*/
-#define SR_FD 0x00008000
-
#if defined(CONFIG_SH64_SR_WATCH)
#define SR_MMU 0x84000000
#else
: "r" (~SR_FD));
}
-static inline void release_fpu(struct pt_regs *regs)
-{
- regs->sr |= SR_FD;
-}
-
-static inline void grab_fpu(struct pt_regs *regs)
-{
- regs->sr &= ~SR_FD;
-}
-
/* Round to nearest, no exceptions on inexact, overflow, underflow,
zero-divide, invalid. Configure option for whether to flush denorms to
zero, or except if a denorm is encountered. */
#endif
#ifdef CONFIG_SH_FPU
-/* Save the current FP regs */
-void fpsave(struct sh_fpu_hard_struct *fpregs);
-
/* Initialise the FP state of a task */
void fpinit(struct sh_fpu_hard_struct *fpregs);
#else
-#define fpsave(fpregs) do { } while (0)
#define fpinit(fpregs) do { } while (0)
#endif