size_t memsz;
reg_t badvaddr;
- void check_align(reg_t addr, int size, bool fetch)
+ void check_align(reg_t addr, int size, bool store, bool fetch)
{
if(addr & (size-1))
{
badvaddr = addr;
if(fetch)
throw trap_instruction_address_misaligned;
- throw trap_data_address_misaligned;
+ if(store)
+ throw trap_store_address_misaligned;
+ throw trap_load_address_misaligned;
}
}
void check_align_and_bounds(reg_t addr, int size, bool store, bool fetch)
{
- check_align(addr, size, fetch);
+ check_align(addr, size, store, fetch);
check_bounds(addr, size, store, fetch);
}
};
DECLARE_TRAP(interrupt), \
DECLARE_TRAP(syscall), \
DECLARE_TRAP(breakpoint), \
- DECLARE_TRAP(data_address_misaligned), \
+ DECLARE_TRAP(load_address_misaligned), \
+ DECLARE_TRAP(store_address_misaligned), \
DECLARE_TRAP(load_access_fault), \
DECLARE_TRAP(store_access_fault), \
DECLARE_TRAP(vector_disabled), \