1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef __ASM_SH_FPU_H 3*4882a593Smuzhiyun #define __ASM_SH_FPU_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #include <asm/ptrace.h> 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun struct task_struct; 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #ifdef CONFIG_SH_FPU release_fpu(struct pt_regs * regs)12*4882a593Smuzhiyunstatic inline void release_fpu(struct pt_regs *regs) 13*4882a593Smuzhiyun { 14*4882a593Smuzhiyun regs->sr |= SR_FD; 15*4882a593Smuzhiyun } 16*4882a593Smuzhiyun grab_fpu(struct pt_regs * regs)17*4882a593Smuzhiyunstatic inline void grab_fpu(struct pt_regs *regs) 18*4882a593Smuzhiyun { 19*4882a593Smuzhiyun regs->sr &= ~SR_FD; 20*4882a593Smuzhiyun } 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun extern void save_fpu(struct task_struct *__tsk); 23*4882a593Smuzhiyun extern void restore_fpu(struct task_struct *__tsk); 24*4882a593Smuzhiyun extern void fpu_state_restore(struct pt_regs *regs); 25*4882a593Smuzhiyun extern void __fpu_state_restore(void); 26*4882a593Smuzhiyun #else 27*4882a593Smuzhiyun #define save_fpu(tsk) do { } while (0) 28*4882a593Smuzhiyun #define restore_fpu(tsk) do { } while (0) 29*4882a593Smuzhiyun #define release_fpu(regs) do { } while (0) 30*4882a593Smuzhiyun #define grab_fpu(regs) do { } while (0) 31*4882a593Smuzhiyun #define fpu_state_restore(regs) do { } while (0) 32*4882a593Smuzhiyun #define __fpu_state_restore(regs) do { } while (0) 33*4882a593Smuzhiyun #endif 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun struct user_regset; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun extern int do_fpu_inst(unsigned short, struct pt_regs *); 38*4882a593Smuzhiyun extern int init_fpu(struct task_struct *); 39*4882a593Smuzhiyun __unlazy_fpu(struct task_struct * tsk,struct pt_regs * regs)40*4882a593Smuzhiyunstatic inline void __unlazy_fpu(struct task_struct *tsk, struct pt_regs *regs) 41*4882a593Smuzhiyun { 42*4882a593Smuzhiyun if (task_thread_info(tsk)->status & TS_USEDFPU) { 43*4882a593Smuzhiyun task_thread_info(tsk)->status &= ~TS_USEDFPU; 44*4882a593Smuzhiyun save_fpu(tsk); 45*4882a593Smuzhiyun release_fpu(regs); 46*4882a593Smuzhiyun } else 47*4882a593Smuzhiyun tsk->thread.fpu_counter = 0; 48*4882a593Smuzhiyun } 49*4882a593Smuzhiyun unlazy_fpu(struct task_struct * tsk,struct pt_regs * regs)50*4882a593Smuzhiyunstatic inline void unlazy_fpu(struct task_struct *tsk, struct pt_regs *regs) 51*4882a593Smuzhiyun { 52*4882a593Smuzhiyun preempt_disable(); 53*4882a593Smuzhiyun __unlazy_fpu(tsk, regs); 54*4882a593Smuzhiyun preempt_enable(); 55*4882a593Smuzhiyun } 56*4882a593Smuzhiyun clear_fpu(struct task_struct * tsk,struct pt_regs * regs)57*4882a593Smuzhiyunstatic inline void clear_fpu(struct task_struct *tsk, struct pt_regs *regs) 58*4882a593Smuzhiyun { 59*4882a593Smuzhiyun preempt_disable(); 60*4882a593Smuzhiyun if (task_thread_info(tsk)->status & TS_USEDFPU) { 61*4882a593Smuzhiyun task_thread_info(tsk)->status &= ~TS_USEDFPU; 62*4882a593Smuzhiyun release_fpu(regs); 63*4882a593Smuzhiyun } 64*4882a593Smuzhiyun preempt_enable(); 65*4882a593Smuzhiyun } 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */ 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun #endif /* __ASM_SH_FPU_H */ 70