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

VxWorks

开发平台:

C/C++

  1. /* mmuPro32ALib.s - MMU library for PentiumPro/2/3/4 32 bit mode */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01c,27aug01,hdn  added FUNC/FUNC_LABEL, replaced .align with .balign
  8.  preserved IF bit in EFLAGS
  9. 01e,17sep98,hdn  renamed mmuEnabled to mmuPro32Enabled.
  10. 01d,21apr98,hdn  updated a comment in the header.
  11. 01c,13apr98,hdn  added support for PentiumPro's 32bit MMU.
  12. 01b,02nov94,hdn  added a support for PCD and PWT bit for 486 and Pentium
  13. 01a,26jul93,hdn  written.
  14. */
  15. /*
  16. */
  17. #define _ASMLANGUAGE
  18. #include "vxWorks.h"
  19. #include "asm.h"
  20. #include "regs.h"
  21. /* externals */
  22. .globl VAR(mmuPro32Enabled)
  23. .globl VAR(sysProcessor)
  24. /* internals */
  25. .globl GTEXT(mmuPro32Enable)
  26. .globl GTEXT(mmuPro32On)
  27. .globl GTEXT(mmuPro32Off)
  28. .globl GTEXT(mmuPro32PdbrSet)
  29. .globl GTEXT(mmuPro32PdbrGet)
  30. .globl GTEXT(mmuPro32TLBFlush)
  31. .text
  32. .balign 16
  33.  
  34. /******************************************************************************
  35. *
  36. * mmuPro32Enable - turn mmu on or off
  37. *
  38. * RETURNS: OK
  39. * STATUS mmuPro32Enable 
  40. *    (
  41. *    BOOL enable /@ TRUE to enable, FALSE to disable MMU @/
  42. *    )
  43. */
  44. FUNC_LABEL(mmuPro32Enable)
  45. pushfl /* save EFLAGS */
  46. cli /* LOCK INTERRUPT */
  47. movl SP_ARG1+4(%esp),%edx
  48.         movl    %cr0,%eax
  49.         movl    %edx,FUNC(mmuPro32Enabled)
  50. cmpl $0,%edx
  51. je mmuPro32Disable
  52. orl     $0x80010000,%eax /* set PG and WP */
  53. jmp     mmuPro32Enable0
  54. mmuPro32Disable:
  55. andl    $0x7ffeffff,%eax /* clear PG and WP */
  56. mmuPro32Enable0:
  57. movl    %eax,%cr0
  58. jmp     mmuPro32Enable1 /* flush prefetch queue */
  59. mmuPro32Enable1:
  60. movl $0,%eax
  61. popfl /* UNLOCK INTERRUPT */
  62. ret
  63. /******************************************************************************
  64. *
  65. * mmuPro32On - turn MMU on 
  66. *
  67. * This routine assumes that interrupts are locked out.  It is called internally
  68. * to enable the mmu after it has been disabled for a short period of time
  69. * to access internal data structs.
  70. *
  71. * NOMANUAL
  72. * void mmuPro32On (void)
  73. */
  74. .balign 16,0x90
  75. FUNC_LABEL(mmuPro32On)
  76.         movl    %cr0,%eax
  77. orl     $0x80010000,%eax /* set PG and WP */
  78. movl    %eax,%cr0
  79. jmp     mmuPro32On0 /* flush prefetch queue */
  80. mmuPro32On0:
  81. ret
  82. /******************************************************************************
  83. *
  84. * mmuPro32Off - turn MMU off 
  85. *
  86. * This routine assumes that interrupts are locked out.  It is called internally
  87. * to disable the mmu for a short period of time
  88. * to access internal data structs.
  89. *
  90. * NOMANUAL
  91. * void mmuPro32Off (void)
  92. */
  93. .balign 16,0x90
  94. FUNC_LABEL(mmuPro32Off)
  95. movl    %cr0,%eax
  96. andl    $0x7ffeffff,%eax /* clear PG and WP */
  97. movl    %eax,%cr0
  98. jmp     mmuPro32Off0 /* flush prefetch queue */
  99. mmuPro32Off0:
  100. ret
  101. /*******************************************************************************
  102. *
  103. * mmuPro32PdbrSet - Set Page Directory Base Register
  104. *
  105. * This routine Set Page Directory Base Register.
  106. *
  107. * NOMANUAL
  108. * void mmuPro32PdbrSet 
  109. * (
  110. * void * transTbl;
  111. * )
  112.  
  113. */
  114. .balign 16,0x90
  115. FUNC_LABEL(mmuPro32PdbrSet)
  116. pushfl /* save EFLAGS */
  117. cli /* LOCK INTERRUPT */
  118. movl SP_ARG1+4(%esp),%eax
  119. movl (%eax),%eax
  120. movl %cr3,%edx
  121. movl $0xfffff000,%ecx /* upper 20 bits */
  122. andl $0x00000fff,%edx
  123. cmpl $ X86CPU_386,FUNC(sysProcessor)
  124. je mmuPro32PdbrSet1
  125. movl $0xffffffe0,%ecx /* upper 27 bits */
  126. andl $0x00000007,%edx /* PCD=0 PWT=0 */
  127. mmuPro32PdbrSet1:
  128. andl %ecx,%eax
  129. orl %edx,%eax
  130. movl %eax,%cr3
  131. jmp mmuPro32PdbrSet0 /* flush prefetch queue */
  132. mmuPro32PdbrSet0:
  133. popfl /* UNLOCK INTERRUPT */
  134. ret
  135. /*******************************************************************************
  136. *
  137. * mmuPro32PdbrGet - Get Page Directory Base Register
  138. *
  139. * This routine Get Page Directory Base Register.
  140. *
  141. * NOMANUAL
  142. * MMU_TRANS_TBL * mmuPro32PdbrGet (void)
  143.  
  144. */
  145. .balign 16,0x90
  146. FUNC_LABEL(mmuPro32PdbrGet)
  147. movl %cr3,%eax
  148. movl $0xfffff000,%edx /* upper 20 bits */
  149. cmpl $ X86CPU_386,FUNC(sysProcessor)
  150. je mmuPro32PdbrGet1
  151. movl $0xffffffe0,%edx /* upper 27 bits */
  152. mmuPro32PdbrGet1:
  153. andl %edx,%eax
  154. ret
  155. /******************************************************************************
  156. *
  157. * mmuPro32TLBFlush - flush the Translation Lookaside Buffer.
  158. *
  159. * NOMANUAL
  160. * void mmuPro32TLBFlush (void)
  161. */
  162. .balign 16,0x90
  163. FUNC_LABEL(mmuPro32TLBFlush)
  164. pushfl /* save EFLAGS */
  165. cli /* LOCK INTERRUPT */
  166. movl %cr3,%eax
  167. movl %eax,%cr3
  168. jmp mmuPro32TLBFlush0 /* flush prefetch queue */
  169. mmuPro32TLBFlush0:
  170. popfl /* UNLOCK INTERRUPT */
  171. ret