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

VxWorks

开发平台:

C/C++

  1. /* workQALib.s - i80x86 internal VxWorks kernel work queue assembly library */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01i,20mar02,hdn  preserved previous state of the int enable bit (spr 74016)
  7. 01h,23aug01,hdn  added FUNC/FUNC_LABEL, replaced .align w .balign
  8. 01g,25feb99,nps  remove obsolete scrPad reference.
  9. 01f,17feb98,pr   deleted Windview code (no more needed).
  10. 01e,29jul96,sbs  Made windview conditionally compile.
  11. 01d,08aug94,hdn  added support for WindView.
  12. 01c,17nov93,hdn  fixed a bug: changed movb to movzbl.
  13. 01b,13oct92,hdn  debugged.
  14. 01a,07apr92,hdn  written based on TRON version.
  15. */
  16. /*
  17. DESCRIPTION
  18. This module contains internals to the VxWorks kernel.
  19. These routines have been coded in assembler because they are optimized for
  20. performance.
  21. */
  22. #define _ASMLANGUAGE
  23. #include "vxWorks.h"
  24. #include "asm.h"
  25. #include "private/workQLibP.h"
  26. #include "private/eventP.h"
  27. .data
  28. .globl FUNC(copyright_wind_river)
  29. .long FUNC(copyright_wind_river)
  30. #ifndef PORTABLE
  31. /* externals */
  32. .globl FUNC(workQPanic)
  33. .globl VAR(workQReadIx)
  34. .globl VAR(workQWriteIx)
  35. .globl VAR(workQIsEmpty)
  36. /* internals */
  37. .globl GTEXT(workQAdd0) /* add function to workQ */
  38. .globl GTEXT(workQAdd1) /* add function and 1 arg to workQ */
  39. .globl GTEXT(workQAdd2) /* add function and 2 args to workQ */
  40. .globl GTEXT(workQDoWork) /* do all queued work in a workQ */
  41. .text
  42. .balign 16
  43. /*******************************************************************************
  44. *
  45. * workQOverflow - work queue has overflowed so call workQPanic ()
  46. *
  47. * NOMANUAL
  48. */  
  49. workQOverflow: /* leave interrupts locked */
  50. call FUNC(workQPanic) /* panic and never return */
  51. /*******************************************************************************
  52. *
  53. * workQAdd0 - add a function with no argument to the work queue
  54. *
  55. * NOMANUAL
  56. * void workQAdd0 (func)
  57. *     FUNCPTR func; /@ function to invoke @/
  58. */  
  59. .balign 16,0x90
  60. FUNC_LABEL(workQAdd0)
  61. pushfl /* save IF in EFLAGS */
  62. cli /* LOCK INTERRUPTS */
  63. movzbl FUNC(workQWriteIx),%eax /* get write index into %eax */
  64. movl %eax,%ecx
  65. addb $4,%al /* advance write index */
  66. cmpb FUNC(workQReadIx),%al /* overflow? */
  67. je workQOverflow /* panic if overflowed */
  68. movb %al,FUNC(workQWriteIx) /* update write index */
  69. popfl /* UNLOCK INTERRUPTS */
  70. movl $0,FUNC(workQIsEmpty) /* work queue isn't empty */
  71. leal FUNC(pJobPool)(,%ecx,4),%edx /* get a start of an entry */
  72. movl SP_ARG1(%esp),%eax /* move it to pool */
  73. movl %eax,JOB_FUNCPTR(%edx)
  74. ret /* we're done */
  75. /*******************************************************************************
  76. *
  77. * workQAdd1 - add a function with one argument to the work queue
  78. *
  79. * NOMANUAL
  80. * void workQAdd1 (func, arg1)
  81. *     FUNCPTR func; /@ function to invoke  @/
  82. *     int arg1; /@ parameter one to function @/
  83. */  
  84. .balign 16,0x90
  85. FUNC_LABEL(workQAdd1)
  86. pushfl /* save IF in EFLAGS */
  87. cli /* LOCK INTERRUPTS */
  88. movzbl FUNC(workQWriteIx),%eax /* get write index into %eax */
  89. movl %eax,%ecx
  90. addb $4,%al /* advance write index */
  91. cmpb FUNC(workQReadIx),%al /* overflow? */
  92. je workQOverflow /* panic if overflowed */
  93. movb %al,FUNC(workQWriteIx) /* update write index */
  94. popfl /* UNLOCK INTERRUPTS */
  95. movl $0,FUNC(workQIsEmpty) /* work queue isn't empty */
  96. leal FUNC(pJobPool)(,%ecx,4),%edx /* get the start of an entry */
  97. movl SP_ARG1(%esp),%eax /* move the function to pool */
  98. movl %eax,JOB_FUNCPTR(%edx)
  99. movl SP_ARG2(%esp),%eax /* move the argument to pool */
  100. movl %eax,JOB_ARG1(%edx)
  101. ret /* we're done */
  102. /*******************************************************************************
  103. *
  104. * workQAdd2 - add a function with two arguments to the work queue
  105. *
  106. * NOMANUAL
  107. * void workQAdd2 (func, arg1, arg2)
  108. *     FUNCPTR func; /@ function to invoke  @/
  109. *     int arg1; /@ parameter one to function @/
  110. *     int arg2; /@ parameter two to function @/
  111. */  
  112. .balign 16,0x90
  113. FUNC_LABEL(workQAdd2)
  114. pushfl /* save IF in EFLAGS */
  115. cli /* LOCK INTERRUPTS */
  116. movzbl FUNC(workQWriteIx),%eax /* get write index into %eax */
  117. movl %eax,%ecx
  118. addb $4,%al /* advance write index */
  119. cmpb FUNC(workQReadIx),%al /* overflow? */
  120. je workQOverflow /* panic if overflowed */
  121. movb %al,FUNC(workQWriteIx) /* update write index */
  122. popfl /* UNLOCK INTERRUPTS */
  123. movl $0,FUNC(workQIsEmpty) /* work queue isn't empty */
  124. leal FUNC(pJobPool)(,%ecx,4),%edx /* get the start of an entry */
  125. movl SP_ARG1(%esp),%eax /* move the function to pool */
  126. movl %eax,JOB_FUNCPTR(%edx)
  127. movl SP_ARG2(%esp),%eax /* move 1st argument to pool */
  128. movl %eax,JOB_ARG1(%edx)
  129. movl SP_ARG3(%esp),%eax /* move 2nd argument to pool */
  130. movl %eax,JOB_ARG2(%edx)
  131. ret /* we're done */
  132.     
  133. /*******************************************************************************
  134. *
  135. * workQDoWork - perform all the work queued in the kernel work queue
  136. *
  137. * This routine empties all the deferred work in the work queue.  The global
  138. * variable errno is saved restored, so the work will not clobber it.
  139. * The work routines may be C code, and thus clobber the volatile registers
  140. * %e[adc]x.  This routine avoids using these registers.
  141. *
  142. * NOMANUAL
  143. * void workQDoWork ()
  144. */
  145. .balign 16,0x90
  146. FUNC_LABEL(workQDoWork)
  147. pushl FUNC(errno) /* push _errno */
  148. movzbl FUNC(workQReadIx),%eax /* load read index */
  149. cmpb FUNC(workQWriteIx),%al /* if readIndex != writeIndex */
  150. je workQNoMoreWork /* more work to be done */
  151. workQMoreWork:
  152. sall $2,%eax
  153. leal FUNC(pJobPool)(%eax),%edx
  154. addb $4,FUNC(workQReadIx) /* increment readIndex */
  155. pushl JOB_ARG2(%edx) /* push arg2 */
  156. pushl JOB_ARG1(%edx) /* push arg1 */
  157. movl FUNC(pJobPool)(%eax),%eax
  158. call *%eax /* %eax the work routine */
  159. addl $8,%esp /* clean up stack */
  160. movl $1,FUNC(workQIsEmpty) /* set boolean before test! */
  161. movzbl FUNC(workQReadIx),%eax /* load the new read index */
  162. cmpb FUNC(workQWriteIx),%al /* if readIndex != writeIndex */
  163. jne workQMoreWork /* more work to be done */
  164. workQNoMoreWork:
  165. pop FUNC(errno) /* pop _errno */
  166. ret /* return to caller */
  167. #endif /* !PORTABLE */