📄 excarchshow.c
字号:
/* excArchShow.c - I80X86 exception show facilities *//* Copyright 1984-1998 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------01c,09apr98,hdn added support for Pentium, PentiumPro.01b,29may94,hdn removed I80486 conditional.01a,08jun93,hdn extracted from excI86Lib.c.*//*This module contains I80X86 architecture dependent portions of theexception handling facilities. See excLib for the portions that arearchitecture independent.SEE ALSO: dbgLib, sigLib, intLib, "Debugging"*/#include "vxWorks.h"#include "esf.h"#include "iv.h"#include "taskLib.h"#include "errno.h"#include "string.h"#include "logLib.h"#include "stdio.h"#include "fioLib.h"#include "intLib.h"#include "qLib.h"#include "private/kernelLibP.h"#include "private/funcBindP.h"/* globals */FUNCPTR excMcaInfoShow = NULL;/* locals *//* * Exception error messages. These are used by the exception printing routine. * Exception numbers are the same as used by the CPU. */LOCAL char *excMsgs [] = { "Divide Error", /* 0 */ "Debug", /* 1 */ "Nonmaskable Interrupt", /* 2 */ "Breakpoint", /* 3 */ "Overflow", /* 4 */ "Bound", /* 5 */ "Invalid Opcode", /* 6 */ "Device Not Available", /* 7 */ "Double Fault", /* 8 */ "Coprocessor Overrun", /* 9 */ "Invalid TSS", /* 10 */ "Segment Not Present", /* 11 */ "Stack Fault", /* 12 */ "General Protection Fault", /* 13 */ "Page Fault", /* 14 */ "Intel Reserved", /* 15 */ "Coprocessor Error", /* 16 */ "Alignment Check", /* 17 */ "Machine Check", /* 18 */ };LOCAL char *excIntInfoFmt = "\n\Uninitialized Interrupt!\n\Vector number %d (0-255). %s\n\Program Counter: 0x%08x\n\Status Register: 0x%08x\n";/* forward declarations */LOCAL void excInfoShow (EXC_INFO *pExcInfo, BOOL doBell);LOCAL void excIntInfoShow (int vecNum, ESF0 *pEsf, REG_SET *pRegs, EXC_INFO *pExcInfo);LOCAL void excPanicShow (int vecNum, ESF0 *pEsf, REG_SET *pRegs, EXC_INFO *pExcInfo);/********************************************************************************* excShowInit - initialize exception show facility** NOMANUAL*/STATUS excShowInit (void) { _func_excInfoShow = (FUNCPTR) excInfoShow; _func_excIntHook = (FUNCPTR) excIntInfoShow; _func_excPanicHook = (FUNCPTR) excPanicShow; return (OK); }/********************************************************************************* excInfoShow - print exception info** NOMANUAL*/LOCAL void excInfoShow ( EXC_INFO * pExcInfo, /* exception information to summarize */ BOOL doBell /* print task id and ring warning bell */ ) { FAST int valid = pExcInfo->valid; FAST int vecNum = pExcInfo->vecNum; if (valid & EXC_VEC_NUM) { if ((vecNum < NELEMENTS (excMsgs)) && (excMsgs [vecNum] != NULL)) printExc ("\n%s\n", (int) excMsgs [vecNum], 0, 0, 0, 0); else printExc ("\nTrap to uninitialized vector number %d (0-255).\n", vecNum, 0, 0, 0, 0); printExc ("Program Counter: 0x%08x\n", (int)pExcInfo->pc, 0, 0, 0, 0); printExc ("Status Register: 0x%08x\n", pExcInfo->statusReg, 0, 0, 0, 0); } if (valid & EXC_ERROR_CODE) printExc ("Error Code: 0x%08x\n", pExcInfo->errCode, 0, 0, 0, 0); if (doBell) printExc ("Task: %#x \"%s\"\007\n", (int)taskIdCurrent, (int)taskName ((int)taskIdCurrent), 0, 0, 0); if ((vecNum == 18) && (excMcaInfoShow != NULL)) (* excMcaInfoShow) (); }/********************************************************************************* excIntInfoShow - print out uninitialized interrupt info*/LOCAL void excIntInfoShow ( int vecNum, /* exception vector number */ ESF0 * pEsf, /* pointer to exception stack frame */ REG_SET * pRegs, /* pointer to register info on stack */ EXC_INFO * pExcInfo /* parsed exception information */ ) { char *vecName = ""; if ((vecNum < NELEMENTS (excMsgs)) && (excMsgs [vecNum] != NULL)) vecName = excMsgs [vecNum]; if (Q_FIRST (&activeQHead) == NULL) /* pre kernel */ printExc (excIntInfoFmt, vecNum, (int)vecName, (int)pEsf->pc, (int)pEsf->eflags, 0); else logMsg (excIntInfoFmt, vecNum, (int)vecName, (int)pEsf->pc, (int)pEsf->eflags, 0, 0); }/********************************************************************************* excPanicShow - exception at interrupt level** This routine is called if an exception is caused at interrupt* level. We can't handle it in the usual way. Instead, we save info in* sysExcMsg and trap to rom monitor.*/LOCAL void excPanicShow ( int vecNum, /* exception vector number */ ESF0 * pEsf, /* pointer to exception stack frame */ REG_SET * pRegs, /* pointer to register info on stack */ EXC_INFO * pExcInfo /* parsed exception information */ ) { if (INT_CONTEXT ()) printExc (" \nException at interrupt level:\n", 0, 0, 0, 0, 0); if (Q_FIRST (&activeQHead) == NULL) printExc ("Exception before kernel initialized:\n", 0, 0, 0, 0, 0); excInfoShow (pExcInfo, FALSE); /* print the message into sysExcMsg */ printExc ("Regs at 0x%x\n", (int) pRegs, 0, 0, 0, 0); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -