Skip to content

Commit 88edb8b

Browse files
authored
Merge pull request #2158 from riscv-software-src/addrmem
Memoize physical address/main-memory map
2 parents bbd4eaa + 1ce2d69 commit 88edb8b

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

riscv/sim.cc

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -402,10 +402,20 @@ void sim_t::set_rom()
402402
}
403403

404404
char* sim_t::addr_to_mem(reg_t paddr) {
405-
auto desc = bus.find_device(paddr >> PGSHIFT << PGSHIFT, PGSIZE);
406-
if (auto mem = dynamic_cast<abstract_mem_t*>(desc.second))
407-
return mem->contents(paddr - desc.first);
408-
return NULL;
405+
auto page_offset = paddr % PGSIZE;
406+
auto page_addr = paddr - page_offset;
407+
408+
if (auto it = addr_to_mem_cache.find(page_addr); it != addr_to_mem_cache.end())
409+
return it->second + page_offset;
410+
411+
auto desc = bus.find_device(page_addr, PGSIZE);
412+
if (auto mem = dynamic_cast<abstract_mem_t*>(desc.second)) {
413+
auto res = mem->contents(page_addr - desc.first);
414+
addr_to_mem_cache.insert({page_addr, res});
415+
return res + page_offset;
416+
}
417+
418+
return nullptr;
409419
}
410420

411421
const char* sim_t::get_symbol(uint64_t paddr)

riscv/sim.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <fesvr/htif.h>
1414
#include <vector>
1515
#include <map>
16+
#include <unordered_map>
1617
#include <string>
1718
#include <memory>
1819
#include <sys/types.h>
@@ -73,6 +74,7 @@ class sim_t : public htif_t, public simif_t
7374
std::vector<std::pair<reg_t, abstract_mem_t*>> mems;
7475
std::vector<processor_t*> procs;
7576
std::map<size_t, processor_t*> harts;
77+
std::unordered_map<reg_t, char*> addr_to_mem_cache;
7678
std::pair<reg_t, reg_t> initrd_range;
7779
std::string dts;
7880
std::string dtb;

0 commit comments

Comments
 (0)