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

VxWorks

开发平台:

C/C++

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