|
@@ -48,6 +48,12 @@ enum fpu_mode {
|
|
|
#define FPU_FR_MASK 0x1
|
|
|
};
|
|
|
|
|
|
+#define __disable_fpu() \
|
|
|
+do { \
|
|
|
+ clear_c0_status(ST0_CU1); \
|
|
|
+ disable_fpu_hazard(); \
|
|
|
+} while (0)
|
|
|
+
|
|
|
static inline int __enable_fpu(enum fpu_mode mode)
|
|
|
{
|
|
|
int fr;
|
|
@@ -86,7 +92,12 @@ fr_common:
|
|
|
enable_fpu_hazard();
|
|
|
|
|
|
/* check FR has the desired value */
|
|
|
- return (!!(read_c0_status() & ST0_FR) == !!fr) ? 0 : SIGFPE;
|
|
|
+ if (!!(read_c0_status() & ST0_FR) == !!fr)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ /* unsupported FR value */
|
|
|
+ __disable_fpu();
|
|
|
+ return SIGFPE;
|
|
|
|
|
|
default:
|
|
|
BUG();
|
|
@@ -95,12 +106,6 @@ fr_common:
|
|
|
return SIGFPE;
|
|
|
}
|
|
|
|
|
|
-#define __disable_fpu() \
|
|
|
-do { \
|
|
|
- clear_c0_status(ST0_CU1); \
|
|
|
- disable_fpu_hazard(); \
|
|
|
-} while (0)
|
|
|
-
|
|
|
#define clear_fpu_owner() clear_thread_flag(TIF_USEDFPU)
|
|
|
|
|
|
static inline int __is_fpu_owner(void)
|