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

VxWorks

开发平台:

C/C++

  1. /* semCALib.s - i80x86 internal VxWorks counting semaphore assembly library */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01f,20mar02,hdn  preserved previous state of the int enable bit (spr 74016)
  7. 01e,09nov01,pcm  added VxWorks semaphore events
  8. 01d,22aug01,hdn  added FUNC/FUNC_LABEL, replaced .align with .balign
  9. 01c,29jul96,sbs  Made windview conditionally compile.
  10. 01b,08aug94,hdn  added support for WindView.
  11. 01a,02jun93,hdn  extracted from semALib.s.
  12. */
  13. /*
  14. DESCRIPTION
  15. This module contains internals to the VxWorks kernel.
  16. These routines have been coded in assembler because they are optimized for
  17. performance.
  18. */
  19. #define _ASMLANGUAGE
  20. #include "vxWorks.h"
  21. #include "asm.h"
  22. #include "private/taskLibP.h"
  23. #include "private/semLibP.h"
  24. .data
  25. .globl FUNC(copyright_wind_river)
  26. .long FUNC(copyright_wind_river)
  27. #ifndef PORTABLE
  28. /* externals */
  29. .globl FUNC(semIntRestrict)
  30. .globl FUNC(semInvalid)
  31. .globl FUNC(semQGet)
  32. .globl FUNC(semQPut)
  33. .globl FUNC(semEvRsrcSend)
  34. /* internals */
  35. .globl GTEXT(semCGive) /* optimized counting semaphore give */
  36. .globl GTEXT(semCTake) /* optimized counting semaphore take */
  37. .text
  38. .balign 16
  39. /*******************************************************************************
  40. *
  41. * semIsInvalid - unlock interrupts and call semInvalid ().
  42. */
  43. semIsInvalidUnlock:
  44. popfl /* UNLOCK INTERRUPTS */
  45. semIsInvalid:
  46. jmp FUNC(semInvalid) /* let C rtn do work and ret */
  47. /*******************************************************************************
  48. *
  49. * semCGive - optimized give of a counting semaphore
  50. *
  51. * STATUS semCGive
  52. *    (
  53. *    SEM_ID semId /@ semaphore id to give @/
  54. *    )
  55. * INTERNAL
  56. * assumptions are:
  57. *  - %ecx = semId
  58. *  - %eax = 0
  59. */
  60. .balign 16,0x90
  61. FUNC_LABEL(semCGive)
  62. pushfl /* save IF in EFLAGS */
  63. cli /* LOCK INTERRUPTS */
  64. cmpl $FUNC(semClass),(%ecx) /* check validity */
  65. #ifdef WV_INSTRUMENTATION
  66.         je objOkCGive /* object is okay */
  67. /* windview - check the validity of instrumented class */
  68.         cmpl    $FUNC(semInstClass),(%ecx) /* check validity */
  69.         jne     semIsInvalidUnlock      /* invalid semaphore */
  70. objOkCGive:
  71. #else
  72.         jne     semIsInvalidUnlock      /* invalid semaphore */
  73. #endif  /* WV_INSTRUMENTATION */
  74. movl SEM_Q_HEAD(%ecx),%edx /* test semaphore queue head */
  75. testl %edx, %edx /* is the sem empty? */
  76. jne FUNC(semQGet) /* if not empty, get from q */
  77. incl SEM_STATE(%ecx) /* increment count */
  78. cmpl SEM_EVENTS_TASKID (%ecx), %edx /* %edx is 0 here */
  79. jnz FUNC(semEvRsrcSend) /* Event Code */
  80. popfl /* UNLOCK INTERRUPTS */
  81. ret /* return OK */
  82. /*******************************************************************************
  83. *
  84. * semCTake - optimized take of a counting semaphore
  85. *
  86. * STATUS semCTake (semId)
  87. *    (
  88. *    SEM_ID semId, /@ semaphore id to give @/
  89. *    int  timeout /@ timeout in ticks @/
  90. *    )
  91. * INTERNAL
  92. * assumptions are:
  93. *  - %ecx = semId
  94. */
  95. .balign 16,0x90
  96. FUNC_LABEL(semCTake)
  97. cmpl $0, FUNC(intCnt) /* is it in ISR? */
  98. jne FUNC(semIntRestrict) /*   yes: let C do the work */
  99. pushfl /* save IF in EFLAGS */
  100. cli /* LOCK INTERRUPTS */
  101. cmpl $FUNC(semClass),(%ecx) /* check validity */
  102. #ifdef WV_INSTRUMENTATION
  103.         je objOkCTake /* object is okay */
  104. /* windview - check the validity of instrumented class */
  105.         cmpl    $FUNC(semInstClass),(%ecx) /* check validity */
  106.         jne     semIsInvalidUnlock      /* invalid semaphore */
  107. objOkCTake:
  108. #else
  109.         jne     semIsInvalidUnlock      /* invalid semaphore */
  110. #endif  /* WV_INSTRUMENTATION */
  111. cmpl $0,SEM_STATE(%ecx) /* test count */
  112. je FUNC(semQPut) /* if sem is owned we block */
  113. decl SEM_STATE(%ecx) /* decrement count */
  114. popfl /* UNLOCK INTERRUPTS */
  115. xorl %eax,%eax /* return OK */
  116. ret
  117. #endif /* !PORTABLE */