Skip to content

Commit c1c0b8b

Browse files
authored
Merge pull request #1945 from riscv-software-src/fix-jump-table
Fix jump-table accesses in MMIO regions
2 parents fd89a02 + 51002ff commit c1c0b8b

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

riscv/mmu.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,8 +287,15 @@ class mmu_t
287287

288288
template<typename T>
289289
T ALWAYS_INLINE fetch_jump_table(reg_t addr) {
290-
auto tlb_entry = translate_insn_addr(addr);
291-
return from_target(*(target_endian<T>*)(tlb_entry.host_offset + addr));
290+
typedef std::remove_const<std::remove_pointer<decltype(translate_insn_addr_to_host(addr))>::type>::type U;
291+
U parcels[sizeof(T) / sizeof(U)];
292+
293+
for (size_t i = 0; i < std::size(parcels); i++)
294+
parcels[i] = *translate_insn_addr_to_host(addr + i * sizeof(U));
295+
296+
target_endian<T> res;
297+
memcpy(&res, parcels, sizeof(T));
298+
return from_target(res);
292299
}
293300

294301
inline icache_entry_t* refill_icache(reg_t addr, icache_entry_t* entry)

0 commit comments

Comments
 (0)