diff options
Diffstat (limited to 'arch/x86/kernel/process.c')
-rw-r--r-- | arch/x86/kernel/process.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index b7e1e0e53987..1219fe2be8f3 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
@@ -87,6 +87,16 @@ void arch_task_cache_init(void) | |||
87 | SLAB_PANIC | SLAB_NOTRACK, NULL); | 87 | SLAB_PANIC | SLAB_NOTRACK, NULL); |
88 | } | 88 | } |
89 | 89 | ||
90 | static inline void drop_fpu(struct task_struct *tsk) | ||
91 | { | ||
92 | /* | ||
93 | * Forget coprocessor state.. | ||
94 | */ | ||
95 | tsk->fpu_counter = 0; | ||
96 | clear_fpu(tsk); | ||
97 | clear_used_math(); | ||
98 | } | ||
99 | |||
90 | /* | 100 | /* |
91 | * Free current thread data structures etc.. | 101 | * Free current thread data structures etc.. |
92 | */ | 102 | */ |
@@ -109,6 +119,8 @@ void exit_thread(void) | |||
109 | put_cpu(); | 119 | put_cpu(); |
110 | kfree(bp); | 120 | kfree(bp); |
111 | } | 121 | } |
122 | |||
123 | drop_fpu(me); | ||
112 | } | 124 | } |
113 | 125 | ||
114 | void show_regs(struct pt_regs *regs) | 126 | void show_regs(struct pt_regs *regs) |
@@ -149,12 +161,7 @@ void flush_thread(void) | |||
149 | 161 | ||
150 | flush_ptrace_hw_breakpoint(tsk); | 162 | flush_ptrace_hw_breakpoint(tsk); |
151 | memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array)); | 163 | memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array)); |
152 | /* | 164 | drop_fpu(tsk); |
153 | * Forget coprocessor state.. | ||
154 | */ | ||
155 | tsk->fpu_counter = 0; | ||
156 | clear_fpu(tsk); | ||
157 | clear_used_math(); | ||
158 | } | 165 | } |
159 | 166 | ||
160 | static void hard_disable_TSC(void) | 167 | static void hard_disable_TSC(void) |