Rev 898 | Rev 907 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 898 | Rev 906 | ||
---|---|---|---|
Line 69... | Line 69... | ||
69 | else |
69 | else |
70 | fpu_disable(); |
70 | fpu_disable(); |
71 | #else |
71 | #else |
72 | fpu_enable(); |
72 | fpu_enable(); |
73 | if (THREAD->fpu_context_exists) |
73 | if (THREAD->fpu_context_exists) |
74 | fpu_context_restore(&(THREAD->saved_fpu_context)); |
74 | fpu_context_restore(THREAD->saved_fpu_context); |
75 | else { |
75 | else { |
76 | fpu_init(&(THREAD->saved_fpu_context)); |
76 | fpu_init(); |
77 | THREAD->fpu_context_exists=1; |
77 | THREAD->fpu_context_exists=1; |
78 | } |
78 | } |
79 | #endif |
79 | #endif |
80 | } |
80 | } |
81 | 81 | ||
Line 100... | Line 100... | ||
100 | spinlock_lock(&CPU->lock); |
100 | spinlock_lock(&CPU->lock); |
101 | 101 | ||
102 | /* Save old context */ |
102 | /* Save old context */ |
103 | if (CPU->fpu_owner != NULL) { |
103 | if (CPU->fpu_owner != NULL) { |
104 | spinlock_lock(&CPU->fpu_owner->lock); |
104 | spinlock_lock(&CPU->fpu_owner->lock); |
105 | fpu_context_save(&CPU->fpu_owner->saved_fpu_context); |
105 | fpu_context_save(CPU->fpu_owner->saved_fpu_context); |
106 | /* don't prevent migration */ |
106 | /* don't prevent migration */ |
107 | CPU->fpu_owner->fpu_context_engaged=0; |
107 | CPU->fpu_owner->fpu_context_engaged=0; |
108 | spinlock_unlock(&CPU->fpu_owner->lock); |
108 | spinlock_unlock(&CPU->fpu_owner->lock); |
109 | } |
109 | } |
110 | 110 | ||
111 | spinlock_lock(&THREAD->lock); |
111 | spinlock_lock(&THREAD->lock); |
112 | if (THREAD->fpu_context_exists) { |
112 | if (THREAD->fpu_context_exists) { |
113 | fpu_context_restore(&THREAD->saved_fpu_context); |
113 | fpu_context_restore(THREAD->saved_fpu_context); |
114 | } else { |
114 | } else { |
- | 115 | /* Allocate FPU context */ |
|
115 | fpu_init(&(THREAD->saved_fpu_context)); |
116 | if (!THREAD->saved_fpu_context) { |
- | 117 | /* Might sleep */ |
|
- | 118 | spinlock_unlock(&THREAD->lock); |
|
- | 119 | THREAD->saved_fpu_context = slab_alloc(fpu_context_slab, |
|
- | 120 | 0); |
|
- | 121 | spinlock_lock(&THREAD->lock); |
|
- | 122 | } |
|
- | 123 | fpu_init(); |
|
116 | THREAD->fpu_context_exists=1; |
124 | THREAD->fpu_context_exists=1; |
117 | } |
125 | } |
118 | CPU->fpu_owner=THREAD; |
126 | CPU->fpu_owner=THREAD; |
119 | THREAD->fpu_context_engaged = 1; |
127 | THREAD->fpu_context_engaged = 1; |
120 | spinlock_unlock(&THREAD->lock); |
128 | spinlock_unlock(&THREAD->lock); |
Line 273... | Line 281... | ||
273 | halt(); |
281 | halt(); |
274 | 282 | ||
275 | if (THREAD) { |
283 | if (THREAD) { |
276 | spinlock_lock(&THREAD->lock); |
284 | spinlock_lock(&THREAD->lock); |
277 | #ifndef CONFIG_FPU_LAZY |
285 | #ifndef CONFIG_FPU_LAZY |
278 | fpu_context_save(&(THREAD->saved_fpu_context)); |
286 | fpu_context_save(THREAD->saved_fpu_context); |
279 | #endif |
287 | #endif |
280 | if (!context_save(&THREAD->saved_context)) { |
288 | if (!context_save(&THREAD->saved_context)) { |
281 | /* |
289 | /* |
282 | * This is the place where threads leave scheduler(); |
290 | * This is the place where threads leave scheduler(); |
283 | */ |
291 | */ |