aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--riscv/mmu.h11
1 files changed, 9 insertions, 2 deletions
diff --git a/riscv/mmu.h b/riscv/mmu.h
index 3a12355..14b57fb 100644
--- a/riscv/mmu.h
+++ b/riscv/mmu.h
@@ -287,8 +287,15 @@ public:
template<typename T>
T ALWAYS_INLINE fetch_jump_table(reg_t addr) {
- auto tlb_entry = translate_insn_addr(addr);
- return from_target(*(target_endian<T>*)(tlb_entry.host_offset + addr));
+ typedef std::remove_const<std::remove_pointer<decltype(translate_insn_addr_to_host(addr))>::type>::type U;
+ U parcels[sizeof(T) / sizeof(U)];
+
+ for (size_t i = 0; i < std::size(parcels); i++)
+ parcels[i] = *translate_insn_addr_to_host(addr + i * sizeof(U));
+
+ target_endian<T> res;
+ memcpy(&res, parcels, sizeof(T));
+ return from_target(res);
}
inline icache_entry_t* refill_icache(reg_t addr, icache_entry_t* entry)