|
|
|
@ -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); |
|
|
|
|