aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrbuchner <ryan.buchner@arilinc.com>2023-04-18 14:06:12 -0700
committerrbuchner <ryan.buchner@arilinc.com>2023-05-11 23:00:59 -0700
commit4b9996bad9a3327b13056f21b7b2e03fdc41f65a (patch)
tree7e6273451e63ee9401a16c2573cce71479ea1092
parentf7900e4730e1c13fa42789bc01d8f0366756130e (diff)
downloadriscv-isa-sim-4b9996bad9a3327b13056f21b7b2e03fdc41f65a.zip
riscv-isa-sim-4b9996bad9a3327b13056f21b7b2e03fdc41f65a.tar.gz
riscv-isa-sim-4b9996bad9a3327b13056f21b7b2e03fdc41f65a.tar.bz2
Pass mem_access_info_t into walk()
-rw-r--r--riscv/mmu.cc10
-rw-r--r--riscv/mmu.h2
2 files changed, 8 insertions, 4 deletions
diff --git a/riscv/mmu.cc b/riscv/mmu.cc
index 7264ea8..f40ce30 100644
--- a/riscv/mmu.cc
+++ b/riscv/mmu.cc
@@ -60,10 +60,9 @@ reg_t mmu_t::translate(mem_access_info_t access_info, reg_t len)
return addr;
bool virt = access_info.effective_virt;
- bool hlvx = access_info.flags.hlvx;
reg_t mode = (reg_t) access_info.effective_priv;
- reg_t paddr = walk(addr, type, mode, virt, hlvx) | (addr & (PGSIZE-1));
+ reg_t paddr = walk(access_info) | (addr & (PGSIZE-1));
if (!pmp_ok(paddr, len, type, mode))
throw_access_exception(virt, addr, type);
return paddr;
@@ -461,8 +460,13 @@ reg_t mmu_t::s2xlate(reg_t gva, reg_t gpa, access_type type, access_type trap_ty
}
}
-reg_t mmu_t::walk(reg_t addr, access_type type, reg_t mode, bool virt, bool hlvx)
+reg_t mmu_t::walk(mem_access_info_t access_info)
{
+ access_type type = access_info.type;
+ reg_t addr = access_info.vaddr;
+ bool virt = access_info.effective_virt;
+ bool hlvx = access_info.flags.hlvx;
+ reg_t mode = access_info.effective_priv;
reg_t page_mask = (reg_t(1) << PGSHIFT) - 1;
reg_t satp = proc->get_state()->satp->readvirt(virt);
vm_info vm = decode_vm_info(proc->get_const_xlen(), false, mode, satp);
diff --git a/riscv/mmu.h b/riscv/mmu.h
index 41f6751..7d14ad5 100644
--- a/riscv/mmu.h
+++ b/riscv/mmu.h
@@ -374,7 +374,7 @@ private:
reg_t s2xlate(reg_t gva, reg_t gpa, access_type type, access_type trap_type, bool virt, bool hlvx);
// perform a page table walk for a given VA; set referenced/dirty bits
- reg_t walk(reg_t addr, access_type type, reg_t prv, bool virt, bool hlvx);
+ reg_t walk(mem_access_info_t access_info);
// handle uncommon cases: TLB misses, page faults, MMIO
tlb_entry_t fetch_slow_path(reg_t addr);