home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: SysTools / SysTools.zip / p6k705a.zip / P6K7MTRR.asm < prev    next >
Assembly Source File  |  2000-10-15  |  21KB  |  747 lines

  1. ; P6K7MTRR.asm  Intel P6 / AMD K7 MTRRs management IOCtl PDD  ver.0.05a  (source file : physical device driver)
  2. ; Copyright 1999-2000 January June / ûΘë╛òP(Yotogi-Hime) / Beliefia Productions.
  3.  
  4.  
  5.   .686p
  6.  
  7.  
  8. ;
  9. ; DevHlp_Save_Message
  10. ;
  11. DevHlp_Save_Message  equ  61
  12. MSG_REPLACEMENT_STRING  equ  1178
  13. MsgTable  struc
  14. MsgID     dw  ?
  15. NumItem   dw  ?
  16. PtrItem   dd  ?
  17. MsgTable  ends
  18.  
  19. ;
  20. ; PDD packet header
  21. ;
  22. PacketHeader     struc
  23. PacketLength     db  ?
  24. BlockDeviceUnit  db  ?
  25. CommandCode      db  ?
  26. PacketStatus     dw  ?
  27.                  dd  ?
  28. QueueLinkage     dd  ?
  29. PacketHeader     ends
  30.  
  31. ;
  32. ; PDD INIT command
  33. ;
  34. HeaderINITin  struc
  35. Header        PacketHeader  <>
  36.               db  ?
  37. DevHlpEntry   dd  ?
  38. ArgumentPtr   dd  ?
  39. FirstUnit     db  ?
  40. HeaderINITin  ends
  41. HeaderINITout  struc
  42. Header         PacketHeader  <>
  43. UnitNumber     db  ?
  44. EndResCode     dw  ?
  45. EndResData     dw  ?
  46. BPBArray       dd  ?
  47.                db  ?
  48. HeaderINITout  ends
  49.  
  50. ;
  51. ; PDD IOCTL command
  52. ;
  53. HeaderIOCTL      struc
  54. Header           PacketHeader  <>
  55. Category         db  ?
  56. Function         db  ?
  57. ParameterPtr     dd  ?
  58. DataPtr          dd  ?
  59. SystemFileNum    dw  ?
  60. ParameterLength  dw  ?
  61. DataLength       dw  ?
  62. HeaderIOCTL      ends
  63.  
  64. ;
  65. ; PDD resident data segment
  66. ;
  67. data_res  segment  public word use16 "DATA"
  68.   org  0
  69. data_res  ends
  70.  
  71. ;
  72. ; PDD resident code segment
  73. ;
  74. code_res  segment  public word use16 "CODE"
  75.   org  0
  76. code_res  ends
  77.  
  78. ;
  79. ; PDD segment group
  80. ;
  81. DGROUP  group  data_res
  82. CGROUP  group  code_res
  83.  
  84. ;
  85.  
  86. ;
  87. ; P6/K7 MSR indices
  88. ;
  89. MSR_MTRRcap           equ  254
  90. MSR_MTRRphysBase      equ  512
  91. MSR_MTRRphysMask      equ  513
  92. MSR_MTRRfix64K_00000  equ  592
  93. MSR_MTRRfix16K_80000  equ  600
  94. MSR_MTRRfix16K_A0000  equ  601
  95. MSR_MTRRfix4K_C0000   equ  616
  96. MSR_MTRRfix4K_C8000   equ  617
  97. MSR_MTRRfix4K_D0000   equ  618
  98. MSR_MTRRfix4K_D8000   equ  619
  99. MSR_MTRRfix4K_E0000   equ  620
  100. MSR_MTRRfix4K_E8000   equ  621
  101. MSR_MTRRfix4K_F0000   equ  622
  102. MSR_MTRRfix4K_F8000   equ  623
  103. MSR_MTRRdefType       equ  767
  104.  
  105. ;
  106.  
  107. ;
  108. ; IOCtl category & functions
  109. ;
  110.   public  IOCTL_P6K7MTRR
  111. IOCTL_P6K7MTRR                 equ  0c4h
  112.   public  P6K7MTRR_QRYMTRRCAP
  113. P6K7MTRR_QRYMTRRCAP            equ  60h
  114.   public  P6K7MTRR_QRYMTRRDEFTYPE
  115. P6K7MTRR_QRYMTRRDEFTYPE        equ  61h
  116.   public  P6K7MTRR_QRYMTRRFIXEDRANGE
  117. P6K7MTRR_QRYMTRRFIXEDRANGE     equ  62h
  118.   public  P6K7MTRR_QRYMTRRVARIABLERANGE
  119. P6K7MTRR_QRYMTRRVARIABLERANGE  equ  63h
  120.   public  P6K7MTRR_SETMTRR2DEFAULT
  121. P6K7MTRR_SETMTRR2DEFAULT       equ  40h
  122.   public  P6K7MTRR_SETMTRRDEFTYPE
  123. P6K7MTRR_SETMTRRDEFTYPE        equ  41h
  124.   public  P6K7MTRR_SETMTRRFIXEDRANGE
  125. P6K7MTRR_SETMTRRFIXEDRANGE     equ  42h
  126.   public  P6K7MTRR_SETMTRRVARIABLERANGE
  127. P6K7MTRR_SETMTRRVARIABLERANGE  equ  43h
  128.  
  129. ; P6K7MTRR_QRYMTRRCAP
  130. data_MTRRCAP  struc
  131. cap           dq  ?
  132. data_MTRRCAP  ends
  133.  
  134. ; P6K7MTRR_QRYMTRRDEFTYPE / P6K7MTRR_SETMTRRDEFTYPE
  135. data_MTRRDEFTYPE  struc
  136. deftype           dq  ?
  137. data_MTRRDEFTYPE  ends
  138.  
  139. ; P6K7MTRR_QRYMTRRFIXEDRANGE / P6K7MTRR_SETMTRRFIXEDRANGE
  140. data_MTRRFIXEDRANGE  struc
  141. r_00000_64k          dq  ?
  142. r_80000_16k          dq  ?
  143. r_a0000_16k          dq  ?
  144. r_c0000_4k           dq  ?
  145. r_c8000_4k           dq  ?
  146. r_d0000_4k           dq  ?
  147. r_d8000_4k           dq  ?
  148. r_e0000_4k           dq  ?
  149. r_e8000_4k           dq  ?
  150. r_f0000_4k           dq  ?
  151. r_f8000_4k           dq  ?
  152. data_MTRRFIXEDRANGE  ends
  153.  
  154. ; P6K7MTRR_QRYMTRRVARIABLERANGE / P6K7MTRR_SETMTRRVARIABLERANGE
  155. parm_MTRRVARIABLERANGE  struc
  156. idx                     db  ?
  157. parm_MTRRVARIABLERANGE  ends
  158. data_MTRRVARIABLERANGE  struc
  159. r_base                  dq  ?
  160. r_mask                  dq  ?
  161. data_MTRRVARIABLERANGE  ends
  162.  
  163. ;
  164.  
  165. ;
  166. ; contents of data_res
  167. ;
  168. data_res  segment
  169.  
  170. ; PDD header
  171.   dd  -1                     ; far pointer to next device header
  172.   dw  1000000110000000b      ; device attribute
  173. ;     CIISO LE    CNSK         CHR, level=3
  174. ;     HDBHP  VE   LUCB
  175. ;     RCMRN   L   KLRD
  176.   dw  offset entry_Strategy  ; 16bit offset to strategy routine
  177.   dw  0                      ; 16bit offset to IDC entry point
  178.   db  "P6MTRR$ "             ; driver name
  179.   db  8 dup(0)
  180.   dd  10011b                 ; capabilities bit strip
  181.  
  182. ; copy of BIOS default P6/K7 MTRR settings
  183.   public  default_MTRRcaps
  184. default_MTRRcaps           data_MTRRCAP  <>
  185.   public  default_MTRRdeftype
  186. default_MTRRdeftype        data_MTRRDEFTYPE  <>
  187.   public  default_MTRRfixedrange
  188. default_MTRRfixedrange     data_MTRRFIXEDRANGE  <>
  189.   public  default_MTRRvariablerange
  190. default_MTRRvariablerange  data_MTRRVARIABLERANGE  64 dup(<>)
  191.  
  192. ; end of data_res residence
  193.   public  last_data_res
  194. last_data_res  label  byte
  195.  
  196. ; CPUID vender ID strings
  197.   public  CPUID_GenuineIntel
  198. CPUID_GenuineIntel  db  "GenuineIntel"
  199.   public  CPUID_AuthenticAMD
  200. CPUID_AuthenticAMD  db  "AuthenticAMD"
  201.  
  202. ; message strings
  203.   public  string_Title
  204. string_Title         db  1bh, "[1m", 0dh
  205.                      db  "P6K7MTRR.sys  Intel P6 / AMD K7 MTRRs management IOCtl PDD  ver.0.05a", 0dh, 0ah
  206.                      db  "Copyright 1999-2000 January June / ûΘë╛òP(Yotogi-Hime) / Beliefia Productions."
  207.                      db  0
  208.   public  string_NotInstalled
  209. string_NotInstalled  db  1bh, "[31m", 0dh
  210.                      db  "Intel P6 / AMD K7 MTRR feature is NOT found. The driver has been ignored.", 0dh
  211.                      db  1bh, "[0m"
  212.                      db  0
  213.   public  string_InstalledP6
  214. string_InstalledP6   db  1bh, "[36m", 0dh
  215.                      db  "Intel P6 MTRR feature is found. The driver has been installed.", 0dh
  216.                      db  1bh, "[0m"
  217.                      db  0
  218.   public  string_InstalledK7
  219. string_InstalledK7   db  1bh, "[36m", 0dh
  220.                      db  "AMD K7 MTRR feature is found. The driver has been installed.", 0dh
  221.                      db  1bh, "[0m"
  222.                      db  0
  223.  
  224. ; message tables
  225.   public  msg_Title
  226. msg_Title         MsgTable  <MSG_REPLACEMENT_STRING, 1, string_Title>
  227.   public  msg_NotInstalled
  228. msg_NotInstalled  MsgTable  <MSG_REPLACEMENT_STRING, 1, string_NotInstalled>
  229.   public  msg_InstalledP6
  230. msg_InstalledP6   MsgTable  <MSG_REPLACEMENT_STRING, 1, string_InstalledP6>
  231.   public  msg_InstalledK7
  232. msg_InstalledK7   MsgTable  <MSG_REPLACEMENT_STRING, 1, string_InstalledK7>
  233.  
  234. data_res  ends
  235.  
  236. ;
  237.  
  238. ;
  239. _add  macro  reg, additive
  240.       if  (additive) eq 1
  241.       inc  reg
  242.       else
  243.       add  reg, additive
  244.       endif
  245.       endm
  246.  
  247. ;
  248. ; contents of code_res
  249. ;
  250. code_res  segment
  251.   assume  cs:CGROUP, ds:DGROUP, es:nothing, ss:nothing, fs:nothing, gs:nothing
  252.  
  253. ;  called before MTRR change
  254.   public  pre_MTRRchange
  255. pre_MTRRchange  proc  near
  256.   cli                        ; disable maskable interrupts
  257.   mov  eax, cr0              ; disable caching
  258.   or  eax, 1 shl 30
  259.   mov  cr0, eax
  260.   wbinvd                     ; flush all cache contents
  261.   mov  eax, cr3              ; flush all TLBs
  262.   mov  cr3, eax
  263.   mov  ecx, MSR_MTRRdefType  ; disable MTRR feature
  264.   rdmsr
  265. ;  and  eax, not (1 shl 11)
  266.   and  ax, not (1 shl 11)
  267.   wrmsr
  268.   ret
  269. pre_MTRRchange  endp
  270.  
  271. ;  called after MTRR change
  272.   public  post_MTRRchange
  273. post_MTRRchange  proc  near
  274.   wbinvd                     ; flush all cache contents
  275.   mov  eax, cr3              ; flush all TLBs
  276.   mov  cr3, eax
  277.   mov  ecx, MSR_MTRRdefType  ; enable MTRR feature
  278.   rdmsr
  279. ;  or  eax, 1 shl 11
  280.   or  ax, 1 shl 11
  281.   wrmsr
  282.   mov  eax, cr0              ; enable caching
  283.   and  eax, not (1 shl 30)
  284.   mov  cr0, eax
  285.   sti                        ; enable maskable interrupts
  286.   ret
  287. post_MTRRchange  endp
  288.  
  289. ; MTRR memory type checker
  290.   public  check_MemType
  291. check_MemType  proc  near
  292.   or  al, al       ; UC
  293.   jz  short check_MemType_0
  294.   cmp  al, 1       ; WC
  295.   je  short check_MemType_0
  296.   cmp  al, 4       ; WT
  297.   je  short check_MemType_0
  298.   cmp  al, 5       ; WP
  299.   je  short check_MemType_0
  300.   cmp  al, 6       ; WB
  301. check_MemType_0:
  302.   ret
  303. check_MemType  endp
  304.  
  305. ; query MTRR fixed range
  306.   public  query_MTRRFixedRange
  307. query_MTRRFixedRange  proc  near
  308.   mov  ecx, MSR_MTRRfix64K_00000
  309.   rdmsr
  310.   stosd
  311.   xchg  eax, edx
  312.   stosd
  313.   _add  cx, <MSR_MTRRfix16K_80000 - MSR_MTRRfix64K_00000>
  314.   rdmsr
  315.   stosd
  316.   xchg  eax, edx
  317.   stosd
  318.   _add  cx, <MSR_MTRRfix16K_A0000 - MSR_MTRRfix16K_80000>
  319.   rdmsr
  320.   stosd
  321.   xchg  eax, edx
  322.   stosd
  323.   _add  cx, <MSR_MTRRfix4K_C0000 - MSR_MTRRfix16K_A0000>
  324.   rdmsr
  325.   stosd
  326.   xchg  eax, edx
  327.   stosd
  328.   _add  cx, <MSR_MTRRfix4K_C8000 - MSR_MTRRfix4K_C0000>
  329.   rdmsr
  330.   stosd
  331.   xchg  eax, edx
  332.   stosd
  333.   _add  cx, <MSR_MTRRfix4K_D0000 - MSR_MTRRfix4K_C8000>
  334.   rdmsr
  335.   stosd
  336.   xchg  eax, edx
  337.   stosd
  338.   _add  cx, <MSR_MTRRfix4K_D8000 - MSR_MTRRfix4K_D0000>
  339.   rdmsr
  340.   stosd
  341.   xchg  eax, edx
  342.   stosd
  343.   _add  cx, <MSR_MTRRfix4K_E0000 - MSR_MTRRfix4K_D8000>
  344.   rdmsr
  345.   stosd
  346.   xchg  eax, edx
  347.   stosd
  348.   _add  cx, <MSR_MTRRfix4K_E8000 - MSR_MTRRfix4K_E0000>
  349.   rdmsr
  350.   stosd
  351.   xchg  eax, edx
  352.   stosd
  353.   _add  cx, <MSR_MTRRfix4K_F0000 - MSR_MTRRfix4K_E8000>
  354.   rdmsr
  355.   stosd
  356.   xchg  eax, edx
  357.   stosd
  358.   _add  cx, <MSR_MTRRfix4K_F8000 - MSR_MTRRfix4K_F0000>
  359.   rdmsr
  360.   stosd
  361.   xchg  eax, edx
  362.   stosd
  363.   ret
  364. query_MTRRFixedRange  endp
  365.  
  366. ; set MTRR fixed range
  367.   public  set_MTRRFixedRange
  368. set_MTRRFixedRange  proc  near
  369.   mov  eax, dword ptr [si][data_MTRRFIXEDRANGE.r_00000_64k][0]
  370.   mov  edx, dword ptr [si][data_MTRRFIXEDRANGE.r_00000_64k][4]
  371.   mov  ecx, MSR_MTRRfix64K_00000
  372.   wrmsr
  373.   mov  eax, dword ptr [si][data_MTRRFIXEDRANGE.r_80000_16k][0]
  374.   mov  edx, dword ptr [si][data_MTRRFIXEDRANGE.r_80000_16k][4]
  375.   _add  cx, <MSR_MTRRfix16K_80000 - MSR_MTRRfix64K_00000>
  376.   wrmsr
  377.   mov  eax, dword ptr [si][data_MTRRFIXEDRANGE.r_a0000_16k][0]
  378.   mov  edx, dword ptr [si][data_MTRRFIXEDRANGE.r_a0000_16k][4]
  379.   _add  cx, <MSR_MTRRfix16K_A0000 - MSR_MTRRfix16K_80000>
  380.   wrmsr
  381.   mov  eax, dword ptr [si][data_MTRRFIXEDRANGE.r_c0000_4k][0]
  382.   mov  edx, dword ptr [si][data_MTRRFIXEDRANGE.r_c0000_4k][4]
  383.   _add  cx, <MSR_MTRRfix4K_C0000 - MSR_MTRRfix16K_A0000>
  384.   wrmsr
  385.   mov  eax, dword ptr [si][data_MTRRFIXEDRANGE.r_c8000_4k][0]
  386.   mov  edx, dword ptr [si][data_MTRRFIXEDRANGE.r_c8000_4k][4]
  387.   _add  cx, <MSR_MTRRfix4K_C8000 - MSR_MTRRfix4K_C0000>
  388.   wrmsr
  389.   mov  eax, dword ptr [si][data_MTRRFIXEDRANGE.r_d0000_4k][0]
  390.   mov  edx, dword ptr [si][data_MTRRFIXEDRANGE.r_d0000_4k][4]
  391.   _add  cx, <MSR_MTRRfix4K_D0000 - MSR_MTRRfix4K_C8000>
  392.   wrmsr
  393.   mov  eax, dword ptr [si][data_MTRRFIXEDRANGE.r_d8000_4k][0]
  394.   mov  edx, dword ptr [si][data_MTRRFIXEDRANGE.r_d8000_4k][4]
  395.   _add  cx, <MSR_MTRRfix4K_D8000 - MSR_MTRRfix4K_D0000>
  396.   wrmsr
  397.   mov  eax, dword ptr [si][data_MTRRFIXEDRANGE.r_e0000_4k][0]
  398.   mov  edx, dword ptr [si][data_MTRRFIXEDRANGE.r_e0000_4k][4]
  399.   _add  cx, <MSR_MTRRfix4K_E0000 - MSR_MTRRfix4K_D8000>
  400.   wrmsr
  401.   mov  eax, dword ptr [si][data_MTRRFIXEDRANGE.r_e8000_4k][0]
  402.   mov  edx, dword ptr [si][data_MTRRFIXEDRANGE.r_e8000_4k][4]
  403.   _add  cx, <MSR_MTRRfix4K_E8000 - MSR_MTRRfix4K_E0000>
  404.   wrmsr
  405.   mov  eax, dword ptr [si][data_MTRRFIXEDRANGE.r_f0000_4k][0]
  406.   mov  edx, dword ptr [si][data_MTRRFIXEDRANGE.r_f0000_4k][4]
  407.   _add  cx, <MSR_MTRRfix4K_F0000 - MSR_MTRRfix4K_E8000>
  408.   wrmsr
  409.   mov  eax, dword ptr [si][data_MTRRFIXEDRANGE.r_f8000_4k][0]
  410.   mov  edx, dword ptr [si][data_MTRRFIXEDRANGE.r_f8000_4k][4]
  411.   _add  cx, <MSR_MTRRfix4K_F8000 - MSR_MTRRfix4K_F0000>
  412.   wrmsr
  413.   ret
  414. set_MTRRFixedRange  endp
  415.  
  416. ; strategy entry
  417.   public  entry_Strategy
  418. entry_Strategy  proc  far
  419.   push  bx  ; move bx value to bp
  420.   pop  bp   ;   to reserve general purpose
  421.   push  es  ; move es value to gs
  422.   pop  gs   ;   to reserve string operations
  423.             ; do not modify gs:bp
  424.   mov  al, gs:[bp][PacketHeader.CommandCode]
  425.   or  al, al             ; INIT
  426.   je  near ptr cmd_INIT
  427.   cmp  al, 16            ; IOCTL
  428.   je  short cmd_IOCTL
  429.   cmp  al, 28            ; SHUTDOWN
  430.   je  short exit_Done
  431.   cmp  al, 31            ; INITCOMPLETE
  432.   je  short cmd_INITCOMPLETE
  433. ;
  434.   public  exit_UnknownCommand
  435. exit_UnknownCommand  label near
  436.   mov  ax, 8103h  ; unknown command
  437.   jmp  short exit_Error
  438. ;
  439.   public  exit_Invalid
  440. exit_Invalid  label near
  441.   mov  ax, 8113h  ; invalid parameter
  442. ;
  443.   public  exit_Error
  444. exit_Error  label near
  445.   mov  gs:[bp][PacketHeader.PacketStatus], ax
  446.   stc
  447.   ret
  448. ;
  449.   public  cmd_INITCOMPLETE
  450. cmd_INITCOMPLETE  label near
  451.   mov  di, offset default_MTRRcaps
  452.   push  ds
  453.   pop  es
  454.   mov  ecx, MSR_MTRRcap
  455.   rdmsr
  456.   stosd
  457.   xchg  eax, edx
  458.   stosd
  459.   mov  cx, MSR_MTRRdefType
  460.   rdmsr
  461.   stosd
  462.   xchg  eax, edx
  463.   stosd
  464.   call  query_MTRRFixedRange
  465.   movzx  bx, byte ptr default_MTRRcaps[data_MTRRCAP.cap][0]
  466.   mov  cx, MSR_MTRRphysBase
  467. cmd_INITCOMPLETE_1:
  468.   rdmsr
  469.   stosd
  470.   xchg  eax, edx
  471.   stosd
  472.   _add  cx, <MSR_MTRRphysMask - MSR_MTRRphysBase>
  473.   rdmsr
  474.   stosd
  475.   xchg  eax, edx
  476.   stosd
  477.   _add  cx, <MSR_MTRRphysMask - MSR_MTRRphysBase>
  478.   dec  bx
  479.   jnz  short cmd_INITCOMPLETE_1
  480. ;
  481.   public  exit_Done
  482. exit_Done  label near
  483.   mov  gs:[bp][PacketHeader.PacketStatus], 100h
  484.   clc
  485.   ret
  486. entry_Strategy  endp
  487.  
  488. ; IOCTL routine
  489.   public  cmd_IOCTL
  490. cmd_IOCTL  proc  near
  491.   cmp  gs:[bp][HeaderIOCTL.Category], IOCTL_P6K7MTRR
  492.   jne  short exit_Invalid
  493.   mov  al, gs:[bp][HeaderIOCTL.Function]
  494.   cmp  al, P6K7MTRR_QRYMTRRCAP
  495.   je  short cmd_IOCTL_QRYMTTRCAP
  496.   cmp  al, P6K7MTRR_QRYMTRRDEFTYPE
  497.   je  short cmd_IOCTL_QRYMTRRDEFTYPE
  498.   cmp  al, P6K7MTRR_QRYMTRRFIXEDRANGE
  499.   je  short cmd_IOCTL_QRYMTRRFIXEDRANGE
  500.   cmp  al, P6K7MTRR_QRYMTRRVARIABLERANGE
  501.   je  short cmd_IOCTL_QRYMTRRVARIABLERANGE
  502.   cmp  al, P6K7MTRR_SETMTRR2DEFAULT
  503.   je  short cmd_IOCTL_SETMTRR2DEFAULT
  504.   cmp  al, P6K7MTRR_SETMTRRDEFTYPE
  505.   je  near ptr cmd_IOCTL_SETMTRRDEFTYPE
  506.   cmp  al, P6K7MTRR_SETMTRRFIXEDRANGE
  507.   je  near ptr cmd_IOCTL_SETMTRRFIXEDRANGE
  508.   cmp  al, P6K7MTRR_SETMTRRVARIABLERANGE
  509.   je  near ptr cmd_IOCTL_SETMTRRVARIABLERANGE
  510.   jmp  near ptr exit_Invalid
  511. ;
  512.   public  cmd_IOCTL_QRYMTTRCAP
  513. cmd_IOCTL_QRYMTTRCAP  label  near
  514.   mov  si, offset default_MTRRcaps
  515.   les  di, gs:[bp][HeaderIOCTL.DataPtr]
  516.   movsd
  517.   movsd
  518.   jmp  short exit_Done
  519. ;
  520.   public  cmd_IOCTL_QRYMTRRDEFTYPE
  521. cmd_IOCTL_QRYMTRRDEFTYPE  label  near
  522.   les  di, gs:[bp][HeaderIOCTL.DataPtr]
  523.   mov  ecx, MSR_MTRRdefType
  524.   rdmsr
  525.   stosd
  526.   xchg  eax, edx
  527.   stosd
  528.   jmp  short exit_Done
  529. ;
  530.   public  cmd_IOCTL_QRYMTRRFIXEDRANGE
  531. cmd_IOCTL_QRYMTRRFIXEDRANGE  label  near
  532.   les  di, gs:[bp][HeaderIOCTL.DataPtr]
  533.   call  query_MTRRFixedRange
  534.   jmp  short exit_Done
  535. ;
  536.   public  cmd_IOCTL_QRYMTRRVARIABLERANGE
  537. cmd_IOCTL_QRYMTRRVARIABLERANGE  label  near
  538.   les  di, gs:[bp][HeaderIOCTL.ParameterPtr]
  539.   movzx  ecx, es:[di][parm_MTRRVARIABLERANGE.idx]
  540.   cmp  cl, byte ptr default_MTRRcaps[data_MTRRCAP.cap][0]
  541.   jnb  near ptr exit_Invalid
  542.   les  di, gs:[bp][HeaderIOCTL.DataPtr]
  543.   shl  cx, 1
  544.   add  cx, MSR_MTRRphysBase
  545.   rdmsr
  546.   stosd
  547.   xchg  eax, edx
  548.   stosd
  549.   _add  cx, <MSR_MTRRphysMask - MSR_MTRRphysBase>
  550.   rdmsr
  551.   stosd
  552.   xchg  eax, edx
  553.   stosd
  554.   jmp  near ptr exit_Done
  555. ;
  556.   public  cmd_IOCTL_SETMTRR2DEFAULT
  557. cmd_IOCTL_SETMTRR2DEFAULT  label  near
  558.   call  pre_MTRRchange
  559. ;  mov  eax, dword ptr default_MTRRdeftype[data_MTRRDEFTYPE.deftype][0]
  560. ;  and  eax, 11111111111111111111011111111111b
  561.   movzx  eax, word ptr default_MTRRdeftype[data_MTRRDEFTYPE.deftype][0]
  562.   and  ax, 1111011111111111b
  563.   mov  edx, dword ptr default_MTRRdeftype[data_MTRRDEFTYPE.deftype][4]
  564.   mov  ecx, MSR_MTRRdefType
  565.   wrmsr
  566.   mov  si, offset default_MTRRfixedrange
  567.   call  set_MTRRFixedRange
  568.   mov  si, offset default_MTRRvariablerange
  569.   movzx  bx, byte ptr default_MTRRcaps[data_MTRRCAP.cap][0]
  570.   mov  cx, MSR_MTRRphysBase
  571. cmd_IOCTL_SETMTRR2DEFAULT_1:
  572.   mov  eax, dword ptr [si][data_MTRRVARIABLERANGE.r_base][0]
  573.   mov  edx, dword ptr [si][data_MTRRVARIABLERANGE.r_base][4]
  574.   wrmsr
  575.   _add  cx, <MSR_MTRRphysMask - MSR_MTRRphysBase>
  576.   mov  eax, dword ptr [si][data_MTRRVARIABLERANGE.r_mask][0]
  577.   mov  edx, dword ptr [si][data_MTRRVARIABLERANGE.r_mask][4]
  578.   wrmsr
  579.   _add  cx, <MSR_MTRRphysMask - MSR_MTRRphysBase>
  580.   add  si, size data_MTRRVARIABLERANGE
  581.   dec  bx
  582.   jnz  short cmd_IOCTL_SETMTRR2DEFAULT_1
  583.   call  post_MTRRchange
  584.   jmp  near ptr exit_Done
  585. ;
  586.   public  cmd_IOCTL_SETMTRRDEFTYPE
  587. cmd_IOCTL_SETMTRRDEFTYPE  label  near
  588.   lds  si, gs:[bp][HeaderIOCTL.DataPtr]
  589.   assume  ds:nothing
  590.   mov  al, byte ptr [si][data_MTRRDEFTYPE.deftype][0]
  591.   call  check_MemType
  592.   jnz  near ptr exit_Invalid
  593.   call  pre_MTRRchange
  594. ;  mov  eax, dword ptr [si][data_MTRRDEFTYPE.deftype][0]
  595. ;  and  eax, 00000000000000000000010011111111b
  596.   movzx  eax, word ptr [si][data_MTRRDEFTYPE.deftype][0]
  597.   and  ax, 0000010011111111b
  598. ;  mov  edx, dword ptr [si][data_MTRRDEFTYPE.deftype][4]
  599.   xor  edx, edx
  600.   mov  ecx, MSR_MTRRdefType
  601.   wrmsr
  602.   call  post_MTRRchange
  603.   jmp  near ptr exit_Done
  604.   assume  ds:DGROUP
  605. ;
  606.   public  cmd_IOCTL_SETMTRRFIXEDRANGE
  607. cmd_IOCTL_SETMTRRFIXEDRANGE  label  near
  608.   lds  si, gs:[bp][HeaderIOCTL.DataPtr]
  609.   assume  ds:nothing
  610.   mov  cx, size data_MTRRFIXEDRANGE
  611. cmd_IOCTL_SETMTRRDEFTYPE_0:
  612.   lodsb
  613.   call  check_MemType
  614.   jnz  near ptr exit_Invalid
  615.   loop  cmd_IOCTL_SETMTRRDEFTYPE_0
  616.   sub  si, size data_MTRRFIXEDRANGE
  617.   call  pre_MTRRchange
  618.   call  set_MTRRFixedRange
  619.   call  post_MTRRchange
  620.   jmp  near ptr exit_Done
  621.   assume  ds:DGROUP
  622. ;
  623.   public  cmd_IOCTL_SETMTRRVARIABLERANGE
  624. cmd_IOCTL_SETMTRRVARIABLERANGE  label  near
  625.   les  di, gs:[bp][HeaderIOCTL.ParameterPtr]
  626.   movzx  ebx, es:[di][parm_MTRRVARIABLERANGE.idx]
  627.   cmp  bl, byte ptr default_MTRRcaps[data_MTRRCAP.cap][0]
  628.   jnb  near ptr exit_Invalid
  629.   lds  si, gs:[bp][HeaderIOCTL.DataPtr]
  630.   assume  ds:nothing
  631.   mov  al, byte ptr [si][data_MTRRVARIABLERANGE.r_base][0]
  632.   call  check_MemType
  633.   jnz  near ptr exit_Invalid
  634.   call  pre_MTRRchange
  635.   mov  eax, dword ptr [si][data_MTRRVARIABLERANGE.r_base][0]
  636. ;  and  eax, 11111111111111111111000011111111b
  637.   and  ax, 1111000011111111b
  638. ;  mov  edx, dword ptr [si][data_MTRRVARIABLERANGE.r_base][4]
  639. ;  and  edx, 00000000000000000000000000001111b
  640.   movzx  edx, byte ptr [si][data_MTRRVARIABLERANGE.r_base][4]
  641.   and  dl, 00001111b
  642.   lea  cx, [ebx*2+MSR_MTRRphysBase]
  643.   wrmsr
  644.   mov  eax, dword ptr [si][data_MTRRVARIABLERANGE.r_mask][0]
  645. ;  and  eax, 11111111111111111111100000000000b
  646.   and  ax, 1111100000000000b
  647. ;  mov  edx, dword ptr [si][data_MTRRVARIABLERANGE.r_mask][4]
  648. ;  and  edx, 00000000000000000000000000001111b
  649.   movzx  edx, byte ptr [si][data_MTRRVARIABLERANGE.r_mask][4]
  650.   and  dl, 00001111b
  651.   _add  cx, <MSR_MTRRphysMask - MSR_MTRRphysBase>
  652.   wrmsr
  653.   call  post_MTRRchange
  654.   jmp  near ptr exit_Done
  655.   assume  ds:DGROUP
  656. cmd_IOCTL  endp
  657.  
  658. ; end of code_res residence
  659.   public  last_code_res
  660. last_code_res  label  near
  661.  
  662. ; display message
  663.   public  save_Message
  664. save_Message  proc  near
  665.   xor  bx, bx
  666.   mov  dl, DevHlp_Save_Message
  667.   call  gs:[bp][HeaderINITin.DevHlpEntry]
  668.   ret
  669. save_Message  endp
  670.  
  671. ; P6/K7 MTRRs presence checker
  672.   public  check_P6K7MTRR
  673. check_P6K7MTRR  proc  near
  674.   xor  si, si
  675.   pushfd         ; CPUID availablity check
  676.   pop  edx
  677.   mov  eax, 1 shl 21
  678.   xor  eax, edx
  679.   push  eax
  680.   popfd
  681.   pushfd
  682.   pop  eax
  683.   xor  eax, edx
  684.   jz  short check_P6K7MTRR_2
  685.   xor  eax, eax  ; CPUID std.func. & vender check
  686.   cpuid
  687.   or  eax, eax
  688.   jz  short check_P6K7MTRR_2
  689.   cmp  ebx, dword ptr CPUID_GenuineIntel[0]
  690.   jne  short check_P6K7MTRR_0
  691.   cmp  edx, dword ptr CPUID_GenuineIntel[4]
  692.   jne  short check_P6K7MTRR_0
  693.   cmp  ecx, dword ptr CPUID_GenuineIntel[8]
  694.   je  short check_P6K7MTRR_1
  695. check_P6K7MTRR_0:
  696.   cmp  ebx, dword ptr CPUID_AuthenticAMD[0]
  697.   jne  short check_P6K7MTRR_2
  698.   cmp  edx, dword ptr CPUID_AuthenticAMD[4]
  699.   jne  short check_P6K7MTRR_2
  700.   cmp  ecx, dword ptr CPUID_AuthenticAMD[8]
  701.   jne  short check_P6K7MTRR_2
  702.   inc  si
  703. check_P6K7MTRR_1:
  704.   inc  si
  705.   mov  eax, 1    ; CPUID MTRR feature check
  706.   cpuid
  707.   shr  dx, 12+1
  708.   sbb  ax, ax
  709.   and  si, ax
  710. check_P6K7MTRR_2:
  711.   xchg  ax, si
  712.   ret
  713. check_P6K7MTRR  endp
  714.  
  715. ; INIT routine
  716.   public  cmd_INIT
  717. cmd_INIT  proc  far
  718.   mov  si, offset msg_Title
  719.   call  save_Message
  720.   call  check_P6K7MTRR
  721.   or  ax, ax
  722.   jnz  short cmd_INIT_0
  723.   mov  si, offset msg_NotInstalled
  724.   call  save_Message
  725.   xor  ax, ax
  726.   mov  gs:[bp][HeaderINITout.EndResCode], ax
  727.   mov  gs:[bp][HeaderINITout.EndResData], ax
  728.   mov  ax, 8115h  ; initialization failed
  729.   jmp  near ptr exit_Error
  730. cmd_INIT_0:
  731.   mov  si, offset msg_InstalledP6
  732.   dec  ax
  733.   jz  short cmd_INIT_1
  734.   mov  si, offset msg_InstalledK7
  735. cmd_INIT_1:
  736.   call  save_Message
  737.   mov  gs:[bp][HeaderINITout.EndResCode], offset last_code_res
  738.   mov  gs:[bp][HeaderINITout.EndResData], offset last_data_res
  739.   jmp  near ptr exit_Done
  740. cmd_INIT  endp
  741.  
  742. code_res  ends
  743.  
  744.  
  745.   end
  746.  
  747.