aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/vfp/vfpmodule.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c
index 08ff93fa533c..0a96f71f0abd 100644
--- a/arch/arm/vfp/vfpmodule.c
+++ b/arch/arm/vfp/vfpmodule.c
@@ -89,24 +89,27 @@ static void vfp_thread_flush(struct thread_info *thread)
89 union vfp_state *vfp = &thread->vfpstate; 89 union vfp_state *vfp = &thread->vfpstate;
90 unsigned int cpu; 90 unsigned int cpu;
91 91
92 memset(vfp, 0, sizeof(union vfp_state));
93
94 vfp->hard.fpexc = FPEXC_EN;
95 vfp->hard.fpscr = FPSCR_ROUND_NEAREST;
96#ifdef CONFIG_SMP
97 vfp->hard.cpu = NR_CPUS;
98#endif
99
100 /* 92 /*
101 * Disable VFP to ensure we initialize it first. We must ensure 93 * Disable VFP to ensure we initialize it first. We must ensure
102 * that the modification of vfp_current_hw_state[] and hardware disable 94 * that the modification of vfp_current_hw_state[] and hardware
103 * are done for the same CPU and without preemption. 95 * disable are done for the same CPU and without preemption.
96 *
97 * Do this first to ensure that preemption won't overwrite our
98 * state saving should access to the VFP be enabled at this point.
104 */ 99 */
105 cpu = get_cpu(); 100 cpu = get_cpu();
106 if (vfp_current_hw_state[cpu] == vfp) 101 if (vfp_current_hw_state[cpu] == vfp)
107 vfp_current_hw_state[cpu] = NULL; 102 vfp_current_hw_state[cpu] = NULL;
108 fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_EN); 103 fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_EN);
109 put_cpu(); 104 put_cpu();
105
106 memset(vfp, 0, sizeof(union vfp_state));
107
108 vfp->hard.fpexc = FPEXC_EN;
109 vfp->hard.fpscr = FPSCR_ROUND_NEAREST;
110#ifdef CONFIG_SMP
111 vfp->hard.cpu = NR_CPUS;
112#endif
110} 113}
111 114
112static void vfp_thread_exit(struct thread_info *thread) 115static void vfp_thread_exit(struct thread_info *thread)