Update README
[riscv-isa-sim.git] / riscv / devices.h
index 558ecc7f59e0ddaf9890b5cdf096baa5fddfaa32..4e4d27ff609409a285cb2b60805f262a318186bc 100644 (file)
@@ -2,9 +2,13 @@
 #define _RISCV_DEVICES_H
 
 #include "decode.h"
+#include <cstdlib>
+#include <string>
 #include <map>
 #include <vector>
 
+class processor_t;
+
 class abstract_device_t {
  public:
   virtual bool load(reg_t addr, size_t len, uint8_t* bytes) = 0;
@@ -18,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;
 };
@@ -27,8 +33,47 @@ class rom_device_t : public abstract_device_t {
   rom_device_t(std::vector<char> data);
   bool load(reg_t addr, size_t len, uint8_t* bytes);
   bool store(reg_t addr, size_t len, const uint8_t* bytes);
+  const std::vector<char>& contents() { return data; }
  private:
   std::vector<char> data;
 };
 
+class mem_t : public abstract_device_t {
+ public:
+  mem_t(size_t size) : len(size) {
+    if (!size)
+      throw std::runtime_error("zero bytes of target memory requested");
+    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*>&);
+  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 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;
+  mtime_t mtime;
+  std::vector<mtimecmp_t> mtimecmp;
+};
+
 #endif