diff options
author | Andrew Waterman <waterman@s144.Millennium.Berkeley.EDU> | 2010-10-15 17:51:37 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@s144.Millennium.Berkeley.EDU> | 2010-10-15 17:51:37 -0700 |
commit | b4fd490d689415205cf315c02f673b9386ece337 (patch) | |
tree | 73f93d81b6241b1d1204d7add68af065f9638ea9 /pk/handlers.c | |
parent | 2b7fd5fa6ac24f3d6d6cb8f0d6c1c32b85c39f02 (diff) | |
download | riscv-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.c | 16 |
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!"); } |