blob: 06c4281aab65604af414c5081dde2b9871a3f952 [file] [log] [blame]
Paul Mundt332fd572007-11-22 17:30:50 +09001#ifndef __ASM_SH_FPU_H
2#define __ASM_SH_FPU_H
3
Paul Mundt332fd572007-11-22 17:30:50 +09004#ifndef __ASSEMBLY__
Paul Mundt0ea820c2010-01-13 12:51:40 +09005
6struct task_struct;
Paul Mundt332fd572007-11-22 17:30:50 +09007
8#ifdef CONFIG_SH_FPU
9static inline void release_fpu(struct pt_regs *regs)
10{
11 regs->sr |= SR_FD;
12}
13
14static inline void grab_fpu(struct pt_regs *regs)
15{
16 regs->sr &= ~SR_FD;
17}
18
Stuart Menefyd3ea9fa2009-09-25 18:25:10 +010019extern void save_fpu(struct task_struct *__tsk);
Paul Mundt0ea820c2010-01-13 12:51:40 +090020extern void restore_fpu(struct task_struct *__tsk);
21extern void fpu_state_restore(struct pt_regs *regs);
22extern void __fpu_state_restore(void);
Paul Mundt332fd572007-11-22 17:30:50 +090023#else
Paul Mundt0ea820c2010-01-13 12:51:40 +090024#define save_fpu(tsk) do { } while (0)
25#define restore_fpu(tsk) do { } while (0)
26#define release_fpu(regs) do { } while (0)
27#define grab_fpu(regs) do { } while (0)
28#define fpu_state_restore(regs) do { } while (0)
29#define __fpu_state_restore(regs) do { } while (0)
Paul Mundt332fd572007-11-22 17:30:50 +090030#endif
31
Paul Mundte7ab3cd2008-09-21 19:04:55 +090032struct user_regset;
33
Paul Mundt74d99a52007-11-26 20:38:36 +090034extern int do_fpu_inst(unsigned short, struct pt_regs *);
Paul Mundt0ea820c2010-01-13 12:51:40 +090035extern int init_fpu(struct task_struct *);
Paul Mundt74d99a52007-11-26 20:38:36 +090036
Paul Mundte7ab3cd2008-09-21 19:04:55 +090037extern int fpregs_get(struct task_struct *target,
38 const struct user_regset *regset,
39 unsigned int pos, unsigned int count,
40 void *kbuf, void __user *ubuf);
41
Stuart Menefyd3ea9fa2009-09-25 18:25:10 +010042static inline void __unlazy_fpu(struct task_struct *tsk, struct pt_regs *regs)
43{
44 if (task_thread_info(tsk)->status & TS_USEDFPU) {
45 task_thread_info(tsk)->status &= ~TS_USEDFPU;
46 save_fpu(tsk);
47 release_fpu(regs);
48 } else
49 tsk->fpu_counter = 0;
50}
51
Paul Mundt9bbafce2008-03-26 19:02:47 +090052static inline void unlazy_fpu(struct task_struct *tsk, struct pt_regs *regs)
53{
54 preempt_disable();
Stuart Menefyd3ea9fa2009-09-25 18:25:10 +010055 __unlazy_fpu(tsk, regs);
Paul Mundt9bbafce2008-03-26 19:02:47 +090056 preempt_enable();
57}
Paul Mundt332fd572007-11-22 17:30:50 +090058
Paul Mundt9bbafce2008-03-26 19:02:47 +090059static inline void clear_fpu(struct task_struct *tsk, struct pt_regs *regs)
60{
61 preempt_disable();
Stuart Menefyd3ea9fa2009-09-25 18:25:10 +010062 if (task_thread_info(tsk)->status & TS_USEDFPU) {
63 task_thread_info(tsk)->status &= ~TS_USEDFPU;
Paul Mundt9bbafce2008-03-26 19:02:47 +090064 release_fpu(regs);
65 }
66 preempt_enable();
67}
Paul Mundt332fd572007-11-22 17:30:50 +090068
Paul Mundt332fd572007-11-22 17:30:50 +090069#endif /* __ASSEMBLY__ */
70
71#endif /* __ASM_SH_FPU_H */