diff options
Diffstat (limited to 'arch/x86/math-emu/fpu_entry.c')
| -rw-r--r-- | arch/x86/math-emu/fpu_entry.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/arch/x86/math-emu/fpu_entry.c b/arch/x86/math-emu/fpu_entry.c index 6e38d877ea77..c7b06feb139b 100644 --- a/arch/x86/math-emu/fpu_entry.c +++ b/arch/x86/math-emu/fpu_entry.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <asm/uaccess.h> | 30 | #include <asm/uaccess.h> |
| 31 | #include <asm/desc.h> | 31 | #include <asm/desc.h> |
| 32 | #include <asm/user.h> | 32 | #include <asm/user.h> |
| 33 | #include <asm/i387.h> | ||
| 33 | 34 | ||
| 34 | #include "fpu_system.h" | 35 | #include "fpu_system.h" |
| 35 | #include "fpu_emu.h" | 36 | #include "fpu_emu.h" |
| @@ -146,6 +147,13 @@ asmlinkage void math_emulate(long arg) | |||
| 146 | unsigned long code_limit = 0; /* Initialized to stop compiler warnings */ | 147 | unsigned long code_limit = 0; /* Initialized to stop compiler warnings */ |
| 147 | struct desc_struct code_descriptor; | 148 | struct desc_struct code_descriptor; |
| 148 | 149 | ||
| 150 | if (!used_math()) { | ||
| 151 | if (init_fpu(current)) { | ||
| 152 | do_group_exit(SIGKILL); | ||
| 153 | return; | ||
| 154 | } | ||
| 155 | } | ||
| 156 | |||
| 149 | #ifdef RE_ENTRANT_CHECKING | 157 | #ifdef RE_ENTRANT_CHECKING |
| 150 | if (emulating) { | 158 | if (emulating) { |
| 151 | printk("ERROR: wm-FPU-emu is not RE-ENTRANT!\n"); | 159 | printk("ERROR: wm-FPU-emu is not RE-ENTRANT!\n"); |
| @@ -153,11 +161,6 @@ asmlinkage void math_emulate(long arg) | |||
| 153 | RE_ENTRANT_CHECK_ON; | 161 | RE_ENTRANT_CHECK_ON; |
| 154 | #endif /* RE_ENTRANT_CHECKING */ | 162 | #endif /* RE_ENTRANT_CHECKING */ |
| 155 | 163 | ||
| 156 | if (!used_math()) { | ||
| 157 | finit(); | ||
| 158 | set_used_math(); | ||
| 159 | } | ||
| 160 | |||
| 161 | SETUP_DATA_AREA(arg); | 164 | SETUP_DATA_AREA(arg); |
| 162 | 165 | ||
| 163 | FPU_ORIG_EIP = FPU_EIP; | 166 | FPU_ORIG_EIP = FPU_EIP; |
