![Vineet Gupta](/assets/img/avatar_default.png)
Only a couple of arches (sh/x86) use fpu_counter in task_struct so it can be moved out into ARCH specific thread_struct, reducing the size of task_struct for other arches. Compile tested sh defconfig + sh4-linux-gcc (4.6.3) Signed-off-by: Vineet Gupta <vgupta@synopsys.com> Cc: Paul Mundt <paul.mundt@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
72 lines
1.7 KiB
C
72 lines
1.7 KiB
C
#ifndef __ASM_SH_FPU_H
|
|
#define __ASM_SH_FPU_H
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
struct task_struct;
|
|
|
|
#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;
|
|
}
|
|
|
|
extern void save_fpu(struct task_struct *__tsk);
|
|
extern void restore_fpu(struct task_struct *__tsk);
|
|
extern void fpu_state_restore(struct pt_regs *regs);
|
|
extern void __fpu_state_restore(void);
|
|
#else
|
|
#define save_fpu(tsk) do { } while (0)
|
|
#define restore_fpu(tsk) do { } while (0)
|
|
#define release_fpu(regs) do { } while (0)
|
|
#define grab_fpu(regs) do { } while (0)
|
|
#define fpu_state_restore(regs) do { } while (0)
|
|
#define __fpu_state_restore(regs) do { } while (0)
|
|
#endif
|
|
|
|
struct user_regset;
|
|
|
|
extern int do_fpu_inst(unsigned short, struct pt_regs *);
|
|
extern int init_fpu(struct task_struct *);
|
|
|
|
extern int fpregs_get(struct task_struct *target,
|
|
const struct user_regset *regset,
|
|
unsigned int pos, unsigned int count,
|
|
void *kbuf, void __user *ubuf);
|
|
|
|
static inline void __unlazy_fpu(struct task_struct *tsk, struct pt_regs *regs)
|
|
{
|
|
if (task_thread_info(tsk)->status & TS_USEDFPU) {
|
|
task_thread_info(tsk)->status &= ~TS_USEDFPU;
|
|
save_fpu(tsk);
|
|
release_fpu(regs);
|
|
} else
|
|
tsk->thread.fpu_counter = 0;
|
|
}
|
|
|
|
static inline void unlazy_fpu(struct task_struct *tsk, struct pt_regs *regs)
|
|
{
|
|
preempt_disable();
|
|
__unlazy_fpu(tsk, regs);
|
|
preempt_enable();
|
|
}
|
|
|
|
static inline void clear_fpu(struct task_struct *tsk, struct pt_regs *regs)
|
|
{
|
|
preempt_disable();
|
|
if (task_thread_info(tsk)->status & TS_USEDFPU) {
|
|
task_thread_info(tsk)->status &= ~TS_USEDFPU;
|
|
release_fpu(regs);
|
|
}
|
|
preempt_enable();
|
|
}
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
#endif /* __ASM_SH_FPU_H */
|