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

VxWorks

开发平台:

C/C++

  1. /* ipiALib.s - Inter Processor Interrupt (IPI) handling I80x86 assembly routines */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01b,27feb02,hdn  renamed ipiStubShutdown() to ipiShutdownSup()
  7. 01a,20feb02,hdn  written
  8. */
  9. /*
  10. DESCRIPTION
  11. This module contains the assembly language Inter Processor Interrupt (IPI)
  12. handling stub.  It is connected directly to the 80x86 IPI vectors.
  13. It sets up an appropriate environment and then calls a routine
  14. in ipiArchLib(1).
  15. SEE ALSO: ipiArchLib(1), loApicIntr.c
  16. */
  17. #define _ASMLANGUAGE
  18. #include "vxWorks.h"
  19. #include "asm.h"
  20. #include "regs.h"
  21. #include "esf.h"
  22. #include "iv.h"
  23. #include "excLib.h"
  24. #include "private/taskLibP.h"
  25. /* defines */
  26. .data
  27. .globl FUNC(copyright_wind_river)
  28. .long FUNC(copyright_wind_river)
  29.         /* externals */
  30. .globl FUNC(ipiHandler) /* IPI handler */
  31. .globl VAR(sysNcpu) /* number of CPUs */
  32. .globl VAR(sysLockSem) /* MP Lock Semaphore */
  33. /* internals */
  34. .globl GTEXT(ipiCallTbl) /* IPI call-table */
  35. .globl GTEXT(ipiStub) /* IPI handler stub */
  36. .globl GTEXT(ipiShutdownSup) /* IPI handler stub: Shutdown */
  37. .globl GTEXT(ipiHandlerTlbFlush) /* IPI handler: TLB flush */
  38. .globl GTEXT(ipiHandlerTscReset) /* IPI handler: TSC reset */
  39. .text
  40. .balign 16
  41. /**************************************************************************
  42. *
  43. * ipiCallTbl - table of IPI calls
  44. *
  45. * NOMANUAL
  46. */
  47. FUNC_LABEL(ipiCallTbl)
  48. call FUNC(ipiStub); nop; nop; nop; /* */
  49. call FUNC(ipiStub); nop; nop; nop; /* */
  50. call FUNC(ipiStub); nop; nop; nop; /* */
  51. call FUNC(ipiStub); nop; nop; nop; /* */
  52. call FUNC(ipiStub); nop; nop; nop; /* */
  53. call FUNC(ipiStub); nop; nop; nop; /* */
  54. call FUNC(ipiStub); nop; nop; nop; /* */
  55. call FUNC(ipiStub); nop; nop; nop; /* */
  56. /*********************************************************************
  57. *
  58. * ipiStub - IPI handler 
  59. *
  60. * This routine is the default IPI handler. 
  61. *
  62. * NOMANUAL
  63. */
  64. .balign 16,0x90
  65. FUNC_LABEL(ipiStub)
  66. /* create REG_SET on the stack */
  67. /* return address is the PC */
  68. pushfl /* push EFLAGS */
  69. pushal /* push general registers */
  70. movl %esp, %ebp /* save pointer to REG_SET to %ebp */
  71. /* compute vector offset from return address to call-table */
  72. movl REG_PC(%ebp), %eax /* get call return addr */
  73. subl $5, %eax /* adjust ret addr to be call addr */
  74. subl $FUNC(ipiCallTbl), %eax /* get offset from start of call-table */
  75. shrl $3, %eax /* turn vector offset into index */
  76. /* call ipiHandler */
  77. pushl %eax /* push the index */
  78. call FUNC(ipiHandler) /* do IPI processing */
  79. addl $4, %esp /* clean up pushed argument */
  80. /* restore general registers and return */
  81. popal /* pop general registers */
  82. addl $8, %esp /* skip EFLAGS, PC */
  83. iret /* retry the instruction */
  84. /*********************************************************************
  85. *
  86. * ipiHandlerTlbFlush - IPI handler to flush the TLB
  87. *
  88. * NOMANUAL
  89. */
  90. .balign 16,0x90
  91. FUNC_LABEL(ipiHandlerTlbFlush)
  92. movl %cr3, %eax
  93. movl %eax, %cr3
  94. ret
  95. /*********************************************************************
  96. *
  97. * ipiHandlerTscReset - IPI handler to reset the TSC
  98. *
  99. * NOMANUAL
  100. */
  101. .balign 16,0x90
  102. FUNC_LABEL(ipiHandlerTscReset)
  103.         xorl    %eax,%eax               /* zero low-order 32 bits */
  104.         xorl    %edx,%edx               /* zero high-order 32 bits */
  105.         movl    $ MSR_TSC,%ecx          /* specify MSR_TSC */
  106.         wrmsr                           /* write %edx:%eax to TSC */
  107.         ret
  108. /*********************************************************************
  109. *
  110. * ipiShutdownSup - IPI handler to shutdown the CPU immediately
  111. *
  112. * NOMANUAL
  113. */
  114. .balign 16,0x90
  115. FUNC_LABEL(ipiShutdownSup)
  116. /* decrement the CPU counter */
  117. movl FUNC(sysNcpu), %eax
  118. lock
  119. decl (%eax)
  120. /* write-back & invalidate the cache */
  121. wbinvd
  122. /* lock interrupts & halt */
  123. cli /* LOCK INTERRUTPS */
  124. ipiShutdownSup1:
  125. hlt
  126. jmp ipiShutdownSup1