static SI fr400_check_readwrite_address (SIM_CPU *current_cpu, SI address, int align_mask) { if (address & align_mask) { /* Make sure that this exception is not masked. */ USI isr = GET_ISR (); if (! GET_ISR_EMAM (isr)) { /* Bad alignment causes a data_access_error on fr400. */ frv_queue_data_access_error_interrupt (current_cpu, address); } address &= ~align_mask; } /* Nothing to check. */ return address; }
struct frv_interrupt_queue_element * frv_queue_mem_address_not_aligned_interrupt (SIM_CPU *current_cpu, USI addr) { struct frv_interrupt_queue_element *new_element; USI isr = GET_ISR (); /* Make sure that this exception is not masked. */ if (GET_ISR_EMAM (isr)) return NULL; /* Queue the interrupt. */ new_element = frv_queue_program_interrupt (current_cpu, FRV_MEM_ADDRESS_NOT_ALIGNED); new_element->eaddress = addr; new_element->u.data_written = frv_interrupt_state.data_written; frv_interrupt_state.data_written.length = 0; return new_element; }