/SPARTAN/trunk/arch/amd64/include/cpu.h |
---|
51,8 → 51,6 |
}; |
extern void set_TS_flag(void); |
extern void reset_TS_flag(void); |
extern void set_efer_flag(int flag); |
extern __u64 read_efer_flag(void); |
void cpu_setup_fpu(void); |
/SPARTAN/trunk/arch/amd64/Makefile.inc |
---|
10,7 → 10,7 |
BFD_NAME=elf64-x86-64 |
BFD_ARCH=i386:x86-64 |
DEFS=-DARCH=$(ARCH) |
DEFS=-DARCH=$(ARCH) -DFPU_LAZY |
ifdef SMP |
DEFS+=-D$(SMP) |
/SPARTAN/trunk/arch/amd64/src/fpu_context.c |
---|
33,20 → 33,7 |
void fpu_context_save(fpu_context_t *fctx) |
{ |
} |
void fpu_context_restore(fpu_context_t *fctx) |
{ |
if(THREAD==CPU->fpu_owner) |
reset_TS_flag(); |
else |
set_TS_flag(); |
} |
void fpu_lazy_context_save(fpu_context_t *fctx) |
{ |
/* TODO: We need malloc that allocates on 16-byte boundary !! */ |
/* Align on 16-byte boundary */ |
if (((__u64)fctx) & 0xf) |
fctx = (fpu_context_t *)((((__u64)fctx) | 0xf) + 1); |
56,7 → 43,7 |
); |
} |
void fpu_lazy_context_restore(fpu_context_t *fctx) |
void fpu_context_restore(fpu_context_t *fctx) |
{ |
/* TODO: We need malloc that allocates on 16-byte boundary !! */ |
if (((__u64)fctx) & 0xf) |
/SPARTAN/trunk/arch/amd64/src/cpu/cpu.c |
---|
90,7 → 90,7 |
* does a lazy fpu context switch. |
* |
*/ |
void set_TS_flag(void) |
void fpu_disable(void) |
{ |
__asm__ volatile ( |
"mov %%cr0,%%rax;" |
102,7 → 102,7 |
); |
} |
void reset_TS_flag(void) |
void fpu_enable(void) |
{ |
__asm__ volatile ( |
"mov %%cr0,%%rax;" |
/SPARTAN/trunk/arch/amd64/src/interrupt.c |
---|
38,9 → 38,9 |
#include <arch.h> |
#include <symtab.h> |
#include <arch/asm.h> |
#include <proc/scheduler.h> |
static void messy_stack_trace(__native *stack) |
{ |
__native *upper_limit = (__native *)(((__native)get_stack_base()) + STACK_SIZE); |
138,20 → 138,11 |
void nm_fault(__u8 n, __native stack[]) |
{ |
reset_TS_flag(); |
if (CPU->fpu_owner != NULL) { |
fpu_lazy_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_lazy_context_restore(&THREAD->saved_fpu_context); |
else { |
fpu_init(); |
THREAD->fpu_context_exists=1; |
} |
CPU->fpu_owner=THREAD; |
THREAD->fpu_context_engaged = 1; |
#ifdef FPU_LAZY |
scheduler_fpu_lazy_request(); |
#else |
panic("fpu fault"); |
#endif |
} |