From bbd999a00eb4859576db2422ceefc0ebf6d721e5 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Mon, 16 May 2011 14:34:11 -0700 Subject: [sim,pk] cleanups & initial virtual memory support --- pk/file.c | 2 +- pk/fp.c | 2 +- pk/frontend.c | 2 +- pk/handlers.c | 20 +++++++++++--------- pk/pcr.h | 4 ++-- 5 files changed, 16 insertions(+), 14 deletions(-) (limited to 'pk') diff --git a/pk/file.c b/pk/file.c index ff18fce..3a465ad 100644 --- a/pk/file.c +++ b/pk/file.c @@ -128,7 +128,7 @@ sysret_t file_write(file_t* f, const char* buf, size_t size) if(f->kfd == 1 || f->kfd == 2) { for(size_t i = 0; i < size; i++) - mtpcr(buf[i],PCR_CONSOLE); + mtpcr(PCR_CONSOLE,buf[i]); } return frontend_syscall(SYS_write,f->kfd,(long)buf,size,0); diff --git a/pk/fp.c b/pk/fp.c index 5cda98c..7cc929b 100644 --- a/pk/fp.c +++ b/pk/fp.c @@ -256,7 +256,7 @@ get_fp_reg(unsigned int which, unsigned int dp) void init_fp(trapframe_t* tf) { long sr = mfpcr(PCR_SR); - mtpcr(sr | SR_EF, PCR_SR); + mtpcr(PCR_SR, sr | SR_EF); put_fp_state(fp_state.fpr,fp_state.fsr); diff --git a/pk/frontend.c b/pk/frontend.c index 1cb99db..90609d8 100644 --- a/pk/frontend.c +++ b/pk/frontend.c @@ -19,7 +19,7 @@ sysret_t frontend_syscall(long n, long a0, long a1, long a2, long a3) asm volatile ("cflush; fence"); - mtpcr(magic_mem,PCR_TOHOST); + mtpcr(PCR_TOHOST, magic_mem); while(mfpcr(PCR_FROMHOST) == 0); sysret_t ret = {magic_mem[0],magic_mem[1]}; diff --git a/pk/handlers.c b/pk/handlers.c index c9b6a96..3634135 100644 --- a/pk/handlers.c +++ b/pk/handlers.c @@ -4,14 +4,6 @@ int have_fp = 1; // initialized to 1 because it can't be in the .bss section! int have_vector = 1; -static void handle_fp_disabled(trapframe_t* tf) -{ - irq_enable(); - - kassert(have_fp); - init_fp(tf); -} - static void handle_vector_disabled(trapframe_t* tf) { if (have_vector) @@ -42,6 +34,16 @@ static void handle_illegal_instruction(trapframe_t* tf) panic("An illegal instruction was executed!"); } +static void handle_fp_disabled(trapframe_t* tf) +{ + irq_enable(); + + if(have_fp && !(mfpcr(PCR_SR) & SR_EF)) + init_fp(tf); + else + handle_illegal_instruction(tf); +} + static void handle_breakpoint(trapframe_t* tf) { dump_tf(tf); @@ -92,7 +94,7 @@ static void handle_bad_interrupt(trapframe_t* tf, int interrupt) static void handle_timer_interrupt(trapframe_t* tf) { - mtpcr(mfpcr(PCR_COMPARE)+TIMER_PERIOD,PCR_COMPARE); + mtpcr(PCR_COMPARE, mfpcr(PCR_COMPARE)+TIMER_PERIOD); } static void handle_interrupt(trapframe_t* tf) diff --git a/pk/pcr.h b/pk/pcr.h index e9643ae..cf3f817 100644 --- a/pk/pcr.h +++ b/pk/pcr.h @@ -60,14 +60,14 @@ #ifndef __ASSEMBLER__ -#define mtpcr(val,reg) ({ long __tmp = (long)(val); \ +#define mtpcr(reg,val) ({ long __tmp = (long)(val); \ asm volatile ("mtpcr %0,$cr%1"::"r"(__tmp),"i"(reg)); }) #define mfpcr(reg) ({ long __tmp; \ asm volatile ("mfpcr %0,$cr%1" : "=r"(__tmp) : "i"(reg)); \ __tmp; }) -#define mtcr(val,reg) ({ long __tmp = (long)(val); \ +#define mtcr(reg,val) ({ long __tmp = (long)(val); \ asm volatile ("mtcr %0,$cr%1"::"r"(__tmp),"i"(reg)); }) #define mfcr(reg) ({ long __tmp; \ -- cgit v1.1