Changeset 6a27d63 in mainline
- Timestamp:
- 2005-05-11T21:53:09Z (20 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c884ef1
- Parents:
- 6ba143d
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/ia32/include/interrupt.h
r6ba143d r6a27d63 77 77 extern void null_interrupt(__u8 n, __u32 stack[]); 78 78 extern void gp_fault(__u8 n, __u32 stack[]); 79 extern void nm_fault(__u8 n, __u32 stack[]); 79 80 extern void page_fault(__u8 n, __u32 stack[]); 80 81 extern void syscall(__u8 n, __u32 stack[]); -
arch/ia32/src/fpu_context.c
r6ba143d r6a27d63 41 41 void fpu_context_restore(fpu_context_t *fctx) 42 42 { 43 if(THREAD==CPU->arch.fpu_owner) reset_TS_flag();44 else set_TS_flag();43 if(THREAD==CPU->arch.fpu_owner) {reset_TS_flag(); } 44 else {set_TS_flag(); ((CPU->arch).fpu_owner)->fpu_context_engaged=1;} 45 45 } 46 46 … … 48 48 void fpu_lazy_context_save(fpu_context_t *fctx) 49 49 { 50 /* 51 pushl %eax 52 mov 8(%esp),%eax 53 fxsave (%eax) 54 popl %eax 55 ret 56 */ 50 asm( 51 "mov %0,%%eax;" 52 "fxsave (%%eax);" 53 "ret;" 54 :"=m"(fctx) 55 : 56 :"%eax" 57 ); 57 58 } 58 59 59 60 void fpu_lazy_context_restore(fpu_context_t *fctx) 60 61 { 61 /* 62 pushl %eax 63 mov 8(%esp),%eax 64 fxrstor (%eax) 65 popl %eax 66 ret 67 */ 62 asm( 63 "mov %0,%%eax;" 64 "fxrstor (%%eax);" 65 "ret;" 66 :"=m"(fctx) 67 : 68 :"%eax" 69 ); 68 70 } 71 72 void fpu_init(void) 73 { 74 asm( 75 "fninit;" 76 ); 77 } 78 -
arch/ia32/src/interrupt.c
r6ba143d r6a27d63 86 86 } 87 87 88 void nm_fault(__u8 n, __u32 stack[]) 89 { 90 91 if (((CPU->arch).fpu_owner)!=NULL) 92 { 93 fpu_lazy_context_save(&(((CPU->arch).fpu_owner)->saved_fpu_context)); 94 ((CPU->arch).fpu_owner)->fpu_context_engaged=0; /* Enables migration */ 95 } 96 97 if(THREAD->fpu_context_exists) fpu_lazy_context_restore(&(THREAD->saved_fpu_context)); 98 else {fpu_init();THREAD->fpu_context_exists=1;} 99 100 (CPU->arch).fpu_owner=THREAD; 101 102 reset_TS_flag(); 103 104 // panic("#NM fault\n"); 105 } 106 107 108 88 109 void page_fault(__u8 n, __u32 stack[]) 89 110 { -
arch/ia32/src/pm.c
r6ba143d r6a27d63 121 121 } 122 122 trap_register(13, gp_fault); 123 trap_register( 7, nm_fault); 123 124 } 124 125 -
doc/TODO
r6ba143d r6a27d63 12 12 + save/restore floating point context on context switch 13 13 + [ia32] lazy context switch using TS flag 14 + [ia32] MMX,SSE1-.. initialization 14 15 + [ia32] review privilege separation 15 16 + zero IOPL in EFLAGS … … 19 20 + make emulated architectures also work on real hardware 20 21 + bring in support for other architectures (e.g. PowerPC) 22 23 -
include/fpu_context.h
r6ba143d r6a27d63 11 11 extern void fpu_lazy_context_save(fpu_context_t *); 12 12 extern void fpu_lazy_context_restore(fpu_context_t *); 13 13 extern void fpu_init(void); 14 14 15 15 -
include/proc/thread.h
r6ba143d r6a27d63 75 75 context_t sleep_timeout_context; 76 76 fpu_context_t saved_fpu_context; 77 int fpu_context_exists; 78 int fpu_context_engaged; /* Defined only if thread doesn't run. It means that fpu context is in CPU 79 that last time executes this thread. This disables migration */ 77 80 78 81 -
src/proc/scheduler.c
r6ba143d r6a27d63 268 268 list_remove(&THREAD->threads_link); 269 269 spinlock_unlock(&threads_lock); 270 271 spinlock_lock(&THREAD->cpu->lock); 272 if(THREAD->cpu->arch.fpu_owner==THREAD) THREAD->cpu->arch.fpu_owner=NULL; 273 spinlock_unlock(&THREAD->cpu->lock); 274 270 275 271 276 free(THREAD); … … 428 433 * We don't want to steal CPU-wired threads neither threads already stolen. 429 434 * The latter prevents threads from migrating between CPU's without ever being run. 430 */ 435 * We don't want to steal threads whose FPU context is still in CPU 436 */ 431 437 spinlock_lock(&t->lock); 432 if ( !(t->flags & (X_WIRED | X_STOLEN))) {438 if ( (!(t->flags & (X_WIRED | X_STOLEN))) && (!(t->fpu_context_engaged)) ) { 433 439 /* 434 440 * Remove t from r. -
src/proc/thread.c
r6ba143d r6a27d63 190 190 t->task = task; 191 191 192 t->fpu_context_exists=0; 193 t->fpu_context_engaged=0; 194 192 195 /* 193 196 * Register this thread in the system-wide list.
Note:
See TracChangeset
for help on using the changeset viewer.