1 #ifndef _RISCV_DEVICES_H
2 #define _RISCV_DEVICES_H
10 class abstract_device_t
{
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() {}
17 class bus_t
: public abstract_device_t
{
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
);
23 std::pair
<reg_t
, abstract_device_t
*> find_device(reg_t addr
);
26 std::map
<reg_t
, abstract_device_t
*> devices
;
29 class rom_device_t
: public abstract_device_t
{
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
; }
36 std::vector
<char> data
;
39 class mem_t
: public abstract_device_t
{
41 mem_t(size_t size
) : len(size
) {
42 data
= (char*)calloc(1, size
);
44 throw std::runtime_error("couldn't allocate " + std::to_string(size
) + " bytes of target memory");
46 mem_t(const mem_t
& that
) = delete;
47 ~mem_t() { free(data
); }
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
; }
59 class clint_t
: public abstract_device_t
{
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
);
67 typedef uint64_t mtime_t
;
68 typedef uint64_t mtimecmp_t
;
69 typedef uint32_t msip_t
;
70 std::vector
<processor_t
*>& procs
;
72 std::vector
<mtimecmp_t
> mtimecmp
;