7 mmu_t(char* _mem
, size_t _memsz
) : mem(_mem
), memsz(_memsz
) {}
9 #define load_func(type) \
10 type##_t load_##type(reg_t addr) { \
11 check_align_and_bounds(addr, sizeof(type##_t), false); \
12 return *(type##_t*)(mem+addr); \
15 #define store_func(type) \
16 void store_##type(reg_t addr, type##_t val) { \
17 check_align_and_bounds(addr, sizeof(type##_t), false); \
18 *(type##_t*)(mem+addr) = val; \
21 insn_t
load_insn(reg_t addr
)
23 check_align_and_bounds(addr
, sizeof(insn_t
), true);
24 return *(insn_t
*)(mem
+addr
);
42 reg_t
get_badvaddr() { return badvaddr
; }
49 void check_align(reg_t addr
, int size
, bool fetch
)
54 throw trap_instruction_address_misaligned
;
56 throw trap_data_address_misaligned
;
60 void check_bounds(reg_t addr
, int size
, bool fetch
)
62 if(addr
>= memsz
|| addr
+ size
> memsz
)
65 throw trap_instruction_access_fault
;
67 throw trap_data_access_fault
;
71 void check_align_and_bounds(reg_t addr
, int size
, bool fetch
)
73 check_align(addr
, size
, fetch
);
74 check_bounds(addr
, size
, fetch
);