Rev 1854 | Rev 1888 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1854 | Rev 1882 | ||
---|---|---|---|
Line 84... | Line 84... | ||
84 | */ |
84 | */ |
85 | void before_thread_runs(void) |
85 | void before_thread_runs(void) |
86 | { |
86 | { |
87 | before_thread_runs_arch(); |
87 | before_thread_runs_arch(); |
88 | #ifdef CONFIG_FPU_LAZY |
88 | #ifdef CONFIG_FPU_LAZY |
89 | if(THREAD==CPU->fpu_owner) |
89 | if(THREAD == CPU->fpu_owner) |
90 | fpu_enable(); |
90 | fpu_enable(); |
91 | else |
91 | else |
92 | fpu_disable(); |
92 | fpu_disable(); |
93 | #else |
93 | #else |
94 | fpu_enable(); |
94 | fpu_enable(); |
95 | if (THREAD->fpu_context_exists) |
95 | if (THREAD->fpu_context_exists) |
96 | fpu_context_restore(THREAD->saved_fpu_context); |
96 | fpu_context_restore(THREAD->saved_fpu_context); |
97 | else { |
97 | else { |
98 | fpu_init(); |
98 | fpu_init(); |
99 | THREAD->fpu_context_exists=1; |
99 | THREAD->fpu_context_exists = 1; |
100 | } |
100 | } |
101 | #endif |
101 | #endif |
102 | } |
102 | } |
103 | 103 | ||
104 | /** Take actions after THREAD had run. |
104 | /** Take actions after THREAD had run. |
Line 125... | Line 125... | ||
125 | /* Save old context */ |
125 | /* Save old context */ |
126 | if (CPU->fpu_owner != NULL) { |
126 | if (CPU->fpu_owner != NULL) { |
127 | spinlock_lock(&CPU->fpu_owner->lock); |
127 | spinlock_lock(&CPU->fpu_owner->lock); |
128 | fpu_context_save(CPU->fpu_owner->saved_fpu_context); |
128 | fpu_context_save(CPU->fpu_owner->saved_fpu_context); |
129 | /* don't prevent migration */ |
129 | /* don't prevent migration */ |
130 | CPU->fpu_owner->fpu_context_engaged=0; |
130 | CPU->fpu_owner->fpu_context_engaged = 0; |
131 | spinlock_unlock(&CPU->fpu_owner->lock); |
131 | spinlock_unlock(&CPU->fpu_owner->lock); |
132 | CPU->fpu_owner = NULL; |
132 | CPU->fpu_owner = NULL; |
133 | } |
133 | } |
134 | 134 | ||
135 | spinlock_lock(&THREAD->lock); |
135 | spinlock_lock(&THREAD->lock); |
Line 144... | Line 144... | ||
144 | THREAD->saved_fpu_context = slab_alloc(fpu_context_slab, 0); |
144 | THREAD->saved_fpu_context = slab_alloc(fpu_context_slab, 0); |
145 | /* We may have switched CPUs during slab_alloc */ |
145 | /* We may have switched CPUs during slab_alloc */ |
146 | goto restart; |
146 | goto restart; |
147 | } |
147 | } |
148 | fpu_init(); |
148 | fpu_init(); |
149 | THREAD->fpu_context_exists=1; |
149 | THREAD->fpu_context_exists = 1; |
150 | } |
150 | } |
151 | CPU->fpu_owner=THREAD; |
151 | CPU->fpu_owner = THREAD; |
152 | THREAD->fpu_context_engaged = 1; |
152 | THREAD->fpu_context_engaged = 1; |
153 | spinlock_unlock(&THREAD->lock); |
153 | spinlock_unlock(&THREAD->lock); |
154 | 154 | ||
155 | spinlock_unlock(&CPU->lock); |
155 | spinlock_unlock(&CPU->lock); |
156 | } |
156 | } |