aboutsummaryrefslogtreecommitdiff
path: root/pk/handlers.c
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2015-06-24 14:13:08 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2015-06-24 14:14:01 -0700
commit027ba300cbeaa425218fd472e1fcf45c785f645c (patch)
tree4b4e42b54abf1d7137e5aa099d44319673b7269d /pk/handlers.c
parent621793b43ae825188af584e5789ade2e2527c9f8 (diff)
downloadriscv-pk-027ba300cbeaa425218fd472e1fcf45c785f645c.zip
riscv-pk-027ba300cbeaa425218fd472e1fcf45c785f645c.tar.gz
riscv-pk-027ba300cbeaa425218fd472e1fcf45c785f645c.tar.bz2
Use sbadaddr (not sepc) to resolve instruction page faults
Diffstat (limited to 'pk/handlers.c')
-rw-r--r--pk/handlers.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/pk/handlers.c b/pk/handlers.c
index c1f7c2b..881cc17 100644
--- a/pk/handlers.c
+++ b/pk/handlers.c
@@ -53,20 +53,18 @@ static void segfault(trapframe_t* tf, uintptr_t addr, const char* type)
static void handle_fault_fetch(trapframe_t* tf)
{
- if (handle_page_fault(tf->epc, PROT_EXEC) != 0)
- segfault(tf, tf->epc, "fetch");
+ if (handle_page_fault(tf->badvaddr, PROT_EXEC) != 0)
+ segfault(tf, tf->badvaddr, "fetch");
}
void handle_fault_load(trapframe_t* tf)
{
- tf->badvaddr = read_csr(sbadaddr);
if (handle_page_fault(tf->badvaddr, PROT_READ) != 0)
segfault(tf, tf->badvaddr, "load");
}
void handle_fault_store(trapframe_t* tf)
{
- tf->badvaddr = read_csr(sbadaddr);
if (handle_page_fault(tf->badvaddr, PROT_WRITE) != 0)
segfault(tf, tf->badvaddr, "store");
}