📄 exceptions.c
字号:
/*
* File: exceptions.c
* Purpose: Generic exception handling for ColdFire processors
*
*/
#include "derivative.h"
#include "exceptions.h"
#include "startcf.h"
#define REGISTER_ABI __REGABI__
void _Entry(void);
/***********************************************************************/
/*
* Set NO_PRINTF to 0 in order the exceptions.c interrupt handler
* to output messages to the standard io.
*
*/
#define NO_PRINTF 1
#if NO_PRINTF
#define VECTORDISPLAY(MESSAGE) asm { nop; };
#define VECTORDISPLAY2(MESSAGE,MESSAGE2) asm { nop; };
#define VECTORDISPLAY3(MESSAGE,MESSAGE2,MESSAGE3) asm { nop; };
#else
#include <stdio.h>
#define VECTORDISPLAY(MESSAGE1) printf(MESSAGE1);
#define VECTORDISPLAY2(MESSAGE1,MESSAGE2) printf(MESSAGE1,MESSAGE2);
#define VECTORDISPLAY3(MESSAGE1,MESSAGE2,MESSAGE3) printf(MESSAGE1,MESSAGE2,MESSAGE3);
#endif
#ifdef __cplusplus
extern "C" {
#endif
extern unsigned long far _SP_INIT[];
/***********************************************************************/
/*
* Handling of the TRK ColdFire libs (printf support in Debugger Terminal)
*
* To enable this support:
* - Set CONSOLE_IO_SUPPORT 1 in this file; this will enable
* TrapHandler_printf for the trap #14 exception.
*
* - Make sure the file console_io_cf.c is in your project.
*
* - In the debugger make sure that in the Connection "Setup" dialog,
* "Debug Options" property page, the check box
* "Enable Terminal printf support" is set.
*
*
*
*/
#define CONSOLE_IO_SUPPORT 0
#if CONSOLE_IO_SUPPORT
asm void TrapHandler_printf(void) {
HALT
RTE
}
#endif
/***********************************************************************/
/*
* This is the handler for all exceptions which are not common to all
* ColdFire Chips.
*
* Called by mcf_exception_handler
*
*/
void derivative_interrupt(unsigned long vector)
{
if (vector < 64 || vector > 192) {
VECTORDISPLAY2("User Defined Vector #%d\n",vector);
}
}
/***********************************************************************
*
* This is the exception handler for all exceptions common to all
* chips ColdFire. Most exceptions do nothing, but some of the more
* important ones are handled to some extent.
*
* Called by asm_exception_handler
*
* The ColdFire family of processors has a simplified exception stack
* frame that looks like the following:
*
* 3322222222221111 111111
* 1098765432109876 5432109876543210
* 8 +----------------+----------------+
* | Program Counter |
* 4 +----------------+----------------+
* |FS/Fmt/Vector/FS| SR |
* SP --> 0 +----------------+----------------+
*
* The stack self-aligns to a 4-byte boundary at an exception, with
* the FS/Fmt/Vector/FS field indicating the size of the adjustment
* (SP += 0,1,2,3 bytes).
* 31 28 27 26 25 18 17 16 15 0
* 4 +---------------------------------------+------------------------------------+
* | Format | FS[3..2] | Vector | FS[1..0] | SR |
* SP --> 0 +---------------------------------------+------------------------------------+
*/
#define MCF5XXX_RD_SF_FORMAT(PTR) \
((*((unsigned short *)(PTR)) >> 12) & 0x00FF)
#define MCF5XXX_RD_SF_VECTOR(PTR) \
((*((unsigned short *)(PTR)) >> 2) & 0x00FF)
#define MCF5XXX_RD_SF_FS(PTR) \
( ((*((unsigned short *)(PTR)) & 0x0C00) >> 8) | (*((unsigned short *)(PTR)) & 0x0003) )
#define MCF5XXX_SF_SR(PTR) *(((unsigned short *)(PTR))+1)
#define MCF5XXX_SF_PC(PTR) *((unsigned long *)(PTR)+1)
#define MCF5XXX_EXCEPTFMT "%s -- PC = %#08X\n"
void mcf_exception_handler(void *framepointer)
{
volatile unsigned long exceptionStackFrame = (*(unsigned long *)(framepointer));
volatile unsigned short stackFrameSR = MCF5XXX_SF_SR(framepointer);
volatile unsigned short stackFrameWord = (*(unsigned short *)(framepointer));
volatile unsigned long stackFrameFormat = (unsigned long)MCF5XXX_RD_SF_FORMAT(&stackFrameWord);
volatile unsigned long stackFrameFS = (unsigned long)MCF5XXX_RD_SF_FS(&stackFrameWord);
volatile unsigned long stackFrameVector = (unsigned long)MCF5XXX_RD_SF_VECTOR(&stackFrameWord);
volatile unsigned long stackFramePC = MCF5XXX_SF_PC(framepointer);
switch (stackFrameFormat)
{
case 4:
case 5:
case 6:
case 7:
break;
default:
VECTORDISPLAY3(MCF5XXX_EXCEPTFMT,"Illegal stack type", stackFramePC);
break;
}
switch (stackFrameVector)
{
case 2:
VECTORDISPLAY3(MCF5XXX_EXCEPTFMT, "Access Error", stackFramePC);
switch (stackFrameFS)
{
case 4:
VECTORDISPLAY("Error on instruction fetch\n");
break;
case 8:
VECTORDISPLAY("Error on operand write\n");
break;
case 9:
VECTORDISPLAY("Attempted write to write-protected space\n");
break;
case 12:
VECTORDISPLAY("Error on operand read\n");
break;
default:
VECTORDISPLAY("Reserved Fault Status Encoding\n");
break;
}
break;
case 3:
VECTORDISPLAY3(MCF5XXX_EXCEPTFMT, "Address Error", stackFramePC);
switch (stackFrameFS)
{
case 4:
VECTORDISPLAY("Error on instruction fetch\n");
break;
case 8:
VECTORDISPLAY("Error on operand write\n");
break;
case 9:
VECTORDISPLAY("Attempted write to write-protected space\n");
break;
case 12:
VECTORDISPLAY("Error on operand read\n");
break;
default:
VECTORDISPLAY("Reserved Fault Status Encoding\n");
break;
}
break;
case 4:
VECTORDISPLAY3(MCF5XXX_EXCEPTFMT, "Illegal instruction", stackFramePC);
break;
case 8:
VECTORDISPLAY3(MCF5XXX_EXCEPTFMT, "Privilege violation", stackFramePC);
break;
case 9:
VECTORDISPLAY3(MCF5XXX_EXCEPTFMT, "Trace Exception", stackFramePC);
break;
case 10:
VECTORDISPLAY3(MCF5XXX_EXCEPTFMT, "Unimplemented A-Line Instruction", stackFramePC);
break;
case 11:
VECTORDISPLAY3(MCF5XXX_EXCEPTFMT, "Unimplemented F-Line Instruction", stackFramePC);
break;
case 12:
VECTORDISPLAY3(MCF5XXX_EXCEPTFMT, "Debug Interrupt", stackFramePC);
break;
case 14:
VECTORDISPLAY3(MCF5XXX_EXCEPTFMT, "Format Error", stackFramePC);
break;
case 15:
VECTORDISPLAY3(MCF5XXX_EXCEPTFMT, "Unitialized Interrupt", stackFramePC);
break;
case 24:
VECTORDISPLAY3(MCF5XXX_EXCEPTFMT, "Spurious Interrupt", stackFramePC);
break;
case 25:
case 26:
case 27:
case 28:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -