aboutsummaryrefslogtreecommitdiff
path: root/pk/handlers.c
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@s144.Millennium.Berkeley.EDU>2010-10-15 17:51:37 -0700
committerAndrew Waterman <waterman@s144.Millennium.Berkeley.EDU>2010-10-15 17:51:37 -0700
commitb4fd490d689415205cf315c02f673b9386ece337 (patch)
tree73f93d81b6241b1d1204d7add68af065f9638ea9 /pk/handlers.c
parent2b7fd5fa6ac24f3d6d6cb8f0d6c1c32b85c39f02 (diff)
downloadriscv-pk-b4fd490d689415205cf315c02f673b9386ece337.zip
riscv-pk-b4fd490d689415205cf315c02f673b9386ece337.tar.gz
riscv-pk-b4fd490d689415205cf315c02f673b9386ece337.tar.bz2
[pk, sim] added FPU emulation support to proxy kernel
Diffstat (limited to 'pk/handlers.c')
-rw-r--r--pk/handlers.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/pk/handlers.c b/pk/handlers.c
index 38745bf..7eee536 100644
--- a/pk/handlers.c
+++ b/pk/handlers.c
@@ -1,6 +1,8 @@
#include "pcr.h"
#include "pk.h"
+int have_fp = 1;
+
void handle_breakpoint(trapframe_t* tf)
{
printk("Breakpoint\n");
@@ -10,7 +12,16 @@ void handle_breakpoint(trapframe_t* tf)
void handle_fp_disabled(trapframe_t* tf)
{
- tf->sr |= SR_EF;
+ if(have_fp)
+ tf->sr |= SR_EF;
+ else
+ {
+ if(emulate_fp(tf) != 0)
+ {
+ dump_tf(tf);
+ panic("FPU emulation failed!");
+ }
+ }
}
void handle_badtrap(trapframe_t* tf)
@@ -27,6 +38,9 @@ void handle_privileged_instruction(trapframe_t* tf)
void handle_illegal_instruction(trapframe_t* tf)
{
+ if(emulate_fp(tf) == 0)
+ return;
+
dump_tf(tf);
panic("An illegal instruction was executed!");
}