Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 306 → Rev 309

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