⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 excarchshow.c

📁 vxworks源码源码解读是学习vxworks的最佳途径
💻 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 + -