Merge remote-tracking branch 'origin/priv-1.10'
authorPalmer Dabbelt <palmer@dabbelt.com>
Wed, 17 May 2017 20:07:47 +0000 (13:07 -0700)
committerPalmer Dabbelt <palmer@dabbelt.com>
Wed, 17 May 2017 20:07:47 +0000 (13:07 -0700)
1  2 
riscv/devices.h

diff --combined riscv/devices.h
index 64ab79b96946e8c6337650aae3935d60964b06cc,0f0c9166b7c7cb510a98d2b817ec25233e5d1da8..e4df6c9858862a3f7421e0162e5538dfa009e925
@@@ -2,8 -2,6 +2,8 @@@
  #define _RISCV_DEVICES_H
  
  #include "decode.h"
 +#include <cstdlib>
 +#include <string>
  #include <map>
  #include <vector>
  
@@@ -22,6 -20,8 +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 -36,40 +38,40 @@@ class rom_device_t : public abstract_de
    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