diff options
author | rbuchner <ryan.buchner@arilinc.com> | 2023-04-24 09:45:26 -0700 |
---|---|---|
committer | rbuchner <ryan.buchner@arilinc.com> | 2023-05-11 23:00:58 -0700 |
commit | a0c5bf31ba22119bf365c5fcff262736d1b4ac49 (patch) | |
tree | 64611acbbb5e38c12395dfefd7795a08bad9ae74 | |
parent | d091f84af4ddc1e3c64c78d9cbac0277efd32554 (diff) | |
download | riscv-isa-sim-a0c5bf31ba22119bf365c5fcff262736d1b4ac49.zip riscv-isa-sim-a0c5bf31ba22119bf365c5fcff262736d1b4ac49.tar.gz riscv-isa-sim-a0c5bf31ba22119bf365c5fcff262736d1b4ac49.tar.bz2 |
Add is_special_access() to xlate_flags_t
-rw-r--r-- | riscv/mmu.cc | 8 | ||||
-rw-r--r-- | riscv/mmu.h | 8 |
2 files changed, 10 insertions, 6 deletions
diff --git a/riscv/mmu.cc b/riscv/mmu.cc index 4c42610..6a5fdee 100644 --- a/riscv/mmu.cc +++ b/riscv/mmu.cc @@ -201,7 +201,7 @@ void mmu_t::check_triggers(triggers::operation_t operation, reg_t address, std:: void mmu_t::load_slow_path_intrapage(reg_t addr, reg_t len, uint8_t* bytes, xlate_flags_t xlate_flags) { reg_t vpn = addr >> PGSHIFT; - if (!(xlate_flags.hlvx || xlate_flags.forced_virt || xlate_flags.lr) && vpn == (tlb_load_tag[vpn % TLB_ENTRIES] & ~TLB_CHECK_TRIGGERS)) { + if (!xlate_flags.is_special_access() && vpn == (tlb_load_tag[vpn % TLB_ENTRIES] & ~TLB_CHECK_TRIGGERS)) { auto host_addr = tlb_data[vpn % TLB_ENTRIES].host_offset + addr; memcpy(bytes, host_addr, len); return; @@ -217,7 +217,7 @@ void mmu_t::load_slow_path_intrapage(reg_t addr, reg_t len, uint8_t* bytes, xlat memcpy(bytes, host_addr, len); if (tracer.interested_in_range(paddr, paddr + PGSIZE, LOAD)) tracer.trace(paddr, len, LOAD); - else if (!(xlate_flags.hlvx || xlate_flags.forced_virt || xlate_flags.lr)) + else if (!xlate_flags.is_special_access()) refill_tlb(addr, paddr, host_addr, LOAD); } else if (!mmio_load(paddr, len, bytes)) { @@ -255,7 +255,7 @@ void mmu_t::load_slow_path(reg_t addr, reg_t len, uint8_t* bytes, xlate_flags_t void mmu_t::store_slow_path_intrapage(reg_t addr, reg_t len, const uint8_t* bytes, xlate_flags_t xlate_flags, bool actually_store) { reg_t vpn = addr >> PGSHIFT; - if (!(xlate_flags.hlvx || xlate_flags.forced_virt || xlate_flags.lr) && vpn == (tlb_store_tag[vpn % TLB_ENTRIES] & ~TLB_CHECK_TRIGGERS)) { + if (!xlate_flags.is_special_access() && vpn == (tlb_store_tag[vpn % TLB_ENTRIES] & ~TLB_CHECK_TRIGGERS)) { if (actually_store) { auto host_addr = tlb_data[vpn % TLB_ENTRIES].host_offset + addr; memcpy(host_addr, bytes, len); @@ -270,7 +270,7 @@ void mmu_t::store_slow_path_intrapage(reg_t addr, reg_t len, const uint8_t* byte memcpy(host_addr, bytes, len); if (tracer.interested_in_range(paddr, paddr + PGSIZE, STORE)) tracer.trace(paddr, len, STORE); - else if (!(xlate_flags.hlvx || xlate_flags.forced_virt || xlate_flags.lr)) + else if (!xlate_flags.is_special_access()) refill_tlb(addr, paddr, host_addr, STORE); } else if (!mmio_store(paddr, len, bytes)) { throw trap_store_access_fault((proc) ? proc->state.v : false, addr, 0, 0); diff --git a/riscv/mmu.h b/riscv/mmu.h index 3c04672..6e79539 100644 --- a/riscv/mmu.h +++ b/riscv/mmu.h @@ -42,6 +42,10 @@ struct xlate_flags_t { const bool forced_virt : 1; const bool hlvx : 1; const bool lr : 1; + + bool is_special_access() const { + return forced_virt || hlvx || lr; + } }; void throw_access_exception(bool virt, reg_t addr, access_type type); @@ -64,7 +68,7 @@ public: bool aligned = (addr & (sizeof(T) - 1)) == 0; bool tlb_hit = tlb_load_tag[vpn % TLB_ENTRIES] == vpn; - if (likely(!(xlate_flags.hlvx || xlate_flags.forced_virt || xlate_flags.lr) && aligned && tlb_hit)) { + if (likely(!xlate_flags.is_special_access() && aligned && tlb_hit)) { res = *(target_endian<T>*)(tlb_data[vpn % TLB_ENTRIES].host_offset + addr); } else { load_slow_path(addr, sizeof(T), (uint8_t*)&res, xlate_flags); @@ -106,7 +110,7 @@ public: bool aligned = (addr & (sizeof(T) - 1)) == 0; bool tlb_hit = tlb_store_tag[vpn % TLB_ENTRIES] == vpn; - if (!(xlate_flags.hlvx || xlate_flags.forced_virt || xlate_flags.lr) && likely(aligned && tlb_hit)) { + if (!xlate_flags.is_special_access() && likely(aligned && tlb_hit)) { *(target_endian<T>*)(tlb_data[vpn % TLB_ENTRIES].host_offset + addr) = to_target(val); } else { target_endian<T> target_val = to_target(val); |