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
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with
16 additions and
4 deletions
-
riscv/sim.cc
-
riscv/sim.h
|
|
|
@ -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) |
|
|
|
|
|
|
|
@ -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; |
|
|
|
|