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

VxWorks

开发平台:

C/C++

  1. /* wdbDbgALib.s - i80x86 debugging aids assembly interface */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01f,30may02,hdn  added WDB_CTX_LOAD that is _wdbDbgCtxLoad() (spr 75694)
  7. 01e,23aug01,hdn  added FUNC/FUNC_LABEL, replaced .align w .balign
  8.  fixed stack adjustment bug in wdbDbgBpStub.
  9. 01d,08jan98,dbt  modified for new breakpoint scheme. Added hardware
  10.  breakpoints support
  11. 01c,01jun93,hdn  updated to 5.1.
  12.   - fixed #else and #endif
  13.   - changed VOID to void
  14.   - changed ASMLANGUAGE to _ASMLANGUAGE
  15.   - changed copyright notice
  16. 01b,13oct92,hdn  debugged.
  17. 01a,08jul92,hdn  written based on TRON version.
  18. */
  19. /*
  20. DESCRIPTION
  21. This module contains assembly language routines needed for the debug
  22. package and the i80x86 exception vectors. 
  23. .ne 24
  24. PICTURE OF STACK GROWING
  25. .CS
  26.   
  27.  sp_5 ---------
  28. sp_1(pointer to ESF0)
  29.  sp_4 ---------
  30. sp_2(pointer to REGS)
  31. ---------
  32. 0 or 1
  33.   fp/sp_3 ---------  ---------
  34.      fp  fp
  35.      sp_2 ---------  ---------
  36. db0 db0
  37.  |   |
  38. db7 db7
  39.     edi edi
  40.      |   |
  41.     eax eax
  42.   sp_1 ---------  ---------  ---------
  43.  EIP EIP EIP
  44. ---------  ---------  ---------
  45.  CS  CS  CS
  46. ---------  ---------  ---------
  47.  EFLAGS     EFLAGS     EFLAGS
  48. ---------  ---------  ---------
  49.   
  50.      fig.1      fig.2      fig.3
  51. .CE 
  52.   
  53. SEE ALSO: dbgLib(1), "Debugging"
  54. */
  55. #define _ASMLANGUAGE
  56. #include "vxWorks.h"
  57. #include "asm.h"
  58. #include "wdb/wdbDbgLib.h"
  59. .data
  60. .globl FUNC(copyright_wind_river)
  61. .long FUNC(copyright_wind_river)
  62. /* externals */
  63. .globl FUNC(wdbDbgPreBreakpoint) /* breakpoint processing routine */
  64. .globl FUNC(wdbDbgPreTrace) /* trace processing routine */
  65. .globl  VAR(wdbDbgCtxPc) /* saved PC */
  66. .globl  VAR(wdbDbgCtxCs) /* saved CS */
  67. .globl  VAR(wdbDbgCtxEsp) /* saved ESP */
  68. .globl  VAR(sysCsSuper) /* task level CS */
  69. /* internals */
  70. .globl GTEXT(wdbDbgBpStub) /* breakpoint exceptions handler */
  71. .globl GTEXT(wdbDbgTraceStub) /* trace exceptions handler */
  72. .globl GTEXT(wdbDbgRegsSet) /* set Debug Registers */
  73. .globl GTEXT(_wdbDbgCtxLoad) /* load the new context */
  74. .text
  75. .balign 16
  76. /****************************************************************************
  77. *
  78. * wdbDbgBpStub - software breakpoint handling
  79. *
  80. * This routine is attached to the breakpoint trap (default int $3).  It
  81. * saves the entire task context on the stack and calls wdbDbgBreakpoint () to 
  82. * handle the event.
  83. *
  84. * NOMANUAL
  85. */
  86. FUNC_LABEL(wdbDbgBpStub) /* sp_1: breakpoint trap driver */
  87. pushal /* sp_2: save regs */
  88. movl %db7,%eax
  89. pushl %eax
  90. movl %db6,%eax
  91. pushl %eax
  92. movl %db3,%eax
  93. pushl %eax
  94. movl %db2,%eax
  95. pushl %eax
  96. movl %db1,%eax
  97. pushl %eax
  98. movl %db0,%eax
  99. pushl %eax
  100. movl %esp,%eax /*     : sp points to saved regs */
  101. pushl %ebp /*     : save a frame-pointer */
  102. movl %esp,%ebp /* sp_3: make a frame-pointer */
  103. decl SAVED_REGS+0x4(%ebp) /*     : adjust saved program counter */
  104. pushl $0 /*     : push FALSE is hardware break */
  105. pushl %eax /* sp_4: push pointer to saved regs */
  106. leal SAVED_REGS+0x4(%ebp),%eax
  107. pushl %eax /* sp_5: push pointer to saved info */
  108. call FUNC(wdbDbgPreBreakpoint) /*     : do breakpoint handling */
  109. /* we only return if the breakpoint was hit at interrupt level */
  110. addl $0x10,%esp /* sp_2: pop the params,frame-pointer */
  111. addl $ SAVED_DBGREGS,%esp /*     : pop saved debug registers */
  112. popal /* sp_1: restore regs */
  113. iret
  114. /**************************************************************************
  115. *
  116. * wdbDbgTraceStub - hardware breakpoint and trace exception handling
  117. *
  118. * This routine is attached to the i80x86 trace exception vector.  It saves the
  119. * entire task context on the stack and calls wdbDbgTrace () to handle the event.
  120. * This handler is for any of these situations:
  121. *     (1) Single step. Trap BS=1
  122. *     (2) Hardware instruction breakpoint. Falt Bn=1
  123. *     (3) Hardware data breakpoint. Trap Bn=1
  124. *
  125. * NOMANUAL
  126. */
  127. .balign 16,0x90
  128. FUNC_LABEL(wdbDbgTraceStub) /* sp_1: trace trap driver */
  129. andl $0xfffffeff,0x8(%esp) /* clear TraceFlag in saved EFLAGS */
  130. pushal /* sp_2: save regs */
  131. movl %db7,%eax
  132. pushl %eax
  133. movl %db6,%eax
  134. pushl %eax
  135. movl %db3,%eax
  136. pushl %eax
  137. movl %db2,%eax
  138. pushl %eax
  139. movl %db1,%eax
  140. pushl %eax
  141. movl %db0,%eax
  142. pushl %eax
  143. movl %esp,%eax /*     : sp points to saved regs */
  144. pushl %ebp /*     : save a frame-pointer */
  145. movl %esp,%ebp /* sp_3: make a frame-pointer */
  146. pushl $1 /*     : push TRUE is hardware break */
  147. pushl %eax /* sp_4: push pointer to saved regs */
  148. leal SAVED_REGS+4(%ebp),%eax
  149. pushl %eax /* sp_5: push pointer to saved info */
  150. movl %db6,%eax /* get DR6 debug status reg */
  151. movl %db6,%eax /* get DR6 debug status reg */
  152. xorl %edx,%edx
  153. movl %edx,%db7 /* clear DR7 debug control reg */
  154. movl %edx,%db6 /* clear DR6 debug status reg */
  155. movl %edx,%db3 /* clear DR3 debug reg */
  156. movl %edx,%db2 /* clear DR2 debug reg */
  157. movl %edx,%db1 /* clear DR1 debug reg */
  158. movl %edx,%db0 /* clear DR0 debug reg */
  159. btl $14,%eax /* is it a trace-exception ? */
  160. jc wdbDbgTrace0 /* if yes, jump wdbDbgTrace0 */
  161. orl $0x00010000,SAVED_REGS+12(%ebp) /* set ResumeFlag */
  162. call FUNC(wdbDbgPreBreakpoint) /* do breakpoint handling */
  163. jmp wdbDbgTrace1
  164. .balign 16,0x90
  165. wdbDbgTrace0:
  166. call FUNC(wdbDbgPreTrace) /* do trace handling */
  167. wdbDbgTrace1:
  168. /* we returned from wdbDbgTrace if this was a CONTINUE or the break
  169.  * was hit at interrupt level
  170.  */
  171. addl $0x10,%esp /* sp_2: pop the params,frame-pointer */
  172. popl %eax
  173. movl %eax,%db0
  174. popl %eax
  175. movl %eax,%db1
  176. popl %eax
  177. movl %eax,%db2
  178. popl %eax
  179. movl %eax,%db3
  180. popl %eax
  181. xorl %eax,%eax
  182. movl %eax,%db6 /* clear status bits in DR6 */
  183. popl %eax
  184. movl %eax,%db7
  185. popal /* sp_1: restore regs */
  186. iret
  187. /**************************************************************************
  188. *
  189. * wdbDbgRegsSet - set the debug registers
  190. *
  191. * This routine set hardware breakpoint registers.
  192. *
  193. * SEE ALSO: "i80x86 32-Bit Microprocessor User's Manual"
  194. * void wdbDbgRegsSet (pReg)
  195. *     int *pReg; /* pointer to saved registers *
  196. */
  197. .balign 16,0x90
  198. FUNC_LABEL(wdbDbgRegsSet)
  199. pushl %ebp
  200. movl %esp,%ebp
  201. movl ARG1(%ebp),%edx
  202. movl 0(%edx),%eax
  203. movl %eax,%db0
  204. movl 4(%edx),%eax
  205. movl %eax,%db1
  206. movl 8(%edx),%eax
  207. movl %eax,%db2
  208. movl 12(%edx),%eax
  209. movl %eax,%db3
  210. movl 16(%edx),%eax
  211. movl %eax,%db6
  212. movl 20(%edx),%eax
  213. movl %eax,%db7
  214. leave
  215. ret
  216. /*******************************************************************************
  217. *
  218. * _wdbDbgCtxLoad - Load a new context in the current task
  219. *
  220. * This is just like longjmp, but every register must be loaded.
  221. * You could also look at this as half a context switch.
  222. *
  223. * RETURNS: Never returns
  224. * void _wdbDbgCtxLoad
  225. *     (
  226. *     REG_SET * pRegs /@ Context to load @/
  227. *     )
  228. */
  229. .balign 16,0x90
  230. FUNC_LABEL(_wdbDbgCtxLoad)
  231. movl SP_ARG1(%esp),%eax
  232. movl 0x00(%eax),%edi /* load 5 registers */
  233. movl 0x04(%eax),%esi
  234. movl 0x08(%eax),%ebp
  235. movl 0x10(%eax),%ebx
  236. movl 0x18(%eax),%ecx
  237. cli /* LOCK INTERRUPTS */
  238. movl 0x0c(%eax),%esp /* load the stack pointer */
  239. pushl 0x20(%eax) /* push EFLAGS */
  240. /*
  241.  * Restoring the previous CS(code selector) is required
  242.  * to go back to the int-level context.  This happens
  243.  * when we switch back to the system from the external
  244.  * agent.  To do this, the CS should be included in the
  245.  * REG_SET.  In the mean time, the CS in the breakpoint 
  246.  * and trace exception stack frame is saved in the 
  247.  * handler and restored here.  To find the right REG_SET, 
  248.  * the saved PC(program counter) and ESP(stack pointer) 
  249.  * are compared to ones in REG_SET beforehand.
  250.  */
  251. movl 0x24(%eax),%edx /* get the PC in REG_SET */
  252. cmpl FUNC(wdbDbgCtxPc),%edx /* compare the PC */
  253. jne wdbDbgCtxLoad0 /* jump if different */
  254. movl 0x0c(%eax),%edx /* get the ESP in REG_SET */
  255. cmpl FUNC(wdbDbgCtxEsp),%edx /* compare the ESP */
  256. jne wdbDbgCtxLoad0 /* jump if different */
  257. pushl FUNC(wdbDbgCtxCs) /* push the previous CS */
  258. jmp wdbDbgCtxLoad1
  259. wdbDbgCtxLoad0:
  260. pushl FUNC(sysCsSuper) /* push the task level CS */
  261. wdbDbgCtxLoad1:
  262. pushl 0x24(%eax) /* push PC */
  263. movl 0x14(%eax),%edx /* load remaining 2 registers */
  264. movl 0x1c(%eax),%eax
  265. iret /* UNLOCK INTERRUPTS */