aboutsummaryrefslogtreecommitdiff
path: root/riscv/mmu.h
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>2010-09-10 21:02:38 -0700
committerAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>2010-09-10 21:02:38 -0700
commitb3dac377a11188c1a18f6ddddd2af589f6f6841d (patch)
tree0e821aa4de6dba15a25a625909480ec54c519579 /riscv/mmu.h
parent5b9b36def0d5ba6a33f916cc68170234207cae6f (diff)
downloadspike-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.h14
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);
}
};