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 ? |