60,10 → 60,42 |
*/ |
void before_thread_runs(void) |
{ |
before_thread_runs_arch(); |
fpu_context_restore(&(THREAD->saved_fpu_context)); |
before_thread_runs_arch(); |
#ifdef FPU_LAZY |
if(THREAD==CPU->fpu_owner) |
fpu_enable(); |
else |
fpu_disable(); |
#else |
fpu_enable(); |
if (THREAD->fpu_context_exists) |
fpu_context_restore(&(THREAD->saved_fpu_context)); |
else { |
fpu_init(); |
THREAD->fpu_context_exists=1; |
} |
#endif |
} |
|
#ifdef FPU_LAZY |
void scheduler_fpu_lazy_request(void) |
{ |
fpu_enable(); |
if (CPU->fpu_owner != NULL) { |
fpu_context_save(&CPU->fpu_owner->saved_fpu_context); |
/* don't prevent migration */ |
CPU->fpu_owner->fpu_context_engaged=0; |
} |
if (THREAD->fpu_context_exists) |
fpu_context_restore(&THREAD->saved_fpu_context); |
else { |
fpu_init(); |
THREAD->fpu_context_exists=1; |
} |
CPU->fpu_owner=THREAD; |
THREAD->fpu_context_engaged = 1; |
} |
#endif |
|
/** Initialize scheduler |
* |
240,7 → 272,9 |
|
if (THREAD) { |
spinlock_lock(&THREAD->lock); |
#ifndef FPU_LAZY |
fpu_context_save(&(THREAD->saved_fpu_context)); |
#endif |
if (!context_save(&THREAD->saved_context)) { |
/* |
* This is the place where threads leave scheduler(); |