diff options
-rw-r--r-- | riscv/mmu.h | 11 |
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) |