aboutsummaryrefslogtreecommitdiff
path: root/riscv/devices.h
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2017-04-30 22:03:15 -0700
committerAndrew Waterman <andrew@sifive.com>2017-04-30 22:03:15 -0700
commitabb7dddfdfd6ec5070c26c1824e4f5801e6bb12d (patch)
treec20479a56197fe8bcc6b886a0454af028444ac4c /riscv/devices.h
parent1d2892407fed141d20607ae9c49e50673e2c5c11 (diff)
downloadspike-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.h23
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*>&);