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

VxWorks

开发平台:

C/C++

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