diff options
author | Andrew Waterman <waterman@s141.Millennium.Berkeley.EDU> | 2010-09-10 21:02:38 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@s141.Millennium.Berkeley.EDU> | 2010-09-10 21:02:38 -0700 |
commit | b3dac377a11188c1a18f6ddddd2af589f6f6841d (patch) | |
tree | 0e821aa4de6dba15a25a625909480ec54c519579 /riscv/mmu.h | |
parent | 5b9b36def0d5ba6a33f916cc68170234207cae6f (diff) | |
download | spike-b3dac377a11188c1a18f6ddddd2af589f6f6841d.zip spike-b3dac377a11188c1a18f6ddddd2af589f6f6841d.tar.gz spike-b3dac377a11188c1a18f6ddddd2af589f6f6841d.tar.bz2 |
[sim, pk] cleaned up exception vectors and FP exc flags
Diffstat (limited to 'riscv/mmu.h')
-rw-r--r-- | riscv/mmu.h | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/riscv/mmu.h b/riscv/mmu.h index eea26bb..9bfbeac 100644 --- a/riscv/mmu.h +++ b/riscv/mmu.h @@ -8,19 +8,19 @@ public: #define load_func(type) \ type##_t load_##type(reg_t addr) { \ - check_align_and_bounds(addr, sizeof(type##_t), false); \ + check_align_and_bounds(addr, sizeof(type##_t), false, false); \ return *(type##_t*)(mem+addr); \ } #define store_func(type) \ void store_##type(reg_t addr, type##_t val) { \ - check_align_and_bounds(addr, sizeof(type##_t), false); \ + check_align_and_bounds(addr, sizeof(type##_t), true, false); \ *(type##_t*)(mem+addr) = val; \ } insn_t load_insn(reg_t addr) { - check_align_and_bounds(addr, sizeof(insn_t), true); + check_align_and_bounds(addr, sizeof(insn_t), false, true); return *(insn_t*)(mem+addr); } @@ -57,20 +57,20 @@ private: } } - void check_bounds(reg_t addr, int size, bool fetch) + void check_bounds(reg_t addr, int size, bool store, bool fetch) { if(addr >= memsz || addr + size > memsz) { if(fetch) throw trap_instruction_access_fault; badvaddr = addr; - throw trap_data_access_fault; + throw store ? trap_store_access_fault : trap_load_access_fault; } } - void check_align_and_bounds(reg_t addr, int size, bool fetch) + void check_align_and_bounds(reg_t addr, int size, bool store, bool fetch) { check_align(addr, size, fetch); - check_bounds(addr, size, fetch); + check_bounds(addr, size, store, fetch); } }; |