Skip to content

Commit

Permalink
Merge pull request #1415 from michalt/memt-virtual
Browse files Browse the repository at this point in the history
Make methods of `mem_t` virtual to allow overriding
  • Loading branch information
jerryz123 authored Jul 20, 2023
2 parents 432c9ee + cb01351 commit 1b41ed3
Show file tree
Hide file tree
Showing 7 changed files with 29 additions and 18 deletions.
7 changes: 4 additions & 3 deletions ci-tests/testlib.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

// Copied from spike main.
// TODO: This should really be provided in libriscv
static std::vector<std::pair<reg_t, mem_t*>> make_mems(const std::vector<mem_cfg_t> &layout)
static std::vector<std::pair<reg_t, abstract_mem_t*>> make_mems(const std::vector<mem_cfg_t> &layout)
{
std::vector<std::pair<reg_t, mem_t*>> mems;
std::vector<std::pair<reg_t, abstract_mem_t*>> mems;
mems.reserve(layout.size());
for (const auto &cfg : layout) {
mems.push_back(std::make_pair(cfg.get_base(), new mem_t(cfg.get_size())));
Expand Down Expand Up @@ -41,7 +41,8 @@ int main()
.support_haltgroups = true,
.support_impebreak = true
};
std::vector<std::pair<reg_t, mem_t*>> mems = make_mems(cfg.mem_layout());
std::vector<std::pair<reg_t, abstract_mem_t*>> mems =
make_mems(cfg.mem_layout());
sim_t sim(&cfg, false,
mems,
plugin_devices,
Expand Down
19 changes: 14 additions & 5 deletions riscv/devices.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,26 @@ class rom_device_t : public abstract_device_t {
std::vector<char> data;
};

class mem_t : public abstract_device_t {
class abstract_mem_t : public abstract_device_t {
public:
virtual ~abstract_mem_t() = default;

virtual char* contents(reg_t addr) = 0;
virtual reg_t size() = 0;
virtual void dump(std::ostream& o) = 0;
};

class mem_t : public abstract_mem_t {
public:
mem_t(reg_t size);
mem_t(const mem_t& that) = delete;
~mem_t();
~mem_t() override;

bool load(reg_t addr, size_t len, uint8_t* bytes) override { return load_store(addr, len, bytes, false); }
bool store(reg_t addr, size_t len, const uint8_t* bytes) override { return load_store(addr, len, const_cast<uint8_t*>(bytes), true); }
char* contents(reg_t addr);
reg_t size() { return sz; }
void dump(std::ostream& o);
char* contents(reg_t addr) override;
reg_t size() override { return sz; }
void dump(std::ostream& o) override;

private:
bool load_store(reg_t addr, size_t len, uint8_t* bytes, bool store);
Expand Down
2 changes: 1 addition & 1 deletion riscv/dts.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ std::string make_dts(size_t insns_per_rtc_tick, size_t cpu_hz,
const char* bootargs,
size_t pmpregions,
std::vector<processor_t*> procs,
std::vector<std::pair<reg_t, mem_t*>> mems,
std::vector<std::pair<reg_t, abstract_mem_t*>> mems,
std::string device_nodes)
{
std::stringstream s;
Expand Down
2 changes: 1 addition & 1 deletion riscv/dts.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ std::string make_dts(size_t insns_per_rtc_tick, size_t cpu_hz,
const char* bootargs,
size_t pmpregions,
std::vector<processor_t*> procs,
std::vector<std::pair<reg_t, mem_t*>> mems,
std::vector<std::pair<reg_t, abstract_mem_t*>> mems,
std::string device_nodes);

std::string dts_compile(const std::string& dts);
Expand Down
4 changes: 2 additions & 2 deletions riscv/sim.cc
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ extern device_factory_t* plic_factory;
extern device_factory_t* ns16550_factory;

sim_t::sim_t(const cfg_t *cfg, bool halted,
std::vector<std::pair<reg_t, mem_t*>> mems,
std::vector<std::pair<reg_t, abstract_mem_t*>> mems,
std::vector<const device_factory_t*> plugin_device_factories,
const std::vector<std::string>& args,
const debug_module_config_t &dm_config,
Expand Down Expand Up @@ -380,7 +380,7 @@ char* sim_t::addr_to_mem(reg_t paddr) {
if (!paddr_ok(paddr))
return NULL;
auto desc = bus.find_device(paddr);
if (auto mem = dynamic_cast<mem_t*>(desc.second))
if (auto mem = dynamic_cast<abstract_mem_t*>(desc.second))
if (paddr - desc.first < mem->size())
return mem->contents(paddr - desc.first);
return NULL;
Expand Down
4 changes: 2 additions & 2 deletions riscv/sim.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class sim_t : public htif_t, public simif_t
{
public:
sim_t(const cfg_t *cfg, bool halted,
std::vector<std::pair<reg_t, mem_t*>> mems,
std::vector<std::pair<reg_t, abstract_mem_t*>> mems,
std::vector<const device_factory_t*> plugin_device_factories,
const std::vector<std::string>& args,
const debug_module_config_t &dm_config, const char *log_path,
Expand Down Expand Up @@ -68,7 +68,7 @@ class sim_t : public htif_t, public simif_t
private:
isa_parser_t isa;
const cfg_t * const cfg;
std::vector<std::pair<reg_t, mem_t*>> mems;
std::vector<std::pair<reg_t, abstract_mem_t*>> mems;
std::vector<processor_t*> procs;
std::map<size_t, processor_t*> harts;
std::pair<reg_t, reg_t> initrd_range;
Expand Down
9 changes: 5 additions & 4 deletions spike_main/spike.cc
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ static std::ifstream::pos_type get_file_size(const char *filename)
}

static void read_file_bytes(const char *filename,size_t fileoff,
mem_t* mem, size_t memoff, size_t read_sz)
abstract_mem_t* mem, size_t memoff, size_t read_sz)
{
std::ifstream in(filename, std::ios::in | std::ios::binary);
in.seekg(fileoff, std::ios::beg);
Expand Down Expand Up @@ -260,9 +260,9 @@ static std::vector<mem_cfg_t> parse_mem_layout(const char* arg)
return merged_mem;
}

static std::vector<std::pair<reg_t, mem_t*>> make_mems(const std::vector<mem_cfg_t> &layout)
static std::vector<std::pair<reg_t, abstract_mem_t*>> make_mems(const std::vector<mem_cfg_t> &layout)
{
std::vector<std::pair<reg_t, mem_t*>> mems;
std::vector<std::pair<reg_t, abstract_mem_t*>> mems;
mems.reserve(layout.size());
for (const auto &cfg : layout) {
mems.push_back(std::make_pair(cfg.get_base(), new mem_t(cfg.get_size())));
Expand Down Expand Up @@ -473,7 +473,8 @@ int main(int argc, char** argv)
if (!*argv1)
help();

std::vector<std::pair<reg_t, mem_t*>> mems = make_mems(cfg.mem_layout());
std::vector<std::pair<reg_t, abstract_mem_t*>> mems =
make_mems(cfg.mem_layout());

if (kernel && check_file_exists(kernel)) {
const char *isa = cfg.isa();
Expand Down

0 comments on commit 1b41ed3

Please sign in to comment.