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) |
