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

VxWorks

开发平台:

C/C++

  1. /* excArchLib.c - architecture-specific exception-handling facilities */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01o,05jun02,wsl  remove reference to SPARC and i960
  8. 01n,20nov01,hdn  updated x86 specific sections.
  9. 01m,13nov01,hbh  Updated for simulators.
  10. 01l,29oct01,zl   updated SH specific sections.
  11. 01k,03mar00,zl   merged SH support into T2
  12. 01j,26mar97,jdi  tam  added excCrtConnect() and excIntCrtConnect() for PPC 403.
  13. 01j,27feb97,jpd  added ARM-specific documentation.
  14. 01i,23mar96,jdi  doc: edits to PowerPC additions.
  15. 01h,08mar96,kkk  added PowerPC specific routines.
  16. 01g,25nov95,jdi  removed 29k stuff.
  17. 01f,06oct95,jdi  removed .pG "Debugging".
  18. 01e,10feb95,jdi  changed 80960 to i960.
  19. 01d,30jan95,rhp  added MIPS, i386/i486 doc.
  20. 01c,02dec93,pme  added Am29K family support.
  21. 01b,20jan93,jdi  documenation cleanup.
  22. 01a,23sep92,jdi  written, based on excArchLib.c for
  23.  mc68k, sparc, i960, mips.
  24. */
  25. /*
  26. This library contains exception-handling facilities that are architecture
  27. dependent.  For information about generic (architecture-independent)
  28. exception-handling, see the manual entry for excLib.
  29. INCLUDE FILES: excLib.h
  30. SEE ALSO: excLib, dbgLib, sigLib, intLib
  31. */
  32. /*******************************************************************************
  33. *
  34. * excVecInit - initialize the exception/interrupt vectors
  35. *
  36. * This routine sets all exception vectors to point to the appropriate
  37. * default exception handlers.  These handlers will safely trap and report
  38. * exceptions caused by program errors or unexpected hardware interrupts.
  39. * .IP `MC680x0': 8
  40. * All vectors from vector 2 (address 0x0008) to 255 (address 0x03fc) are
  41. * initialized.  Vectors 0 and 1 contain the reset stack pointer and program
  42. * counter.
  43. * ".IP `SPARC':
  44. * "All vectors from 0 (offset 0x000) through 255 (offset 0xff0) are
  45. * "initialized.
  46. * ".IP `i960':
  47. * "The i960 fault table is filled with
  48. * "a default fault handler, and all non-reserved vectors in the i960
  49. * "interrupt table are filled with a default interrupt handler.
  50. * .IP `MIPS':
  51. * All MIPS exception, trap, and interrupt vectors are set to default handlers.
  52. * .IP `x86':
  53. * All vectors from vector 0 (address (0x0000) to 255 (address 0x07f8) are
  54. * initialized to default handlers.
  55. * .IP `PowerPC':
  56. * There are 48 vectors and only vectors that are used are initialized.
  57. * .IP `SH':
  58. * There are 256 vectors, initialized with the default exception handler (for 
  59. * exceptions) or the unitialized interrupt handler (for interupts).
  60. * On SH-2, vectors 0 and 1 contain the power-on reset program counter and 
  61. * stack pointer. Vectors 2 and 3 contain the manual reset program counter and
  62. * stack pointer. On SH-3 and SH-4 processors the vector table is located at 
  63. * (vbr + 0x800), and the (exception code / 8) value is used as vector offset.
  64. * The first two vectors are reserved for special use: "trapa #0" (offset 0x0)
  65. * to implement software breakpoint, and "trapa #1' (offset 0x4) to detect 
  66. * integer zero divide exception.
  67. * .IP `ARM':
  68. * All exception vectors are initialized to default handlers except 0x14
  69. * (Address) which is now reserved on the ARM and 0x1C (FIQ), which is not
  70. * used by VxWorks.
  71. * .IP `SimSolaris/SimNT':
  72. * This routine does nothing on both simulators and always returns OK.
  73. * .LP
  74. *
  75. * NOTE
  76. * This routine is usually called from the system start-up routine,
  77. * usrInit(), in usrConfig.c.  It must be called before interrupts are enabled.
  78. * "(SPARC: It must also be called when the system runs with the on-chip windows
  79. * "(no stack)).
  80. *
  81. * RETURNS: OK, always.
  82. *
  83. * SEE ALSO: excLib
  84. */
  85. STATUS excVecInit (void)
  86.     {
  87.     ...
  88.     }
  89. /****************************************************************************
  90. *
  91. * excConnect - connect a C routine to an exception vector (PowerPC)
  92. *
  93. * This routine connects a specified C routine to a specified exception
  94. * vector.  An exception stub is created and in placed at <vector> in the
  95. * exception table.  The address of <routine> is stored in the exception stub
  96. * code.  When an exception occurs, the processor jumps to the exception stub
  97. * code, saves the registers, and calls the C routines.
  98. *
  99. * The routine can be any normal C code, except that it must not
  100. * invoke certain operating system functions that may block or perform
  101. * I/O operations.
  102. *
  103. * The registers are saved to an Exception Stack Frame (ESF) placed on the
  104. * stack of the task that has produced the exception.  The structure of the
  105. * ESF used to save the registers is defined in h/arch/ppc/esfPpc.h.
  106. *
  107. * The only argument passed by the exception stub to the C routine is a pointer
  108. * to the ESF containing the registers values.  The prototype of this C routine
  109. * is described below:
  110. * .CS
  111. *     void excHandler (ESFPPC *);
  112. * .CE
  113. *
  114. * When the C routine returns, the exception stub restores the registers saved
  115. * in the ESF and continues execution of the current task.
  116. *
  117. * RETURNS: OK, always.
  118. *
  119. * SEE ALSO: excIntConnect(), excVecSet()
  120. */
  121. STATUS excConnect
  122.     (
  123.     VOIDFUNCPTR * vector,   /* exception vector to attach to */
  124.     VOIDFUNCPTR   routine   /* routine to be called */
  125.     )
  126.     {
  127.     ...
  128.     }
  129. /****************************************************************************
  130. *
  131. * excIntConnect - connect a C routine to an asynchronous exception vector (PowerPC, ARM)
  132. *
  133. * This routine connects a specified C routine to a specified asynchronous
  134. * exception vector.
  135. *
  136. * When the C routine is invoked, interrupts are still locked.  It is the
  137. * responsibility of the C routine to re-enable the interrupt.
  138. *
  139. * The routine can be any normal C code, except that it must not
  140. * invoke certain operating system functions that may block or perform
  141. * I/O operations.
  142. *
  143. * NOTE:
  144. * On PowerPC, the vector is typically the external interrupt vector
  145. * 0x500 and the decrementer vector 0x900.  An interrupt stub is created
  146. * and placed at <vector> in the exception table.  The address of
  147. * <routine> is stored in the interrupt stub code.  When the asynchronous
  148. * exception occurs the processor jumps to the interrupt stub code, saves
  149. * only the requested registers, and calls the C routines.
  150. *
  151. * Before saving the requested registers, the interrupt stub switches from the
  152. * current task stack to the interrupt stack.  For nested interrupts, no
  153. * stack-switching is performed, because the interrupt is already set.
  154. *
  155. * NOTE:
  156. * On the ARM, the address of <routine> is stored in a function pointer
  157. * to be called by the stub installed on the IRQ exception vector
  158. * following an asynchronous exception.  This routine is responsible for
  159. * determining the interrupt source and despatching the correct handler
  160. * for that source.
  161. *
  162. * Before calling the routine, the interrupt stub switches to SVC mode,
  163. * changes to a separate interrupt stack and saves necessary registers. In
  164. * the case of a nested interrupt, no SVC stack switch occurs.
  165. *
  166. * RETURNS: OK, always.
  167. *
  168. * SEE ALSO: excConnect(), excVecSet()
  169. */
  170. STATUS excIntConnect
  171.     (
  172.     VOIDFUNCPTR * vector,         /* exception vector to attach to */
  173.     VOIDFUNCPTR   routine         /* routine to be called */
  174.     )
  175.     {
  176.     ...
  177.     }
  178. /*******************************************************************************
  179. *
  180. * excCrtConnect - connect a C routine to a critical exception vector (PowerPC 403)
  181. *
  182. * This routine connects a specified C routine to a specified critical exception
  183. * vector.  An exception stub is created and in placed at <vector> in the
  184. * exception table.  The address of <routine> is stored in the exception stub
  185. * code.  When an exception occurs, the processor jumps to the exception stub
  186. * code, saves the registers, and call the C routines.
  187. *
  188. * The routine can be any normal C code, except that it must not
  189. * invoke certain operating system functions that may block or perform
  190. * I/O operations.
  191. *
  192. * The registers are saved to an Exception Stack Frame (ESF) which is placed
  193. * on the stack of the task that has produced the exception.  The ESF structure
  194. * is defined in h/arch/ppc/esfPpc.h.
  195. *
  196. * The only argument passed by the exception stub to the C routine is a pointer
  197. * to the ESF containing the register values.  The prototype of this C routine
  198. * is as follows:
  199. * .CS
  200. *     void excHandler (ESFPPC *);
  201. * .CE
  202. *
  203. * When the C routine returns, the exception stub restores the registers saved
  204. * in the ESF and continues execution of the current task.
  205. *
  206. * RETURNS: OK, always.
  207. * SEE ALSO: excIntConnect(), excIntCrtConnect, excVecSet()
  208. */
  209. STATUS excCrtConnect
  210.     (
  211.     VOIDFUNCPTR * vector,               /* exception vector to attach to */
  212.     VOIDFUNCPTR   routine               /* routine to be called */
  213.     )
  214.     {
  215.     ...
  216.     }
  217. /*******************************************************************************
  218. *
  219. * excIntCrtConnect - connect a C routine to a critical interrupt vector (PowerPC 403)
  220. *
  221. * This routine connects a specified C routine to a specified asynchronous 
  222. * critical exception vector such as the critical external interrupt vector 
  223. * (0x100), or the watchdog timer vector (0x1020).  An interrupt stub is created 
  224. * and placed at <vector> in the exception table.  The address of <routine> is 
  225. * stored in the interrupt stub code.  When the asynchronous exception occurs,
  226. * the processor jumps to the interrupt stub code, saves only the requested 
  227. * registers, and calls the C routines.
  228. *
  229. * When the C routine is invoked, interrupts are still locked.  It is the
  230. * C routine's responsibility to re-enable interrupts.
  231. *
  232. * The routine can be any normal C routine, except that it must not
  233. * invoke certain operating system functions that may block or perform
  234. * I/O operations.
  235. *
  236. * Before the requested registers are saved, the interrupt stub switches from the
  237. * current task stack to the interrupt stack.  In the case of nested interrupts, no
  238. * stack switching is performed, because the interrupt stack is already set.
  239. *
  240. * RETURNS: OK, always.
  241. * SEE ALSO: excConnect(), excCrtConnect, excVecSet()
  242. */
  243. STATUS excIntCrtConnect
  244.     (
  245.     VOIDFUNCPTR * vector,               /* exception vector to attach to */
  246.     VOIDFUNCPTR   routine               /* routine to be called */
  247.     )
  248.     {
  249.     ...
  250.     }
  251. /****************************************************************************
  252. *
  253. * excVecSet - set a CPU exception vector (PowerPC, ARM)
  254. *
  255. * This routine specifies the C routine that will be called when the exception
  256. * corresponding to <vector> occurs.  This routine does not create the
  257. * exception stub; it simply replaces the C routine to be called in the
  258. * exception stub.
  259. *
  260. * NOTE ARM:
  261. * On the ARM, there is no excConnect() routine, unlike the PowerPC. The C
  262. * routine is attached to a default stub using excVecSet().
  263. *
  264. * RETURNS: N/A
  265. *
  266. * SEE ALSO: excVecGet(), excConnect(), excIntConnect()
  267. */
  268. void excVecSet
  269.     (
  270.     FUNCPTR * vector,     /* vector offset */
  271.     FUNCPTR   function    /* address to place in vector */
  272.     )
  273.     {
  274.     ...
  275.     }
  276. /****************************************************************************
  277. *
  278. * excVecGet - get a CPU exception vector (PowerPC, ARM)
  279. *
  280. * This routine returns the address of the C routine currently connected to
  281. * <vector>.
  282. *
  283. * RETURNS: The address of the C routine.
  284. *
  285. * SEE ALSO: excVecSet()
  286. */
  287. FUNCPTR excVecGet
  288.     (
  289.     FUNCPTR * vector   /* vector offset */
  290.     )
  291.     {
  292.     ...
  293.     }