Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make methods of mem_t virtual to allow overriding #1415

Merged
merged 1 commit into from
Jul 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading