Subversion Repositories Kolibri OS

Rev

Rev 7133 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ; Simple test for ring-3 debugging of mtrr.inc.
  2. ; Contains some inputs taken from real-life MTRRs and expected outputs.
  3. format PE console
  4. ;include 'win32a.inc'
  5. macro $Revision [args]
  6. {
  7. }
  8. include '../proc32.inc'
  9. include '../struct.inc'
  10. entry start
  11.  
  12. ; one test has 8, another test has 10
  13. ; this is the maximal value for storing/copying, real value is in MTRRCAP
  14. MAX_VARIABLE_MTRR = 10
  15.  
  16. start:
  17. ; Copy test inputs, run init_mtrr, compare with test outputs. Repeat.
  18.         mov     esi, test1_in_data
  19.         mov     edi, mtrrdata
  20.         mov     ecx, mtrrdata_size / 4
  21.         rep movsd
  22.         call    init_mtrr
  23.         mov     esi, test1_out_data
  24.         mov     edi, mtrrdata
  25.         mov     ecx, mtrrdata_size / 4
  26.         repz cmpsd
  27.         jnz     .fail
  28.         mov     esi, test2_in_data
  29.         mov     edi, mtrrdata
  30.         mov     ecx, mtrrdata_size / 4
  31.         rep movsd
  32.         call    init_mtrr
  33.         mov     esi, test2_out_data
  34.         mov     edi, mtrrdata
  35.         mov     ecx, mtrrdata_size / 4
  36.         repz cmpsd
  37.         jnz     .fail
  38.         ret
  39.  
  40. .fail:
  41.         int3
  42.         jmp     $
  43.  
  44. ; Helper procedure for _rdmsr/_wrmsr, replacements of rdmsr/wrmsr.
  45. ; Returns pointer to memory containing the given MSR.
  46. ; in: ecx = MSR
  47. ; out: esi -> MSR data
  48. proc get_msr_ptr
  49.         mov     esi, mtrrcap
  50.         cmp     ecx, 0xFE
  51.         jz      .ok
  52.         mov     esi, mtrr_def_type
  53.         cmp     ecx, 0x2FF
  54.         jz      .ok
  55.         lea     esi, [ecx-0x200]
  56.         cmp     esi, MAX_VARIABLE_MTRR*2
  57.         jae     .fail
  58.         lea     esi, [mtrr+esi*8]
  59. .ok:
  60.         ret
  61. .fail:
  62.         int3
  63.         ret
  64. endp
  65.  
  66. ; Emulates rdmsr.
  67. proc _rdmsr
  68.         push    esi
  69.         call    get_msr_ptr
  70.         mov     eax, [esi]
  71.         mov     edx, [esi+4]
  72.         pop     esi
  73.         ret
  74. endp
  75.  
  76. ; Emulates wrmsr.
  77. proc _wrmsr
  78.         push    esi
  79.         call    get_msr_ptr
  80.         mov     [esi], eax
  81.         mov     [esi+4], edx
  82.         pop     esi
  83.         ret
  84. endp
  85.  
  86. ; Macro to substitute rdmsr/wrmsr with emulating code.
  87. macro rdmsr
  88. {
  89.         call    _rdmsr
  90. }
  91. macro wrmsr
  92. {
  93.         call    _wrmsr
  94. }
  95. ; Our emulation of rdmsr/wrmsr has nothing to do with real cache
  96. ; and system-wide settings,
  97. ; remove all attempts to wbinvd and disable/enable cache in cr0.
  98. macro wbinvd
  99. {
  100. }
  101. macro mov a,b
  102. {
  103. if ~(a eq cr0) & ~(b eq cr0)
  104.         mov     a, b
  105. end if
  106. }
  107. macro movi r,i
  108. {
  109.         push    i
  110.         pop     r
  111. }
  112.  
  113. include '../kglobals.inc'
  114. CAPS_MTRR equ 12
  115. MEM_WB     equ 6               ;write-back memory
  116. MEM_WC     equ 1               ;write combined memory
  117. MEM_UC     equ 0               ;uncached memory
  118. include 'mtrr.inc'
  119.  
  120. BOOT_VARS = 0
  121. BOOT_MTRR       db      1
  122. align 4
  123. cpu_caps        dd      1 shl CAPS_MTRR
  124. LFBAddress      dd      0xE0000000
  125. LFBSize         dd      0x10000000
  126. MEM_AMOUNT      dd      0       ; not used, needed for compilation
  127.  
  128. align 4
  129. ; Test 1: input
  130. test1_in_data:
  131. test1_phys_addr_width   db      36
  132.                         rb      3
  133. test1_in_mtrrcap        dq      0xD08
  134. test1_in_mtrr_def_type dq 0xC00
  135. test1_in_mtrrs:
  136.                 dq      0x000000006, 0xF00000800
  137.                 dq      0x100000006, 0xFC0000800
  138.                 dq      0x0BC000000, 0xFFC000800
  139.                 dq      0x0C0000000, 0xFC0000800
  140.                 dq      0x138000000, 0xFF8000800
  141.                 dq      0, 0
  142.                 dq      0, 0
  143.                 dq      0, 0
  144.                 dq      -1, -1  ; not used
  145.                 dq      -1, -1  ; not used
  146. ; Test 1: output
  147. test1_out_data:
  148.                 dd      36      ; phys_addr_width, readonly
  149.                 dq      0xD08   ; MTRRCAP, readonly
  150.                 dq      0xC00   ; MTRR_DEF_TYPE, should be the same
  151.                 dq      0x000000006, 0xF80000800
  152.                 dq      0x080000006, 0xFC0000800
  153.                 dq      0x0BC000000, 0xFFC000800
  154.                 dq      0x100000006, 0xFC0000800
  155.                 dq      0x138000000, 0xFF8000800
  156.                 dq      0x0E0000001, 0xFFF000800        ; added for [LFBAddress]
  157.                 dq      0, 0
  158.                 dq      0, 0
  159.                 dq      -1, -1  ; not used
  160.                 dq      -1, -1  ; not used
  161.  
  162. ; Test 2: input
  163. test2_in_data:
  164. test2_phys_addr_width   db      39
  165.                         rb      3
  166. test2_in_mtrrcap        dq      0xD0A
  167. test2_in_mtrr_def_type  dq      0xC00
  168. test2_in_mtrrs:
  169.                 dq      0x0000000006, 0x7F00000800
  170.                 dq      0x0100000006, 0x7FE0000800
  171.                 dq      0x00E0000000, 0x7FE0000800
  172.                 dq      0x00DC000000, 0x7FFC000800
  173.                 dq      0x00DBC00000, 0x7FFFC00800
  174.                 dq      0x011F800000, 0x7FFF800800
  175.                 dq      0x011F400000, 0x7FFFC00800
  176.                 dq      0x011F200000, 0x7FFFE00800
  177.                 dq      0, 0
  178.                 dq      0, 0
  179.  
  180. ; Test 2: output
  181. test2_out_data:
  182.                 dd      39      ; phys_addr_width, readonly
  183.                 dq      0xD0A   ; MTRRCAP, readonly
  184.                 dq      0xC00   ; MTRR_DEF_TYPE, should be the same
  185.                 dq      0x0000000006, 0x7F80000800
  186.                 dq      0x0080000006, 0x7FC0000800
  187.                 dq      0x00C0000006, 0x7FE0000800
  188.                 dq      0x00DC000000, 0x7FFC000800
  189.                 dq      0x00DBC00000, 0x7FFFC00800
  190.                 dq      0x0100000006, 0x7FE0000800
  191.                 dq      0x011F800000, 0x7FFF800800
  192.                 dq      0x011F400000, 0x7FFFC00800
  193.                 dq      0x011F200000, 0x7FFFE00800
  194.                 dq      0x00E0000001, 0x7FFF000800      ; added for [LFBAddress]
  195. IncludeIGlobals
  196. align 4
  197. mtrrdata:
  198. cpu_phys_addr_width     db      ?
  199.                 rb      3
  200. mtrrcap         dq      ?
  201. mtrr_def_type   dq      ?
  202. mtrr            rq      MAX_VARIABLE_MTRR*2
  203. mtrrdata_size = $ - mtrrdata
  204. IncludeUGlobals
  205.