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

VxWorks

开发平台:

C/C++

  1. /* intALib.s - I80x86 interrupt library assembly routines */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01h,20nov01,hdn  doc clean up for 5.5
  7. 01g,23aug01,hdn  added FUNC/FUNC_LABEL, replaced .align with .balign
  8. 01f,04jun98,hdn  fixed intBoiExit()'s stack pop count.
  9. 01e,28may98,hdn  added intBoiExit() for spurious/phantom int support.
  10. 01d,26jan95,rhp  doc tweaks from architecture-independent man pages
  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. 01c,18nov92,hdn  changed intLock and intUnlock.
  17. 01b,13oct92,hdn  debugged.
  18. 01a,28feb92,hdn  written based on TRON, 68k version.
  19. */
  20. /*
  21. DESCRIPTION
  22. This library supports various functions associated with
  23. interrupts from C.  
  24. SEE ALSO
  25. intLib, intArchLib
  26. INTERNAL
  27. Some routines in this module set up the "C" frame pointer (ebp) 
  28. although they don't use it in any way!  This is only for the benefit of
  29. the stacktrace facility to allow it to properly trace a stack of the 
  30. task executing within these routines.
  31. */
  32. #define _ASMLANGUAGE
  33. #include "vxWorks.h"
  34. #include "asm.h"
  35. #include "regs.h"
  36. .data
  37. .globl FUNC(copyright_wind_river)
  38. .long FUNC(copyright_wind_river)
  39. /* internals */
  40. .globl GTEXT(intLevelSet)
  41. .globl GTEXT(intLock)
  42. .globl GTEXT(intUnlock)
  43. .globl GTEXT(intVBRSet)
  44. .globl GTEXT(intBoiExit)
  45. .text
  46. .balign 16
  47. /*******************************************************************************
  48. *
  49. * intLevelSet - set the interrupt level
  50. *
  51. * An I80x86 doesn't have an interrupt level (unlike MC680x0, for example); 
  52. * thus this routine is a no-op.
  53. *
  54. * RETURNS: 0.
  55. * int intLevelSet (level)
  56. *     int level; /* new interrupt level mask *
  57. */
  58. FUNC_LABEL(intLevelSet)
  59. xorl %eax, %eax
  60. ret
  61. /*******************************************************************************
  62. *
  63. * intLock - lock out interrupts
  64. *
  65. * This routine disables interrupts.
  66. * For x86 architectures, interrupts are disabled at the level set by 
  67. * intLockLevelSet().  The default lock-out level is the highest interrupt 
  68. * level (1).
  69. * The routine returns the interrupt enable flag (IF) bit from the
  70. * EFLAGS register as the lock-out key for the interrupt level prior to
  71. * the call, and this should be passed to intUnlock() to re-enable
  72. * interrupts.
  73. * WARNINGS
  74. * Do not call VxWorks system routines with interrupts locked.
  75. * Violating this rule may re-enable interrupts unpredictably.
  76. *
  77. * The routine intLock() can be called from either interrupt or task level.
  78. * When called from a task context, the interrupt lock level is part of the
  79. * task context.  Locking out interrupts does not prevent rescheduling.
  80. * Thus, if a task locks out interrupts and invokes kernel services that
  81. * cause the task to block (e.g., taskSuspend() or taskDelay()) or that cause a
  82. * higher priority task to be ready (e.g., semGive() or taskResume()), then
  83. * rescheduling will occur and interrupts will be unlocked while other tasks
  84. * run.  Rescheduling may be explicitly disabled with taskLock().
  85. * Traps must be enabled when calling this routine.
  86. * EXAMPLE
  87. * .CS
  88. *     lockKey = intLock ();
  89. *
  90. *         ...    /* work with interrupts locked out *
  91. *
  92. *     intUnlock (lockKey);
  93. * .CE
  94. *
  95. * To lock out interrupts and task scheduling as well (see WARNING above):
  96. * .CS
  97. *     if (taskLock() == OK)
  98. *         {
  99. *         lockKey = intLock ();
  100. *
  101. *         ... (critical section)
  102. *
  103. *         intUnlock (lockKey);
  104. *         taskUnlock();
  105. *         }
  106. *      else
  107. *         {
  108. *         ... (error message or recovery attempt)
  109. *         }
  110. * .CE
  111. *
  112. * RETURNS
  113. * The interrupt enable flag (IF) bit from the EFLAGS register, as the
  114. * lock-out key for the lock-out level prior to the call.
  115. * SEE ALSO: intUnlock(), taskLock()
  116. * int intLock ()
  117. */
  118. .balign 16,0x90
  119. FUNC_LABEL(intLock)
  120. pushf /* push EFLAGS on stack */
  121. popl %eax /* get EFLAGS in EAX */
  122. andl $ EFLAGS_IF,%eax /* mask it with IF bit */
  123. cli /* LOCK INTERRUPTS */
  124. ret
  125. /*******************************************************************************
  126. *
  127. * intUnlock - cancel interrupt locks
  128. * This routine re-enables interrupts that have been disabled by intLock().
  129. * Use the lock-out key obtained from the preceding intLock() call.
  130. *
  131. * RETURNS: N/A
  132. *
  133. * SEE ALSO: intLock()
  134. * void intUnlock (oldSR)
  135. *    int oldSR;
  136. */
  137. .balign 16,0x90
  138. FUNC_LABEL(intUnlock)
  139. movl SP_ARG1(%esp),%eax /* get oldSR in EAX */
  140. andl $ EFLAGS_IF,%eax /* is IF bit set in oldSR? */
  141. jz intUnlock0 /*   no: skip next instruction */
  142. sti /* UNLOCK INTERRUPTS */
  143. intUnlock0:
  144. ret
  145. /*******************************************************************************
  146. *
  147. * intVBRSet - set the interrupt table descriptor register
  148. *
  149. * This routine should only be called in supervisor mode.
  150. *
  151. * NOMANUAL
  152. * void intVBRSet (baseAddr)
  153. *      char *baseAddr; /* vector base address *
  154. */
  155. .balign 16,0x90
  156. FUNC_LABEL(intVBRSet)
  157. movl SP_ARG1(%esp),%eax
  158. lidt (%eax)
  159. ret
  160. /*******************************************************************************
  161. *
  162. * intBoiExit - exit the interrupt handler stub without sending EOI
  163. *
  164. * This routine exits the interrupt handler stub without sending EOI.
  165. * It should be call from BOI routine attached by intConnect().
  166. * EOI should not be sent if it is the fantom/spurious interrupt,
  167. * such as IRQ7 or IRQ15 in PIC.
  168. *
  169. * NOMANUAL
  170. * void intBoiExit (void)
  171. */
  172. .balign 16,0x90
  173. FUNC_LABEL(intBoiExit)
  174. addl $4, %esp /* pop param */
  175. popl %ecx /* restore regs */
  176. popl %edx
  177. popl %eax
  178. jmp FUNC(intExit) /* exit via kernel */