aboutsummaryrefslogtreecommitdiff
path: root/riscv/mmu.cc
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2013-03-25 22:38:32 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2013-03-25 22:38:32 -0700
commit30a89f79b31b101b3ce4481e502e2e7d2529746c (patch)
tree258fb08ac6d15c251a231a111acae12622ef57bf /riscv/mmu.cc
parentaaf96970cc4b324d8b767c871e682cd9b669eada (diff)
downloadspike-30a89f79b31b101b3ce4481e502e2e7d2529746c.zip
spike-30a89f79b31b101b3ce4481e502e2e7d2529746c.tar.gz
spike-30a89f79b31b101b3ce4481e502e2e7d2529746c.tar.bz2
truncate effective addresses in rv32
also, employ a more efficient instruction dispatch based upon rv32 mode.
Diffstat (limited to 'riscv/mmu.cc')
-rw-r--r--riscv/mmu.cc6
1 files changed, 3 insertions, 3 deletions
diff --git a/riscv/mmu.cc b/riscv/mmu.cc
index 84c9459..9f433b5 100644
--- a/riscv/mmu.cc
+++ b/riscv/mmu.cc
@@ -4,7 +4,7 @@
mmu_t::mmu_t(char* _mem, size_t _memsz)
: mem(_mem), memsz(_memsz), badvaddr(0),
- ptbr(0), supervisor(true), vm_enabled(false)
+ ptbr(0), sr(SR_S)
{
flush_tlb();
}
@@ -35,7 +35,7 @@ reg_t mmu_t::refill_tlb(reg_t addr, reg_t bytes, bool store, bool fetch)
reg_t pte = walk(addr);
reg_t pte_perm = pte & PTE_PERM;
- if(supervisor) // shift supervisor permission bits into user perm bits
+ if (sr & SR_S) // shift supervisor permission bits into user perm bits
pte_perm = (pte_perm/(PTE_SX/PTE_UX)) & PTE_PERM;
pte_perm |= pte & PTE_E;
@@ -74,7 +74,7 @@ pte_t mmu_t::walk(reg_t addr)
int shift = 8*sizeof(reg_t) - VA_BITS;
if (((sreg_t)addr << shift >> shift) != (sreg_t)addr)
;
- else if(!vm_enabled)
+ else if (!(sr & SR_VM))
{
if(addr < memsz)
pte = PTE_E | PTE_PERM | ((addr >> PGSHIFT) << PTE_PPN_SHIFT);