BIOS.AMD64.MemInfo.Mod 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. (* Aos, Copyright 2001, Pieter Muller, ETH Zurich *)
  2. MODULE MemInfo; (** AUTHOR "pjm"; PURPOSE "Memory mapping information"; *)
  3. IMPORT SYSTEM, KernelLog, Machine;
  4. CONST
  5. SoftInt = Machine.SoftInt;
  6. (* standard multipliers *)
  7. K = 1024; M = 100000H; (* 1K, 1M *)
  8. PS = 4096;
  9. RS = 4*M; (* region covered by a page table in bytes *)
  10. PTEs = RS DIV PS; (* number of page table/directory entries *)
  11. VAR
  12. kernelPD: ADDRESS;
  13. msrlow, msrhigh: SET;
  14. PROCEDURE GetCR3(VAR state: Machine.State);
  15. CODE {SYSTEM.AMD64, SYSTEM.Privileged}
  16. MOV RAX, CR3
  17. MOV RBX, kernelPD
  18. MOV [RBX], RAX
  19. END GetCR3;
  20. PROCEDURE -DoSoftInt(eax: LONGINT);
  21. CODE {SYSTEM.AMD64}
  22. POP EAX
  23. INT SoftInt
  24. END DoSoftInt;
  25. (* Display mapped ranges. *)
  26. PROCEDURE DisplayMap*;
  27. VAR i, j: LONGINT; pt: LONGINT; virt, phys, virt0, phys0, size: LONGINT;
  28. PROCEDURE Page;
  29. BEGIN
  30. IF (phys = phys0+size) & (virt = virt0+size) THEN
  31. INC(size, PS)
  32. ELSE
  33. IF size # 0 THEN
  34. KernelLog.Hex(virt0, 9); KernelLog.Hex(phys0, 9);
  35. KernelLog.IntSuffix(size, 8, "B"); KernelLog.Ln
  36. END;
  37. virt0 := virt; phys0 := phys; size := PS
  38. END
  39. END Page;
  40. BEGIN
  41. Machine.InstallHandler(GetCR3, SoftInt); (* ignore race *)
  42. DoSoftInt(0);
  43. Machine.RemoveHandler(GetCR3, SoftInt);
  44. KernelLog.Enter; KernelLog.Char(0EX); KernelLog.Ln;
  45. KernelLog.String(" Virtual Physical Size"); KernelLog.Ln;
  46. virt := 0; virt0 := 0; phys0 := 0; size := 0;
  47. FOR i := 0 TO PTEs-1 DO
  48. SYSTEM.GET(kernelPD + SIZEOF(ADDRESS)*i, pt);
  49. IF ODD(pt) THEN (* present *)
  50. pt := pt - pt MOD PS;
  51. FOR j := 0 TO PTEs-1 DO
  52. SYSTEM.GET(pt, phys);
  53. IF ODD(phys) THEN
  54. DEC(phys, phys MOD PS);
  55. Page
  56. END;
  57. INC(pt, 4); INC(virt, 4*K)
  58. END
  59. ELSE
  60. INC(virt, 4*M)
  61. END
  62. END;
  63. virt := -1; Page;
  64. KernelLog.Char(0FX); KernelLog.Exit;
  65. END DisplayMap;
  66. PROCEDURE Write64(s: ARRAY OF CHAR; low, high: SET);
  67. BEGIN
  68. KernelLog.String(s); KernelLog.Char("=");
  69. KernelLog.Hex(SYSTEM.VAL(LONGINT, high), 8);
  70. KernelLog.Hex(SYSTEM.VAL(LONGINT, low), 9)
  71. END Write64;
  72. PROCEDURE Bits(s: ARRAY OF CHAR; x: SET; ofs, n: LONGINT);
  73. BEGIN
  74. KernelLog.String(s); KernelLog.Char("="); KernelLog.Bits(x, ofs, n)
  75. END Bits;
  76. PROCEDURE -RealReadMSR(msr: HUGEINT; VAR low, high: SET);
  77. CODE {SYSTEM.AMD64, SYSTEM.Privileged}
  78. POP RDI
  79. POP RSI
  80. POP RCX
  81. RDMSR
  82. MOV [RSI], EAX
  83. MOV [RDI], EDX
  84. END RealReadMSR;
  85. PROCEDURE IntReadMSR(VAR state: Machine.State);
  86. BEGIN
  87. RealReadMSR(state.RAX, msrlow, msrhigh)
  88. END IntReadMSR;
  89. PROCEDURE ReadMSR(msr: LONGINT; VAR low, high: SET);
  90. BEGIN
  91. Machine.InstallHandler(IntReadMSR, SoftInt); (* ignore race *)
  92. DoSoftInt(msr);
  93. Machine.RemoveHandler(IntReadMSR, SoftInt);
  94. low := msrlow; high := msrhigh
  95. END ReadMSR;
  96. PROCEDURE DisplayMTTR*;
  97. VAR version, i, j, k, vcnt: LONGINT; features, low, high, mask: SET; vendor: Machine.Vendor;
  98. BEGIN
  99. KernelLog.Enter;
  100. (* Machine.CPUID(vendor, version, features);
  101. KernelLog.String("CPU: "); KernelLog.Int(ASH(version, -8) MOD 16, 1);
  102. KernelLog.Char("."); KernelLog.Int(ASH(version, -4) MOD 16, 1);
  103. KernelLog.Char("."); KernelLog.Int(version MOD 16, 1);
  104. Bits(", features", features, 0, 32);
  105. KernelLog.String(", vendor "); KernelLog.String(vendor);
  106. KernelLog.Ln; *)
  107. features := Machine.features;
  108. IF 5 IN features THEN (* MSR supported *)
  109. IF 12 IN features THEN (* MTTR supported *)
  110. ReadMSR(0FEH, low, high);
  111. vcnt := SYSTEM.VAL(LONGINT, low) MOD 256;
  112. KernelLog.String("VCNT="); KernelLog.Int(vcnt, 1);
  113. Bits(", FIX", low, 8, 1); Bits(", WC", low, 10, 1);
  114. KernelLog.Ln;
  115. IF 8 IN low THEN
  116. ReadMSR(2FFH, low, high); Write64("DefType", low, high); KernelLog.Ln;
  117. ReadMSR(250H, low, high); Write64("Fix64k", low, high); KernelLog.Ln;
  118. ReadMSR(258H, low, high); Write64("Fix16k", low, high); KernelLog.Ln;
  119. ReadMSR(259H, low, high); Write64("Fix16k", low, high); KernelLog.Ln;
  120. ReadMSR(268H, low, high); Write64("Fix4k", low, high); KernelLog.Ln;
  121. ReadMSR(269H, low, high); Write64("Fix4k", low, high); KernelLog.Ln;
  122. ReadMSR(26AH, low, high); Write64("Fix4k", low, high); KernelLog.Ln;
  123. ReadMSR(26BH, low, high); Write64("Fix4k", low, high); KernelLog.Ln;
  124. ReadMSR(26CH, low, high); Write64("Fix4k", low, high); KernelLog.Ln;
  125. ReadMSR(26DH, low, high); Write64("Fix4k", low, high); KernelLog.Ln;
  126. ReadMSR(26EH, low, high); Write64("Fix4k", low, high); KernelLog.Ln;
  127. ReadMSR(26FH, low, high); Write64("Fix4k", low, high); KernelLog.Ln;
  128. FOR i := 0 TO vcnt-1 DO
  129. KernelLog.Int(i, 1);
  130. ReadMSR(200H+2*i, low, high); Write64(" base", low, high);
  131. ReadMSR(200H+2*i+1, low, high); Write64(", mask", low, high);
  132. IF 11 IN low THEN (* valid *)
  133. mask := LSH(low, -12);
  134. FOR j := 0 TO 3 DO
  135. IF j IN high THEN INCL(mask, 20+j) END
  136. END;
  137. j := 0; WHILE (j # 32) & ~(j IN mask) DO INC(j) END;
  138. k := 31; WHILE (k # -1) & ~(k IN mask) DO DEC(k) END;
  139. IF (k = 23) & (k >= j) & (mask = {j..k}) THEN
  140. KernelLog.String(", "); KernelLog.IntSuffix(SYSTEM.VAL(LONGINT, {j})*4*1024, 1, "B")
  141. ELSE
  142. KernelLog.String(" discon="); KernelLog.Hex(SYSTEM.VAL(LONGINT, mask), 8)
  143. END
  144. END;
  145. KernelLog.Ln
  146. END
  147. ELSE
  148. KernelLog.String("Fixed range registers not supported"); KernelLog.Ln
  149. END
  150. ELSE
  151. KernelLog.String("MTTR not supported"); KernelLog.Ln
  152. END
  153. ELSE
  154. KernelLog.String("MSR not supported"); KernelLog.Ln
  155. END;
  156. KernelLog.Exit;
  157. END DisplayMTTR;
  158. (*
  159. PROCEDURE IntSetCache(VAR state: Machine.State);
  160. VAR res: WORD;
  161. BEGIN
  162. Machine.SetLocalCacheProperties(0FA800000H, 800000H, Machine.WC, res);
  163. KernelLog.Enter; KernelLog.String("SetCache "); KernelLog.Int(res, 1); KernelLog.Exit
  164. END IntSetCache;
  165. PROCEDURE Test*;
  166. BEGIN
  167. Machine.InstallHandler(IntSetCache, SoftInt); (* ignore race *)
  168. DoSoftInt(0);
  169. Machine.RemoveHandler(IntSetCache, SoftInt)
  170. END Test;
  171. PROCEDURE -SetMTTRphysBase(n: LONGINT; high, low: LONGINT);
  172. CODE {SYSTEM.Pentium, SYSTEM.Privileged}
  173. POP EAX
  174. POP EDX
  175. POP ECX
  176. SHL ECX, 1
  177. ADD ECX, 200H ; MTTRphysBase0
  178. WRMSR
  179. END SetMTTRphysBase;
  180. PROCEDURE -SetMTTRphysMask(n: LONGINT; high, low: LONGINT);
  181. CODE {SYSTEM.Pentium, SYSTEM.Privileged}
  182. POP EAX
  183. POP EDX
  184. POP ECX
  185. SHL ECX, 1
  186. ADD ECX, 201H ; MTTRphysMask0
  187. WRMSR
  188. END SetMTTRphysMask;
  189. (*
  190. 1 000000000H 4GB WB
  191. 0 0F0000000H 128MB UC
  192. 4 0F8000000H 64MB UC
  193. - 0FC000000H 32MB WB (implicit)
  194. 3 0FE000000H 32MB UC
  195. 2 100000000H 256MB WB
  196. WB 0MB-2048MB 2048MB
  197. WB 2048MB-3072MB 1024MB
  198. WB 3072MB-3584MB 512MB
  199. WB 3584MB-3840MB 256MB
  200. WC 4032MB-4064MB 32MB
  201. WB 4096MB-4352MB 256MB
  202. *)
  203. PROCEDURE IntSetCache2(VAR state: Machine.State);
  204. BEGIN
  205. SetMTTRphysBase(3, 0, 0FE000000H);
  206. SetMTTRphysMask(3, 0FH, 0FE000800H);
  207. SetMTTRphysBase(4, 0, 0F8000000H);
  208. SetMTTRphysMask(4, 0FH, 0FC000800H);
  209. SetMTTRphysBase(0, 0, 0F0000000H);
  210. SetMTTRphysMask(0, 0FH, 0F8000800H)
  211. END IntSetCache2;
  212. PROCEDURE Test2*;
  213. BEGIN
  214. Machine.InstallHandler(IntSetCache2, SoftInt); (* ignore race *)
  215. DoSoftInt(0);
  216. Machine.RemoveHandler(IntSetCache2, SoftInt)
  217. END Test2;
  218. PROCEDURE Test3*;
  219. VAR res: WORD;
  220. BEGIN
  221. Processors.GlobalSetCacheProperties(0FA800000H, 800000H, Machine.WC, res);
  222. KernelLog.Enter; KernelLog.String("SetCache "); KernelLog.Int(res, 1); KernelLog.Exit
  223. END Test3;
  224. *)
  225. END MemInfo.
  226. System.Free MemInfo ~
  227. MemInfo.DisplayMap
  228. MemInfo.DisplayMTTR
  229. MemInfo.Test
  230. MemInfo.Test2
  231. MemInfo.Test3
  232. DisplayTests.Mod
  233. PCITools.Scan