diff options
Diffstat (limited to 'include/asm-mips/fpu.h')
-rw-r--r-- | include/asm-mips/fpu.h | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/include/asm-mips/fpu.h b/include/asm-mips/fpu.h index efef843b93f0..b414a7d9db43 100644 --- a/include/asm-mips/fpu.h +++ b/include/asm-mips/fpu.h | |||
@@ -27,11 +27,11 @@ | |||
27 | struct sigcontext; | 27 | struct sigcontext; |
28 | struct sigcontext32; | 28 | struct sigcontext32; |
29 | 29 | ||
30 | extern asmlinkage int (*save_fp_context)(struct sigcontext *sc); | 30 | extern asmlinkage int (*save_fp_context)(struct sigcontext __user *sc); |
31 | extern asmlinkage int (*restore_fp_context)(struct sigcontext *sc); | 31 | extern asmlinkage int (*restore_fp_context)(struct sigcontext __user *sc); |
32 | 32 | ||
33 | extern asmlinkage int (*save_fp_context32)(struct sigcontext32 *sc); | 33 | extern asmlinkage int (*save_fp_context32)(struct sigcontext32 __user *sc); |
34 | extern asmlinkage int (*restore_fp_context32)(struct sigcontext32 *sc); | 34 | extern asmlinkage int (*restore_fp_context32)(struct sigcontext32 __user *sc); |
35 | 35 | ||
36 | extern void fpu_emulator_init_fpu(void); | 36 | extern void fpu_emulator_init_fpu(void); |
37 | extern void _init_fpu(void); | 37 | extern void _init_fpu(void); |
@@ -93,31 +93,52 @@ static inline int is_fpu_owner(void) | |||
93 | return cpu_has_fpu && __is_fpu_owner(); | 93 | return cpu_has_fpu && __is_fpu_owner(); |
94 | } | 94 | } |
95 | 95 | ||
96 | static inline void own_fpu(void) | 96 | static inline void __own_fpu(void) |
97 | { | 97 | { |
98 | if (cpu_has_fpu) { | 98 | __enable_fpu(); |
99 | __enable_fpu(); | 99 | KSTK_STATUS(current) |= ST0_CU1; |
100 | KSTK_STATUS(current) |= ST0_CU1; | 100 | set_thread_flag(TIF_USEDFPU); |
101 | set_thread_flag(TIF_USEDFPU); | 101 | } |
102 | |||
103 | static inline void own_fpu_inatomic(int restore) | ||
104 | { | ||
105 | if (cpu_has_fpu && !__is_fpu_owner()) { | ||
106 | __own_fpu(); | ||
107 | if (restore) | ||
108 | _restore_fp(current); | ||
102 | } | 109 | } |
103 | } | 110 | } |
104 | 111 | ||
105 | static inline void lose_fpu(void) | 112 | static inline void own_fpu(int restore) |
106 | { | 113 | { |
107 | if (cpu_has_fpu) { | 114 | preempt_disable(); |
115 | own_fpu_inatomic(restore); | ||
116 | preempt_enable(); | ||
117 | } | ||
118 | |||
119 | static inline void lose_fpu(int save) | ||
120 | { | ||
121 | preempt_disable(); | ||
122 | if (is_fpu_owner()) { | ||
123 | if (save) | ||
124 | _save_fp(current); | ||
108 | KSTK_STATUS(current) &= ~ST0_CU1; | 125 | KSTK_STATUS(current) &= ~ST0_CU1; |
109 | clear_thread_flag(TIF_USEDFPU); | 126 | clear_thread_flag(TIF_USEDFPU); |
110 | __disable_fpu(); | 127 | __disable_fpu(); |
111 | } | 128 | } |
129 | preempt_enable(); | ||
112 | } | 130 | } |
113 | 131 | ||
114 | static inline void init_fpu(void) | 132 | static inline void init_fpu(void) |
115 | { | 133 | { |
134 | preempt_disable(); | ||
116 | if (cpu_has_fpu) { | 135 | if (cpu_has_fpu) { |
136 | __own_fpu(); | ||
117 | _init_fpu(); | 137 | _init_fpu(); |
118 | } else { | 138 | } else { |
119 | fpu_emulator_init_fpu(); | 139 | fpu_emulator_init_fpu(); |
120 | } | 140 | } |
141 | preempt_enable(); | ||
121 | } | 142 | } |
122 | 143 | ||
123 | static inline void save_fp(struct task_struct *tsk) | 144 | static inline void save_fp(struct task_struct *tsk) |