Browse Source

Merge pull request #2158 from riscv-software-src/addrmem

Memoize physical address/main-memory map
pull/2159/head
Andrew Waterman 4 months ago
committed by GitHub
parent
commit
88edb8b813
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 18
      riscv/sim.cc
  2. 2
      riscv/sim.h

18
riscv/sim.cc

@ -402,10 +402,20 @@ void sim_t::set_rom()
}
char* sim_t::addr_to_mem(reg_t paddr) {
auto desc = bus.find_device(paddr >> PGSHIFT << PGSHIFT, PGSIZE);
if (auto mem = dynamic_cast<abstract_mem_t*>(desc.second))
return mem->contents(paddr - desc.first);
return NULL;
auto page_offset = paddr % PGSIZE;
auto page_addr = paddr - page_offset;
if (auto it = addr_to_mem_cache.find(page_addr); it != addr_to_mem_cache.end())
return it->second + page_offset;
auto desc = bus.find_device(page_addr, PGSIZE);
if (auto mem = dynamic_cast<abstract_mem_t*>(desc.second)) {
auto res = mem->contents(page_addr - desc.first);
addr_to_mem_cache.insert({page_addr, res});
return res + page_offset;
}
return nullptr;
}
const char* sim_t::get_symbol(uint64_t paddr)

2
riscv/sim.h

@ -13,6 +13,7 @@
#include <fesvr/htif.h>
#include <vector>
#include <map>
#include <unordered_map>
#include <string>
#include <memory>
#include <sys/types.h>
@ -73,6 +74,7 @@ private:
std::vector<std::pair<reg_t, abstract_mem_t*>> mems;
std::vector<processor_t*> procs;
std::map<size_t, processor_t*> harts;
std::unordered_map<reg_t, char*> addr_to_mem_cache;
std::pair<reg_t, reg_t> initrd_range;
std::string dts;
std::string dtb;

Loading…
Cancel
Save