Subversion Repositories HelenOS-historic

Rev

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
             */