
3.7.10. Determining the Cause of Interrupt and Instruction-Related
Exceptions
The general exception handler must determine the cause of each exception and then
transfer control to an appropriate exception routine.
3.7.10.1. Nios II/f Exception Processing
The
CAUSE
field of the
exception
register contains a code for the highest-priority
exception occurring at the time. The
BADDR
field of the
badaddr
register contains the
byte instruction address or data address for certain exceptions.
Refer to the Nios II Exceptions table for more information in the Exception Overview
section.
Note:
External interrupts do not set
exception
.
CAUSE
.
To determine the cause of an exception, simply read the cause of the exception from
exception
.
CAUSE
and then transfer control to the appropriate exception routine.
3.7.10.2. Nios II/e Exception Processing
Example 3. Determining Exception Cause for Nios II/e Exception Processing
/* With an internal interrupt controller, check for interrupt
exceptions. With an external interrupt controller, ipending is
always 0, and this check can be omitted. */
if (estatus.PIE == 1 and ipending != 0) {
handle interrupt
/* Decode exception from instruction */
/* Note: Because the exception register is included with the MMU and */
/* MPU, you never need to determine MMU or MPU exceptions by decoding */
} else {
decode instruction at $ea-4
if (instruction is trap)
handle trap exception
else if (instruction is load or store)
handle misaligned data address exception
else if (instruction is branch, bret, callr, eret, jmp, or ret)
handle misaligned destination address exception
else if (instruction is unimplemented)
handle unimplemented instruction exception
else if (instruction is illegal)
handle illegal instruction exception
else if (instruction is divide) {
if (denominator == 0)
handle division error exception
else if (instruction is signed divide and numerator == 0x80000000
and denominator == 0xffffffff)
handle division error exception
}
}
/* Not any known exception */
} else {
handle unknown exception (If internal interrupt controller
is implemented, could be spurious interrupt)
}
}
3. Programming Model
NII-PRG | 2018.04.18
Nios II Processor Reference Guide
93