Nios II Classic Processor Reference Guide

ID 683620
Date 10/28/2016
Public
Document Table of Contents

3.7.10.2. Without Extra Exception Information

When you have not included the extra exception information in your Nios II system, your exception handler must determine the cause of exception itself. For this reason, Altera recommends always enabling the extra exception information.

When the extra exception information is not available, use the sequence in the example below to determine the cause of an exception.

Determining Exception Cause Without Extra Exception Information


/* 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)
   }
}