excArchShow.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:7k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* excArchShow.c - I80X86 exception show facilities */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01d,28aug01,hdn  added new SSE SIMD exception 
  8.  added esp, ss, esp0, cr[23], esp0[07] to EXC_INFO.
  9. 01c,09apr98,hdn  added support for Pentium, PentiumPro.
  10. 01b,29may94,hdn  removed I80486 conditional.
  11. 01a,08jun93,hdn  extracted from excI86Lib.c.
  12. */
  13. /*
  14. This module contains I80X86 architecture dependent portions of the
  15. exception handling facilities.  See excLib for the portions that are
  16. architecture independent.
  17. SEE ALSO: dbgLib, sigLib, intLib, "Debugging"
  18. */
  19. #include "vxWorks.h"
  20. #include "esf.h"
  21. #include "iv.h"
  22. #include "taskLib.h"
  23. #include "errno.h"
  24. #include "string.h"
  25. #include "logLib.h"
  26. #include "stdio.h"
  27. #include "fioLib.h"
  28. #include "intLib.h"
  29. #include "qLib.h"
  30. #include "private/kernelLibP.h"
  31. #include "private/funcBindP.h"
  32. /* globals */
  33. FUNCPTR excMcaInfoShow = NULL;
  34. /* locals */
  35. /* 
  36.  * Exception error messages.  These are used by the exception printing routine.
  37.  * Exception numbers are the same as used by the CPU.
  38.  */
  39. LOCAL char *excMsgs [] =
  40.     {
  41.     "Divide Error", /*  0 */
  42.     "Debug", /*  1 */
  43.     "Nonmaskable Interrupt", /*  2 */
  44.     "Breakpoint", /*  3 */
  45.     "Overflow", /*  4 */
  46.     "Bound", /*  5 */
  47.     "Invalid Opcode", /*  6 */
  48.     "Device Not Available", /*  7 */
  49.     "Double Fault", /*  8 */
  50.     "Coprocessor Overrun", /*  9 */
  51.     "Invalid TSS", /* 10 */
  52.     "Segment Not Present", /* 11 */
  53.     "Stack Fault", /* 12 */
  54.     "General Protection Fault", /* 13 */
  55.     "Page Fault", /* 14 */
  56.     "Intel Reserved", /* 15 */
  57.     "Coprocessor Error", /* 16 */
  58.     "Alignment Check", /* 17 */
  59.     "Machine Check", /* 18 */
  60.     "Streaming SIMD", /* 19 */
  61.     };
  62. LOCAL char *excIntInfoFmt = "n
  63. Uninitialized Interrupt!n
  64. Vector number %d (0-255). %sn
  65. Supervisor ESP : 0x%08xn
  66. Program Counter: 0x%08xn
  67. Code Selector  : 0x%08xn
  68. Eflags Register: 0x%08xn";
  69. /* forward declarations */
  70. LOCAL void excInfoShow   (EXC_INFO * pExcInfo, BOOL doBell);
  71. LOCAL void excIntInfoShow (int vecNum, ESF0 * pEsf, REG_SET * pRegs,
  72.    EXC_INFO * pExcInfo);
  73. LOCAL void excPanicShow   (int vecNum, ESF0 * pEsf, REG_SET * pRegs,
  74.    EXC_INFO * pExcInfo);
  75. /*******************************************************************************
  76. *
  77. * excShowInit - initialize exception show facility
  78. *
  79. * NOMANUAL
  80. */
  81. STATUS excShowInit (void)
  82.     {
  83.     _func_excInfoShow = (FUNCPTR) excInfoShow;
  84.     _func_excIntHook = (FUNCPTR) excIntInfoShow;
  85.     _func_excPanicHook = (FUNCPTR) excPanicShow;
  86.     return (OK);
  87.     }
  88. /*******************************************************************************
  89. *
  90. * excInfoShow - print exception info
  91. *
  92. * NOMANUAL
  93. */
  94. LOCAL void excInfoShow
  95.     (
  96.     EXC_INFO * pExcInfo, /* exception information to summarize */
  97.     BOOL doBell /* print task id and ring warning bell */
  98.     )
  99.     {
  100.     int valid = pExcInfo->valid;
  101.     int vecNum = pExcInfo->vecNum;
  102.     char * extraExcMsg = ""; /* additional message for exec/rd/wr
  103.  * access to oool unmapped area, or 
  104.  * stack gard pages 
  105.  */
  106.     if (valid & EXC_VEC_NUM)
  107. {
  108. if ((vecNum < NELEMENTS (excMsgs)) && (excMsgs [vecNum] != NULL))
  109.     printExc ("n%sn", (int) excMsgs [vecNum], 0, 0, 0, 0);
  110. else
  111.     printExc ("nTrap to uninitialized vector number %d (0-255).n",
  112.       vecNum, 0, 0, 0, 0);
  113. printExc ("Page Dir Base   : 0x%08xn", pExcInfo->cr3, 0, 0, 0, 0);
  114.         printExc ("Esp0 0x%08x : 0x%08x, 0x%08x, 0x%08x, 0x%08xn",
  115.   pExcInfo->esp0, pExcInfo->esp00, pExcInfo->esp01,
  116.   pExcInfo->esp02, pExcInfo->esp03);
  117.         printExc ("Esp0 0x%08x : 0x%08x, 0x%08x, 0x%08x, 0x%08xn",
  118.   pExcInfo->esp0+16, pExcInfo->esp04, pExcInfo->esp05,
  119.   pExcInfo->esp06, pExcInfo->esp07);
  120. printExc ("Program Counter : 0x%08xn", (int)pExcInfo->pc, 0, 0, 0, 0);
  121. printExc ("Code Selector   : 0x%08xn", pExcInfo->cs, 0, 0, 0, 0);
  122. printExc ("Eflags Register : 0x%08xn", pExcInfo->eflags, 0, 0, 0, 0);
  123. }
  124.     if (valid & EXC_ERROR_CODE)
  125. printExc ("Error Code      : 0x%08xn", pExcInfo->errCode, 0, 0, 0, 0);
  126.     if (valid & EXC_CR2)
  127. {
  128. printExc ("Page Fault Addr : 0x%08x %sn", pExcInfo->cr2, 
  129.   (int)extraExcMsg, 0, 0, 0);
  130. }
  131.     if (doBell)
  132. printExc ("Task: %#x "%s"07n", (int)taskIdCurrent, 
  133.   (int)taskName ((int)taskIdCurrent), 0, 0, 0);
  134.     if ((vecNum == 18) && (excMcaInfoShow != NULL))
  135. (* excMcaInfoShow) ();
  136.     }
  137. /*******************************************************************************
  138. *
  139. * excIntInfoShow - print out uninitialized interrupt info
  140. */
  141. LOCAL void excIntInfoShow
  142.     (
  143.     int vecNum, /* exception vector number */
  144.     ESF0 * pEsf, /* pointer to exception stack frame */
  145.     REG_SET * pRegs, /* pointer to register info on stack */
  146.     EXC_INFO * pExcInfo /* parsed exception information */
  147.     )
  148.     {
  149.     char * vecName = "";
  150.     int valid      = pExcInfo->valid;
  151.     if ((vecNum < NELEMENTS (excMsgs)) && (excMsgs [vecNum] != NULL))
  152. vecName = excMsgs [vecNum];
  153.     if (Q_FIRST (&activeQHead) == NULL) /* pre kernel */
  154. {
  155.         if (valid & EXC_VEC_NUM)
  156.     {
  157.     printExc ("nUninitialized Interrupt!nVector No %d (0-255). %sn",
  158.       vecNum, (int)vecName, 0, 0, 0);
  159.             printExc ("Supervisor ESP : 0x%08xn", pExcInfo->esp0, 0, 0, 0, 0);
  160.     printExc ("Program Counter: 0x%08xn", (int)pExcInfo->pc, 0,0,0,0);
  161.     printExc ("Code Selector  : 0x%08xn", pExcInfo->cs, 0,0,0,0);
  162.     printExc ("Eflags         : 0x%08xn", pExcInfo->eflags, 0,0,0,0);
  163.     }
  164. }
  165.     else
  166. {
  167. logMsg (excIntInfoFmt, vecNum, (int)vecName, (int)pExcInfo->esp0,
  168. (int)pExcInfo->pc, (int)pExcInfo->cs, (int)pExcInfo->eflags);
  169. }
  170.     }
  171. /*******************************************************************************
  172. *
  173. * excPanicShow - exception at interrupt level
  174. *
  175. * This routine is called if an exception is caused at interrupt
  176. * level.  We can't handle it in the usual way.  Instead, we save info in
  177. * sysExcMsg and trap to rom monitor.
  178. */
  179. LOCAL void excPanicShow
  180.     (
  181.     int vecNum, /* exception vector number */
  182.     ESF0 * pEsf, /* pointer to exception stack frame */
  183.     REG_SET * pRegs, /* pointer to register info on stack */
  184.     EXC_INFO * pExcInfo /* parsed exception information */
  185.     )
  186.     {
  187.     if (INT_CONTEXT ())
  188. printExc (" nException at interrupt level:n", 0, 0, 0, 0, 0);
  189.     if (kernelState != FALSE)
  190. printExc (" nException in kernel state:n", 0, 0, 0, 0, 0);
  191.     if (Q_FIRST (&activeQHead) == NULL)
  192. printExc ("Exception before kernel initialized:n", 0, 0, 0, 0, 0);
  193.     excInfoShow (pExcInfo, FALSE); /* print the message into sysExcMsg */
  194.     printExc ("Regs at 0x%xn", (int) pRegs, 0, 0, 0, 0);
  195.     }