1 #ifndef __ASM_SH_FPU_H 2 #define __ASM_SH_FPU_H 3 4 #ifndef __ASSEMBLY__ 5 6 struct task_struct; 7 8 #ifdef CONFIG_SH_FPU 9 static inline void release_fpu(struct pt_regs *regs) 10 { 11 regs->sr |= SR_FD; 12 } 13 14 static inline void grab_fpu(struct pt_regs *regs) 15 { 16 regs->sr &= ~SR_FD; 17 } 18 19 extern void save_fpu(struct task_struct *__tsk); 20 extern void restore_fpu(struct task_struct *__tsk); 21 extern void fpu_state_restore(struct pt_regs *regs); 22 extern void __fpu_state_restore(void); 23 #else 24 #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) 30 #endif 31 32 struct user_regset; 33 34 extern int do_fpu_inst(unsigned short, struct pt_regs *); 35 extern int init_fpu(struct task_struct *); 36 37 extern 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 42 static 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->thread.fpu_counter = 0; 50 } 51 52 static inline void unlazy_fpu(struct task_struct *tsk, struct pt_regs *regs) 53 { 54 preempt_disable(); 55 __unlazy_fpu(tsk, regs); 56 preempt_enable(); 57 } 58 59 static inline void clear_fpu(struct task_struct *tsk, struct pt_regs *regs) 60 { 61 preempt_disable(); 62 if (task_thread_info(tsk)->status & TS_USEDFPU) { 63 task_thread_info(tsk)->status &= ~TS_USEDFPU; 64 release_fpu(regs); 65 } 66 preempt_enable(); 67 } 68 69 #endif /* __ASSEMBLY__ */ 70 71 #endif /* __ASM_SH_FPU_H */ 72