diff options
author | Andrew Waterman <andrew@sifive.com> | 2017-04-30 22:03:15 -0700 |
---|---|---|
committer | Andrew Waterman <andrew@sifive.com> | 2017-04-30 22:03:15 -0700 |
commit | abb7dddfdfd6ec5070c26c1824e4f5801e6bb12d (patch) | |
tree | c20479a56197fe8bcc6b886a0454af028444ac4c /riscv/devices.h | |
parent | 1d2892407fed141d20607ae9c49e50673e2c5c11 (diff) | |
download | spike-abb7dddfdfd6ec5070c26c1824e4f5801e6bb12d.zip spike-abb7dddfdfd6ec5070c26c1824e4f5801e6bb12d.tar.gz spike-abb7dddfdfd6ec5070c26c1824e4f5801e6bb12d.tar.bz2 |
Support more flexible main memory allocation
Diffstat (limited to 'riscv/devices.h')
-rw-r--r-- | riscv/devices.h | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/riscv/devices.h b/riscv/devices.h index f3ecb67..ba344db 100644 --- a/riscv/devices.h +++ b/riscv/devices.h @@ -20,6 +20,9 @@ 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); + struct descriptor { reg_t base; abstract_device_t* device; }; + descriptor find_device(reg_t addr); + private: std::map<reg_t, abstract_device_t*> devices; }; @@ -34,6 +37,26 @@ class rom_device_t : public abstract_device_t { std::vector<char> data; }; +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: clint_t(std::vector<processor_t*>&); |