Trap superpage PTEs when PPN LSBs are set
[riscv-isa-sim.git] / riscv / devices.h
1 #ifndef _RISCV_DEVICES_H
2 #define _RISCV_DEVICES_H
3
4 #include "decode.h"
5 #include <map>
6 #include <vector>
7
8 class processor_t;
9
10 class abstract_device_t {
11 public:
12 virtual bool load(reg_t addr, size_t len, uint8_t* bytes) = 0;
13 virtual bool store(reg_t addr, size_t len, const uint8_t* bytes) = 0;
14 virtual ~abstract_device_t() {}
15 };
16
17 class bus_t : public abstract_device_t {
18 public:
19 bool load(reg_t addr, size_t len, uint8_t* bytes);
20 bool store(reg_t addr, size_t len, const uint8_t* bytes);
21 void add_device(reg_t addr, abstract_device_t* dev);
22
23 std::pair<reg_t, abstract_device_t*> find_device(reg_t addr);
24
25 private:
26 std::map<reg_t, abstract_device_t*> devices;
27 };
28
29 class rom_device_t : public abstract_device_t {
30 public:
31 rom_device_t(std::vector<char> data);
32 bool load(reg_t addr, size_t len, uint8_t* bytes);
33 bool store(reg_t addr, size_t len, const uint8_t* bytes);
34 const std::vector<char>& contents() { return data; }
35 private:
36 std::vector<char> data;
37 };
38
39 class mem_t : public abstract_device_t {
40 public:
41 mem_t(size_t size) : len(size) {
42 data = (char*)calloc(1, size);
43 if (!data)
44 throw std::runtime_error("couldn't allocate " + std::to_string(size) + " bytes of target memory");
45 }
46 mem_t(const mem_t& that) = delete;
47 ~mem_t() { free(data); }
48
49 bool load(reg_t addr, size_t len, uint8_t* bytes) { return false; }
50 bool store(reg_t addr, size_t len, const uint8_t* bytes) { return false; }
51 char* contents() { return data; }
52 size_t size() { return len; }
53
54 private:
55 char* data;
56 size_t len;
57 };
58
59 class clint_t : public abstract_device_t {
60 public:
61 clint_t(std::vector<processor_t*>&);
62 bool load(reg_t addr, size_t len, uint8_t* bytes);
63 bool store(reg_t addr, size_t len, const uint8_t* bytes);
64 size_t size() { return CLINT_SIZE; }
65 void increment(reg_t inc);
66 private:
67 typedef uint64_t mtime_t;
68 typedef uint64_t mtimecmp_t;
69 typedef uint32_t msip_t;
70 std::vector<processor_t*>& procs;
71 mtime_t mtime;
72 std::vector<mtimecmp_t> mtimecmp;
73 };
74
75 #endif