/SPARTAN/trunk/arch/ia32/src/fpu_context.c |
---|
40,29 → 40,39 |
void fpu_context_restore(fpu_context_t *fctx) |
{ |
if(THREAD==CPU->arch.fpu_owner) reset_TS_flag(); |
else set_TS_flag(); |
if(THREAD==CPU->arch.fpu_owner) {reset_TS_flag(); } |
else {set_TS_flag(); ((CPU->arch).fpu_owner)->fpu_context_engaged=1;} |
} |
void fpu_lazy_context_save(fpu_context_t *fctx) |
{ |
/* |
pushl %eax |
mov 8(%esp),%eax |
fxsave (%eax) |
popl %eax |
ret |
*/ |
asm( |
"mov %0,%%eax;" |
"fxsave (%%eax);" |
"ret;" |
:"=m"(fctx) |
: |
:"%eax" |
); |
} |
void fpu_lazy_context_restore(fpu_context_t *fctx) |
{ |
/* |
pushl %eax |
mov 8(%esp),%eax |
fxrstor (%eax) |
popl %eax |
ret |
*/ |
asm( |
"mov %0,%%eax;" |
"fxrstor (%%eax);" |
"ret;" |
:"=m"(fctx) |
: |
:"%eax" |
); |
} |
void fpu_init(void) |
{ |
asm( |
"fninit;" |
); |
} |
/SPARTAN/trunk/arch/ia32/src/pm.c |
---|
120,6 → 120,7 |
trap_register(i, null_interrupt); |
} |
trap_register(13, gp_fault); |
trap_register( 7, nm_fault); |
} |
/SPARTAN/trunk/arch/ia32/src/interrupt.c |
---|
85,6 → 85,27 |
panic("general protection fault\n"); |
} |
void nm_fault(__u8 n, __u32 stack[]) |
{ |
if (((CPU->arch).fpu_owner)!=NULL) |
{ |
fpu_lazy_context_save(&(((CPU->arch).fpu_owner)->saved_fpu_context)); |
((CPU->arch).fpu_owner)->fpu_context_engaged=0; /* Enables migration */ |
} |
if(THREAD->fpu_context_exists) fpu_lazy_context_restore(&(THREAD->saved_fpu_context)); |
else {fpu_init();THREAD->fpu_context_exists=1;} |
(CPU->arch).fpu_owner=THREAD; |
reset_TS_flag(); |
// panic("#NM fault\n"); |
} |
void page_fault(__u8 n, __u32 stack[]) |
{ |
printf("page fault address: %X\n", cpu_read_cr2()); |