aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2016-04-29 00:06:43 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2016-04-29 00:06:43 -0700
commitde16a763e6bf266ad49384fa131a502a6174e7ba (patch)
tree3dc646fc74f93864456f51467eabd4bb1d621ac2
parent1baf122e28fc19af687033358d078bf8e6bab741 (diff)
downloadpk-de16a763e6bf266ad49384fa131a502a6174e7ba.zip
pk-de16a763e6bf266ad49384fa131a502a6174e7ba.tar.gz
pk-de16a763e6bf266ad49384fa131a502a6174e7ba.tar.bz2
Use mbadaddr to speed up misaligned ld/st emulation
-rw-r--r--machine/misaligned_ldst.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/machine/misaligned_ldst.c b/machine/misaligned_ldst.c
index cf6b1d6..2225ea1 100644
--- a/machine/misaligned_ldst.c
+++ b/machine/misaligned_ldst.c
@@ -14,7 +14,7 @@ void misaligned_load_trap(uintptr_t* regs, uintptr_t mcause, uintptr_t mepc)
union byte_array val;
uintptr_t mstatus;
insn_t insn = get_insn(mepc, &mstatus);
- uintptr_t addr = GET_RS1(insn, regs) + IMM_I(insn);
+ uintptr_t addr = read_csr(mbadaddr);
int shift = 0, fp = 0, len;
if ((insn & MASK_LW) == MATCH_LW)
@@ -77,7 +77,7 @@ void misaligned_store_trap(uintptr_t* regs, uintptr_t mcause, uintptr_t mepc)
else
return truly_illegal_insn(regs, mcause, mepc, mstatus, insn);
- uintptr_t addr = GET_RS1(insn, regs) + IMM_S(insn);
+ uintptr_t addr = read_csr(mbadaddr);
for (int i = 0; i < len; i++)
store_uint8_t((void *)(addr + i), val.bytes[i], mepc);