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

VxWorks

开发平台:

C/C++

  1. /* sigCtxALib.s - software signal architecture support library */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01i,30may02,hdn  added locking interrupt in _sigCtxLoad and
  7.  stopped corrupting current stack (spr 75694)
  8. 01h,23aug01,hdn  added FUNC/FUNC_LABEL, replaced .align with .balign
  9.  replaced sysCodeSelector with sysCsSuper.
  10. 01g,06apr98,hdn  fixed a bug in __sigCtxLoad (SPR-20903).
  11. 01f,17jun96,hdn  changed CODE_SELECTOR to sysCodeSelector.
  12. 01e,16may95,ms   made __sigCtxSave() save the interrupt mask.
  13. 01d,24oct94,hdn  deleted cli in __sigCtxLoad.
  14. 01c,17oct94,hdn  fixed a bug in __sigCtxLoad.
  15. 01b,13sep93,hdn  added adding 4 bytes to sp before it is saved.
  16. 01a,15jun93,hdn  written based on mc68k version.
  17. */
  18. /*
  19. This library provides the architecture specific support needed by
  20. software signals.
  21. */
  22. #define _ASMLANGUAGE
  23. #include "vxWorks.h"
  24. #include "asm.h"
  25. #include "regs.h"
  26. .text
  27. .globl FUNC(copyright_wind_river)
  28. .long FUNC(copyright_wind_river)
  29. /* extetnals */
  30. /* internals */
  31. .globl GTEXT(_sigCtxLoad)
  32. .globl GTEXT(_sigCtxSave)
  33. .globl GTEXT(sigsetjmp)
  34. .globl GTEXT(setjmp)
  35. .text
  36. .balign 16
  37. /*******************************************************************************
  38. *
  39. * sigsetjmp - set non-local goto with option to save signal mask
  40. *
  41. * This routine saves the current task context and program counter in <env>
  42. * for later use by siglongjmp().   It returns 0 when called.  However, when
  43. * program execution returns to the point at which sigsetjmp() was called and the
  44. * task context is restored by siglongjmp(), sigsetjmp() will then return the
  45. * value <val>, as specified in siglongjmp().
  46. *
  47. * If the value of <savemask> argument is not zero, the sigsetjmp() function
  48. * shall save the current signal mask of the task as part of the calling
  49. * environment.
  50. *
  51. * RETURNS: 0 or <val> if return is via siglongjmp().
  52. *
  53. * SEE ALSO: longjmp()
  54. * int setjmp
  55. *    (
  56. *    jmp_buf env,       /@ where to save stack environment @/
  57. *    int     savemask /@ whether or not to save the current signal mask @/
  58. *    )
  59. */
  60. FUNC_LABEL(sigsetjmp)
  61. pushl SP_ARG2(%esp)
  62. pushl SP_ARG1+4(%esp)
  63. call FUNC(_setjmpSetup)
  64. addl $8,%esp
  65. jmp FUNC(_sigCtxSave)
  66. /*******************************************************************************
  67. *
  68. * setjmp - set non-local goto
  69. *
  70. * This routine saves the current task context and program counter in <env>
  71. * for later use by longjmp().   It returns 0 when called.  However, when
  72. * program execution returns to the point at which setjmp() was called and the
  73. * task context is restored by longjmp(), setjmp() will then return the value
  74. * <val>, as specified in longjmp().
  75. *
  76. * RETURNS: 0 or <val> if return is via longjmp().
  77. *
  78. * SEE ALSO: longjmp()
  79. * int setjmp
  80. *    (
  81. *    jmp_buf env        /@ where to save stack environment @/
  82. *    )
  83. */
  84. .balign 16,0x90
  85. FUNC_LABEL(setjmp)
  86. pushl $1
  87. pushl 8(%esp)
  88. call FUNC(_setjmpSetup)
  89. addl $8,%esp
  90. /* FALL THROUGH */
  91. /*******************************************************************************
  92. *
  93. * _sigCtxSave - Save the current context of the current task
  94. *
  95. * This is just like setjmp except it doesn't worry about saving any sigmask.
  96. * It must also always return 0.
  97. *
  98. * RETURNS: 0
  99. * int _sigCtxSave
  100. *     (
  101. *     REG_SET *pRegs /@ Location to save current context @/
  102. *     )
  103. */
  104. .balign 16,0x90
  105. FUNC_LABEL(_sigCtxSave)
  106. movl SP_ARG1(%esp),%eax
  107. movl (%esp),%edx
  108. movl %edx,0x24(%eax) /* save pc */
  109. pushfl
  110. popl 0x20(%eax) /* save eflags, set IF */
  111. movl %edi,0x00(%eax) /* save all registers */
  112. movl %esi,0x04(%eax)
  113. movl %ebp,0x08(%eax)
  114. movl %ebx,0x10(%eax)
  115. movl %edx,0x14(%eax)
  116. movl %ecx,0x18(%eax)
  117. movl %eax,0x1c(%eax)
  118. movl %esp,%edx
  119. addl $4,%edx
  120. movl %edx,0x0c(%eax)
  121. xorl %eax,%eax /* make return value 0 */
  122. ret
  123. /*******************************************************************************
  124. *
  125. * _sigCtxLoad - Load a new context in the current task
  126. *
  127. * This is just like longjmp, but every register must be loaded.
  128. * You could also look at this as half a context switch.
  129. *
  130. * Restoring the previous CS(code selector) is required to go back 
  131. * to the int-level context.  This is not supported in this routine.
  132. * Going back to the task-level context is assumed with the task-level
  133. * CS sysCsSuper.  For the WDB's switching back and forth the two 
  134. * contexts - the system (that might be interrupt or task level) and 
  135. * the external agent, _wdbDbgCtxLoad() is provide in wdbDbgALib.s.
  136. *
  137. * RETURNS: Never returns
  138. * void _sigCtxLoad
  139. *     (
  140. *     REG_SET *pRegs /@ Context to load @/
  141. *     )
  142. */
  143. .balign 16,0x90
  144. FUNC_LABEL(_sigCtxLoad)
  145. movl SP_ARG1(%esp),%eax
  146. movl 0x00(%eax),%edi /* load 5 registers */
  147. movl 0x04(%eax),%esi
  148. movl 0x08(%eax),%ebp
  149. movl 0x10(%eax),%ebx
  150. movl 0x18(%eax),%ecx
  151. cli /* LOCK INTERRUPTS */
  152. movl 0x0c(%eax),%esp /* load the stack pointer */
  153. pushl 0x20(%eax) /* push EFLAGS */
  154. pushl FUNC(sysCsSuper) /* push the task level CS */
  155. pushl 0x24(%eax) /* push PC */
  156. movl 0x14(%eax),%edx /* load remaining 2 registers */
  157. movl 0x1c(%eax),%eax
  158. iret /* UNLOCK INTERRUPTS */