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 struct descriptor
{ reg_t base
; abstract_device_t
* device
; };
24 descriptor
find_device(reg_t addr
);
27 std::map
<reg_t
, abstract_device_t
*> devices
;
30 class rom_device_t
: public abstract_device_t
{
32 rom_device_t(std::vector
<char> data
);
33 bool load(reg_t addr
, size_t len
, uint8_t* bytes
);
34 bool store(reg_t addr
, size_t len
, const uint8_t* bytes
);
35 const std::vector
<char>& contents() { return data
; }
37 std::vector
<char> data
;
40 class mem_t
: public abstract_device_t
{
42 mem_t(size_t size
) : len(size
) {
43 data
= (char*)calloc(1, size
);
45 throw std::runtime_error("couldn't allocate " + std::to_string(size
) + " bytes of target memory");
47 mem_t(const mem_t
& that
) = delete;
48 ~mem_t() { free(data
); }
50 bool load(reg_t addr
, size_t len
, uint8_t* bytes
) { return false; }
51 bool store(reg_t addr
, size_t len
, const uint8_t* bytes
) { return false; }
52 char* contents() { return data
; }
53 size_t size() { return len
; }
60 class clint_t
: public abstract_device_t
{
62 clint_t(std::vector
<processor_t
*>&);
63 bool load(reg_t addr
, size_t len
, uint8_t* bytes
);
64 bool store(reg_t addr
, size_t len
, const uint8_t* bytes
);
65 size_t size() { return CLINT_SIZE
; }
66 void increment(reg_t inc
);
68 typedef uint64_t mtime_t
;
69 typedef uint64_t mtimecmp_t
;
70 typedef uint32_t msip_t
;
71 std::vector
<processor_t
*>& procs
;
73 std::vector
<mtimecmp_t
> mtimecmp
;