diff options
author | Palmer Dabbelt <palmer@dabbelt.com> | 2017-05-17 13:07:47 -0700 |
---|---|---|
committer | Palmer Dabbelt <palmer@dabbelt.com> | 2017-05-17 13:07:47 -0700 |
commit | b3caeee9858b3417d4110b921305c441d3c87653 (patch) | |
tree | 5d6d9b6aa540b2c910aee2d56f0541fe2008fe11 /riscv/devices.h | |
parent | 68f1a893ec84ca734d83e8626c3abd2c8de78cda (diff) | |
parent | a1f754b2f0ec5fe72c86d6916d7c603e7727e68e (diff) | |
download | riscv-isa-sim-b3caeee9858b3417d4110b921305c441d3c87653.zip riscv-isa-sim-b3caeee9858b3417d4110b921305c441d3c87653.tar.gz riscv-isa-sim-b3caeee9858b3417d4110b921305c441d3c87653.tar.bz2 |
Merge remote-tracking branch 'origin/priv-1.10'
Diffstat (limited to 'riscv/devices.h')
-rw-r--r-- | riscv/devices.h | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/riscv/devices.h b/riscv/devices.h index 64ab79b..e4df6c9 100644 --- a/riscv/devices.h +++ b/riscv/devices.h @@ -22,6 +22,8 @@ class bus_t : public abstract_device_t { bool store(reg_t addr, size_t len, const uint8_t* bytes); void add_device(reg_t addr, abstract_device_t* dev); + std::pair<reg_t, abstract_device_t*> find_device(reg_t addr); + private: std::map<reg_t, abstract_device_t*> devices; }; @@ -36,17 +38,40 @@ class rom_device_t : public abstract_device_t { std::vector<char> data; }; -class rtc_t : public abstract_device_t { +class mem_t : public abstract_device_t { + public: + mem_t(size_t size) : len(size) { + data = (char*)calloc(1, size); + if (!data) + throw std::runtime_error("couldn't allocate " + std::to_string(size) + " bytes of target memory"); + } + mem_t(const mem_t& that) = delete; + ~mem_t() { free(data); } + + bool load(reg_t addr, size_t len, uint8_t* bytes) { return false; } + bool store(reg_t addr, size_t len, const uint8_t* bytes) { return false; } + char* contents() { return data; } + size_t size() { return len; } + + private: + char* data; + size_t len; +}; + +class clint_t : public abstract_device_t { public: - rtc_t(std::vector<processor_t*>&); + clint_t(std::vector<processor_t*>&); bool load(reg_t addr, size_t len, uint8_t* bytes); bool store(reg_t addr, size_t len, const uint8_t* bytes); - size_t size() { return regs.size() * sizeof(regs[0]); } + size_t size() { return CLINT_SIZE; } void increment(reg_t inc); private: + typedef uint64_t mtime_t; + typedef uint64_t mtimecmp_t; + typedef uint32_t msip_t; std::vector<processor_t*>& procs; - std::vector<uint64_t> regs; - uint64_t time() { return regs[0]; } + mtime_t mtime; + std::vector<mtimecmp_t> mtimecmp; }; #endif |