Subversion Repositories Kolibri OS

Rev

Rev 4424 | Rev 5057 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4424 Rev 4608
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
$Revision: 4424 $
8
$Revision: 4608 $
9
 
9
 
Line 1358... Line 1358...
1358
        pop     esi
1358
        pop     esi
1359
        ret
1359
        ret
1360
endp
1360
endp
Line 1361... Line 1361...
1361
 
1361
 
1362
align 4
-
 
1363
proc init_mtrr
-
 
1364
 
-
 
1365
        cmp     [BOOT_VARS+BOOT_MTRR], byte 2
-
 
1366
        je      .exit
-
 
1367
 
-
 
1368
        bt      [cpu_caps], CAPS_MTRR
-
 
1369
        jnc     .exit
-
 
1370
 
-
 
1371
        mov     eax, cr0
-
 
1372
        or      eax, 0x60000000 ;disable caching
-
 
1373
        mov     cr0, eax
-
 
1374
        wbinvd                  ;invalidate cache
-
 
1375
 
-
 
1376
        mov     ecx, 0x2FF
-
 
1377
        rdmsr                   ;
-
 
1378
; has BIOS already initialized MTRRs?
-
 
1379
        test    ah, 8
-
 
1380
        jnz     .skip_init
-
 
1381
; rarely needed, so mainly placeholder
-
 
1382
; main memory - cached
-
 
1383
        push    eax
-
 
1384
 
-
 
1385
        mov     eax, [MEM_AMOUNT]
-
 
1386
; round eax up to next power of 2
-
 
1387
        dec     eax
-
 
1388
        bsr     ecx, eax
-
 
1389
        mov     ebx, 2
-
 
1390
        shl     ebx, cl
-
 
1391
        dec     ebx
-
 
1392
; base of memory range = 0, type of memory range = MEM_WB
-
 
1393
        xor     edx, edx
-
 
1394
        mov     eax, MEM_WB
-
 
1395
        mov     ecx, 0x200
-
 
1396
        wrmsr
-
 
1397
; mask of memory range = 0xFFFFFFFFF - (size - 1), ebx = size - 1
-
 
1398
        mov     eax, 0xFFFFFFFF
-
 
1399
        mov     edx, 0x0000000F
-
 
1400
        sub     eax, ebx
-
 
1401
        sbb     edx, 0
-
 
1402
        or      eax, 0x800
-
 
1403
        inc     ecx
-
 
1404
        wrmsr
-
 
1405
; clear unused MTRRs
-
 
1406
        xor     eax, eax
-
 
1407
        xor     edx, edx
-
 
1408
@@:
-
 
1409
        inc     ecx
-
 
1410
        wrmsr
-
 
1411
        cmp     ecx, 0x20F
-
 
1412
        jb      @b
-
 
1413
; enable MTRRs
-
 
1414
        pop     eax
-
 
1415
        or      ah, 8
-
 
1416
        and     al, 0xF0; default memtype = UC
-
 
1417
        mov     ecx, 0x2FF
-
 
1418
        wrmsr
-
 
1419
.skip_init:
-
 
1420
        stdcall set_mtrr, [LFBAddress], [LFBSize], MEM_WC
-
 
1421
 
-
 
1422
        wbinvd                  ;again invalidate
-
 
1423
 
-
 
1424
        mov     eax, cr0
-
 
1425
        and     eax, not 0x60000000
-
 
1426
        mov     cr0, eax        ; enable caching
-
 
1427
.exit:
-
 
1428
        ret
-
 
1429
endp
-
 
1430
 
-
 
1431
align 4
-
 
1432
proc set_mtrr stdcall, base:dword,size:dword,mem_type:dword
-
 
1433
; find unused register
-
 
1434
        mov     ecx, 0x201
-
 
1435
@@:
-
 
1436
        rdmsr
-
 
1437
        dec     ecx
-
 
1438
        test    ah, 8
-
 
1439
        jz      .found
-
 
1440
        rdmsr
-
 
1441
        mov     al, 0; clear memory type field
-
 
1442
        cmp     eax, [base]
-
 
1443
        jz      .ret
-
 
1444
        add     ecx, 3
-
 
1445
        cmp     ecx, 0x210
-
 
1446
        jb      @b
-
 
1447
; no free registers, ignore the call
-
 
1448
.ret:
-
 
1449
        ret
-
 
1450
.found:
-
 
1451
; found, write values
-
 
1452
        xor     edx, edx
-
 
1453
        mov     eax, [base]
-
 
1454
        or      eax, [mem_type]
-
 
1455
        wrmsr
-
 
1456
 
-
 
1457
        mov     ebx, [size]
-
 
1458
        dec     ebx
-
 
1459
        mov     eax, 0xFFFFFFFF
-
 
1460
        mov     edx, 0x00000000
-
 
1461
        sub     eax, ebx
-
 
1462
        sbb     edx, 0
-
 
1463
        or      eax, 0x800
-
 
1464
        inc     ecx
-
 
1465
        wrmsr
-
 
1466
        ret
-
 
1467
endp
-
 
1468
 
-
 
1469
align 4
1362
align 4
1470
proc create_ring_buffer stdcall, size:dword, flags:dword
1363
proc create_ring_buffer stdcall, size:dword, flags:dword
1471
           locals
1364
           locals
1472
             buf_ptr  dd ?
1365
             buf_ptr  dd ?