Rev 906 | Rev 1007 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 906 | Rev 907 | ||
|---|---|---|---|
| Line 94... | Line 94... | ||
| 94 | } |
94 | } |
| 95 | 95 | ||
| 96 | #ifdef CONFIG_FPU_LAZY |
96 | #ifdef CONFIG_FPU_LAZY |
| 97 | void scheduler_fpu_lazy_request(void) |
97 | void scheduler_fpu_lazy_request(void) |
| 98 | { |
98 | { |
| - | 99 | restart: |
|
| 99 | fpu_enable(); |
100 | fpu_enable(); |
| 100 | spinlock_lock(&CPU->lock); |
101 | spinlock_lock(&CPU->lock); |
| 101 | 102 | ||
| 102 | /* Save old context */ |
103 | /* Save old context */ |
| 103 | if (CPU->fpu_owner != NULL) { |
104 | if (CPU->fpu_owner != NULL) { |
| 104 | spinlock_lock(&CPU->fpu_owner->lock); |
105 | spinlock_lock(&CPU->fpu_owner->lock); |
| 105 | fpu_context_save(CPU->fpu_owner->saved_fpu_context); |
106 | fpu_context_save(CPU->fpu_owner->saved_fpu_context); |
| 106 | /* don't prevent migration */ |
107 | /* don't prevent migration */ |
| 107 | CPU->fpu_owner->fpu_context_engaged=0; |
108 | CPU->fpu_owner->fpu_context_engaged=0; |
| 108 | spinlock_unlock(&CPU->fpu_owner->lock); |
109 | spinlock_unlock(&CPU->fpu_owner->lock); |
| - | 110 | CPU->fpu_owner = NULL; |
|
| 109 | } |
111 | } |
| 110 | 112 | ||
| 111 | spinlock_lock(&THREAD->lock); |
113 | spinlock_lock(&THREAD->lock); |
| 112 | if (THREAD->fpu_context_exists) { |
114 | if (THREAD->fpu_context_exists) { |
| 113 | fpu_context_restore(THREAD->saved_fpu_context); |
115 | fpu_context_restore(THREAD->saved_fpu_context); |
| 114 | } else { |
116 | } else { |
| 115 | /* Allocate FPU context */ |
117 | /* Allocate FPU context */ |
| 116 | if (!THREAD->saved_fpu_context) { |
118 | if (!THREAD->saved_fpu_context) { |
| 117 | /* Might sleep */ |
119 | /* Might sleep */ |
| 118 | spinlock_unlock(&THREAD->lock); |
120 | spinlock_unlock(&THREAD->lock); |
| - | 121 | spinlock_unlock(&CPU->lock); |
|
| 119 | THREAD->saved_fpu_context = slab_alloc(fpu_context_slab, |
122 | THREAD->saved_fpu_context = slab_alloc(fpu_context_slab, |
| 120 | 0); |
123 | 0); |
| 121 | spinlock_lock(&THREAD->lock); |
124 | /* We may have switched CPUs during slab_alloc */ |
| - | 125 | goto restart; |
|
| 122 | } |
126 | } |
| 123 | fpu_init(); |
127 | fpu_init(); |
| 124 | THREAD->fpu_context_exists=1; |
128 | THREAD->fpu_context_exists=1; |
| 125 | } |
129 | } |
| 126 | CPU->fpu_owner=THREAD; |
130 | CPU->fpu_owner=THREAD; |