BIOS.I386.MemCache.Mod 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. (* Aos, Copyright 2001, Pieter Muller, ETH Zurich *)
  2. MODULE MemCache; (** AUTHOR "pjm"; PURPOSE "Memory cache control"; *)
  3. IMPORT SYSTEM, Machine;
  4. CONST
  5. (** cache properties *)
  6. UC* = 0; WC* = 1; WT* = 4; WP* = 5; WB* = 6;
  7. PS = 4096; (* page size in bytes *)
  8. M = 100000H; (* 1K, 1M, 1G *)
  9. Ok = 0;
  10. TYPE
  11. SetCacheMessage = POINTER TO RECORD (Machine.Message)
  12. physAdr: ADDRESS; size, type: LONGINT;
  13. res: ARRAY Machine.MaxCPU OF LONGINT
  14. END;
  15. (* Return the value of the MTTRcap register. *)
  16. PROCEDURE -GetMTTRcapLow(): SET;
  17. CODE {SYSTEM.Pentium, SYSTEM.Privileged}
  18. MOV ECX, 0FEH ; MTTRcap
  19. RDMSR
  20. END GetMTTRcapLow;
  21. (*
  22. (* Return the value of the MTTRdefType register. *)
  23. PROCEDURE -GetMTTRdefTypeLow(): SET;
  24. CODE {SYSTEM.Pentium, SYSTEM.Privileged}
  25. MOV ECX, 2FFH ; MTTRdefType
  26. RDMSR
  27. END GetMTTRdefTypeLow;
  28. *)
  29. (* Return the value of the specified MTTRphysBase register. *)
  30. PROCEDURE -GetMTTRphysBaseLow(n: ADDRESS): SET;
  31. CODE {SYSTEM.Pentium, SYSTEM.Privileged}
  32. POP ECX
  33. SHL ECX, 1
  34. ADD ECX, 200H ; MTTRphysBase0
  35. RDMSR
  36. END GetMTTRphysBaseLow;
  37. (* Return the value of the specified MTTRphysMask register. *)
  38. PROCEDURE -GetMTTRphysMaskLow(n: ADDRESS): SET;
  39. CODE {SYSTEM.Pentium, SYSTEM.Privileged}
  40. POP ECX
  41. SHL ECX, 1
  42. ADD ECX, 201H ; MTTRphysMask0
  43. RDMSR
  44. END GetMTTRphysMaskLow;
  45. (* Set the specified MTTRphysBase register. *)
  46. PROCEDURE -SetMTTRphysBase(n: ADDRESS; high, low: SET);
  47. CODE {SYSTEM.Pentium, SYSTEM.Privileged}
  48. POP EAX
  49. POP EDX
  50. POP ECX
  51. SHL ECX, 1
  52. ADD ECX, 200H ; MTTRphysBase0
  53. WRMSR
  54. END SetMTTRphysBase;
  55. (* Set the specified MTTRphysMask register. *)
  56. PROCEDURE -SetMTTRphysMask(n: ADDRESS; high, low: SET);
  57. CODE {SYSTEM.Pentium, SYSTEM.Privileged}
  58. POP EAX
  59. POP EDX
  60. POP ECX
  61. SHL ECX, 1
  62. ADD ECX, 201H ; MTTRphysMask0
  63. WRMSR
  64. END SetMTTRphysMask;
  65. (** Set the cache properties of the specified physical memory area on the current processor. {physAdr, size MOD PS = 0} Must be called from supervisor mode. *)
  66. PROCEDURE LocalSetCacheProperties*(physAdr: ADDRESS; size, type: LONGINT; VAR res: WORD);
  67. VAR i, n, f: LONGINT; mask, base: SET; j, k: ADDRESS;
  68. BEGIN
  69. ASSERT((physAdr MOD PS = 0) & (size MOD PS = 0) & (size # 0));
  70. IF (physAdr >= M) OR (physAdr < 0) THEN
  71. k := size; WHILE k > 0 DO k := ASH(k, 1) END; (* shift highest set bit into bit 31 *)
  72. IF k = 80000000H THEN (* only one bit was set => size is power of 2 *)
  73. IF physAdr MOD size = 0 THEN
  74. Machine.Acquire(Machine.Memory); (* hack *)
  75. IF Machine.MTTR IN Machine.features THEN (* MTTRs supported *)
  76. mask := GetMTTRcapLow();
  77. IF (type # WC) OR (10 IN mask) THEN
  78. n := SYSTEM.VAL(LONGINT, mask * {0..7});
  79. i := 0; f := -1; res := Ok;
  80. WHILE (i # n) & (res = Ok) DO
  81. mask := GetMTTRphysMaskLow(i);
  82. IF 11 IN mask THEN (* entry is valid *)
  83. mask := mask * {12..MAX(SET)};
  84. base := GetMTTRphysBaseLow(i) * mask;
  85. j := physAdr; k := physAdr+size;
  86. WHILE (j # k) & (SYSTEM.VAL(SET, j) * mask # base) DO INC(j, PS) END; (* performance! *)
  87. IF j # k THEN res := 1508 END (* cache type of region already set *)
  88. ELSE
  89. IF f = -1 THEN f := i END (* first free entry *)
  90. END;
  91. INC(i)
  92. END;
  93. IF res = Ok THEN
  94. IF f # -1 THEN
  95. SetMTTRphysBase(f, {}, SYSTEM.VAL(SET, physAdr) * {12..31} + SYSTEM.VAL(SET, type) * {0..7});
  96. SetMTTRphysMask(f, {0..3}, (-SYSTEM.VAL(SET, size-1)) * {12..31} + {11})
  97. ELSE
  98. res := 1506 (* out of cache control entries *)
  99. END
  100. ELSE
  101. (* skip *)
  102. END
  103. ELSE
  104. res := 1511 (* region type not supported *)
  105. END
  106. ELSE
  107. res := 1505 (* MTTRs not supported *)
  108. END;
  109. Machine.Release(Machine.Memory)
  110. ELSE
  111. res := 1510 (* region base must be aligned on size *)
  112. END
  113. ELSE
  114. res := 1509 (* region size must be power of 2 *)
  115. END
  116. ELSE
  117. res := 1507 (* implementation restriction - fixed entries not supported *)
  118. END
  119. END LocalSetCacheProperties;
  120. PROCEDURE HandleSetCacheProperties(id: LONGINT; CONST state: Machine.State; msg: Machine.Message);
  121. BEGIN
  122. WITH msg: SetCacheMessage DO
  123. (* to do: page 11-25 *)
  124. LocalSetCacheProperties(msg.physAdr, msg.size, msg.type, msg.res[id])
  125. END
  126. END HandleSetCacheProperties;
  127. (** Broadcast a LocalSetCacheProperties operation to all processors. *)
  128. PROCEDURE GlobalSetCacheProperties*(physAdr: ADDRESS; size, type: LONGINT; VAR res: WORD);
  129. VAR i: LONGINT; msg: SetCacheMessage;
  130. BEGIN
  131. NEW(msg); msg.physAdr := physAdr; msg.size := size; msg.type := type;
  132. FOR i := 0 TO Machine.MaxCPU-1 DO msg.res[i] := 2304 END; (* default result *)
  133. Machine.Broadcast(HandleSetCacheProperties, msg, {Machine.Self, Machine.FrontBarrier, Machine.BackBarrier});
  134. res := 0;
  135. FOR i := 0 TO Machine.MaxCPU-1 DO
  136. IF (res = 0) & (msg.res[i] # 0) THEN res := msg.res[i] END (* return first non-ok result found *)
  137. END
  138. END GlobalSetCacheProperties;
  139. (** Disable all caching on the current processor. *)
  140. PROCEDURE LocalDisableCaching*;
  141. CODE {SYSTEM.Pentium, SYSTEM.Privileged}
  142. PUSHFD
  143. CLI
  144. MOV EAX, CR0
  145. OR EAX, 40000000H
  146. AND EAX, 0DFFFFFFFH
  147. MOV CR0, EAX
  148. WBINVD
  149. MOV EAX, CR4
  150. AND EAX, 0FFFFFF7FH
  151. MOV CR4, EAX
  152. MOV EAX, CR3
  153. MOV CR3, EAX
  154. MOV ECX, 2FFH ; MTTRdefType
  155. MOV EAX, 0
  156. MOV EDX, 0
  157. WRMSR
  158. WBINVD
  159. MOV EAX, CR3
  160. MOV CR3, EAX
  161. MOV EAX, CR0
  162. OR EAX, 60000000H
  163. MOV CR0, EAX
  164. POPFD
  165. END LocalDisableCaching;
  166. PROCEDURE HandleDisableCaching(id: LONGINT; CONST state: Machine.State; msg: Machine.Message);
  167. BEGIN
  168. LocalDisableCaching
  169. END HandleDisableCaching;
  170. (** Broadcast a LocalDisableCaching operation to all processors. *)
  171. PROCEDURE GlobalDisableCaching*;
  172. BEGIN
  173. Machine.Broadcast(HandleDisableCaching, NIL, {Machine.Self, Machine.FrontBarrier, Machine.BackBarrier})
  174. END GlobalDisableCaching;
  175. END MemCache.
  176. (*
  177. to do:
  178. o change error codes
  179. *)