Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 72 → Rev 73

/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());