2007-11-22 17:30:50 +09:00
# ifndef __ASM_SH_FPU_H
# define __ASM_SH_FPU_H
# ifndef __ASSEMBLY__
2008-03-26 19:02:47 +09:00
# include <linux/preempt.h>
2007-11-22 17:30:50 +09:00
# 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 ) ;
2009-07-07 16:25:10 +02:00
void fpu_state_restore ( struct pt_regs * regs ) ;
2007-11-22 17:30:50 +09:00
# else
2008-03-26 19:09:21 +09:00
2007-11-22 17:30:50 +09:00
# define release_fpu(regs) do { } while (0)
# define grab_fpu(regs) do { } while (0)
2008-03-26 19:09:21 +09:00
static inline void save_fpu ( struct task_struct * tsk , struct pt_regs * regs )
{
clear_tsk_thread_flag ( tsk , TIF_USEDFPU ) ;
}
2007-11-22 17:30:50 +09:00
# endif
2008-09-21 19:04:55 +09:00
struct user_regset ;
2007-11-26 20:38:36 +09:00
extern int do_fpu_inst ( unsigned short , struct pt_regs * ) ;
2008-09-21 19:04:55 +09:00
extern int fpregs_get ( struct task_struct * target ,
const struct user_regset * regset ,
unsigned int pos , unsigned int count ,
void * kbuf , void __user * ubuf ) ;
2008-03-26 19:02:47 +09:00
static inline void unlazy_fpu ( struct task_struct * tsk , struct pt_regs * regs )
{
preempt_disable ( ) ;
if ( test_tsk_thread_flag ( tsk , TIF_USEDFPU ) )
save_fpu ( tsk , regs ) ;
2009-07-07 16:25:10 +02:00
else
tsk - > fpu_counter = 0 ;
2008-03-26 19:02:47 +09:00
preempt_enable ( ) ;
}
static inline void clear_fpu ( struct task_struct * tsk , struct pt_regs * regs )
{
preempt_disable ( ) ;
if ( test_tsk_thread_flag ( tsk , TIF_USEDFPU ) ) {
clear_tsk_thread_flag ( tsk , TIF_USEDFPU ) ;
release_fpu ( regs ) ;
}
preempt_enable ( ) ;
}
2007-11-22 17:30:50 +09:00
2008-09-21 19:04:55 +09:00
static inline int init_fpu ( struct task_struct * tsk )
{
if ( tsk_used_math ( tsk ) ) {
if ( ( boot_cpu_data . flags & CPU_HAS_FPU ) & & tsk = = current )
unlazy_fpu ( tsk , task_pt_regs ( tsk ) ) ;
return 0 ;
}
set_stopped_child_used_math ( tsk ) ;
return 0 ;
}
2007-11-22 17:30:50 +09:00
# endif /* __ASSEMBLY__ */
# endif /* __ASM_SH_FPU_H */