86 lines
2.9 KiB
C++
Executable file
86 lines
2.9 KiB
C++
Executable file
/*
|
|
File: exceptions.h
|
|
|
|
Author: R. Bettati
|
|
Department of Computer Science
|
|
Texas A&M University
|
|
Date : 12/09/05
|
|
|
|
Description: High-level exception handling.
|
|
|
|
CPU exceptions are caught by low-level exception and interrupt
|
|
handler stubs, which all eventually cause the high-level
|
|
exception dispatcher to be called (see 'dispatch_exception() below).
|
|
|
|
The dispatcher then looks up the appropriate exception handler
|
|
for the given exception, and calls it.
|
|
Specific exception handlers are installed by registering an exception handler
|
|
object of a class appropriately derived from class 'ExceptionHandler'. The
|
|
functionality of the exception handler is then implemented in function
|
|
'handle_exception(REGS * _regs)'.
|
|
|
|
|
|
*/
|
|
|
|
#ifndef _exceptions_H_ // include file only once
|
|
#define _exceptions_H_
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* INCLUDES */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
#include "assert.H"
|
|
#include "machine.H"
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* E x c e p t i o n H a n d l e r */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
class ExceptionHandler {
|
|
|
|
private:
|
|
|
|
/* The Exception Handler Table */
|
|
const static int EXCEPTION_TABLE_SIZE = 32;
|
|
static ExceptionHandler * handler_table[EXCEPTION_TABLE_SIZE];
|
|
|
|
public:
|
|
|
|
/* -- POPULATE DISPATCHER TABLE */
|
|
|
|
static void register_handler(unsigned int _isr_code,
|
|
ExceptionHandler * _handler);
|
|
/* This function allows to install an exception handler for the given
|
|
exception code. The handler is a function pointer defined above.
|
|
Interrupt handlers are installed as exception handlers as well.
|
|
The 'register_interrupt' function uses irq2isr to map the IRQ
|
|
number to the code. */
|
|
|
|
static void deregister_handler(unsigned int _isr_code);
|
|
|
|
/* -- DISPATCHER */
|
|
static void init_dispatcher();
|
|
/* This function is called to initialize the high-level exception handling.
|
|
No high level exception handlers are installed yet. If an exception
|
|
occurs at this point, the system displays an error message and
|
|
terminates. */
|
|
|
|
static void dispatch_exception(REGS * _r);
|
|
/* This is the high-level exception dispatcher. It dispatches the exception
|
|
to the previously registered exception handler.
|
|
This function is called by the low-level function
|
|
"lowlevel_dispatch_exception(REGS * _r)".*/
|
|
|
|
/* -- MANAGE INSTANCES OF EXCEPTION HANDLERS */
|
|
|
|
virtual void handle_exception(REGS * _regs) {
|
|
assert(false); // sometimes pure virtual functions dont link correctly.
|
|
}
|
|
/* Different exception handlers are derived from the base class ExceptionHandler
|
|
and their functionality is implemented in this function.*/
|
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|