Rev 2434 | Rev 2441 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
750 | victor | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
983 | diamond | 3 | ;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;; |
750 | victor | 4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
||
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
593 | mikedld | 7 | |
465 | serge | 8 | $Revision: 2439 $ |
9 | |||
593 | mikedld | 10 | |
465 | serge | 11 | MEM_WB equ 6 ;write-back memory |
12 | MEM_WC equ 1 ;write combined memory |
||
13 | MEM_UC equ 0 ;uncached memory |
||
14 | |||
15 | align 4 |
||
16 | proc mem_test |
||
1103 | diamond | 17 | ; if we have BIOS with fn E820, skip the test |
2434 | Serge | 18 | cmp dword [BOOT_VAR-OS_BASE + 0x9100], 0 |
19 | jnz .ret |
||
465 | serge | 20 | |
2434 | Serge | 21 | mov eax, cr0 |
22 | and eax, not (CR0_CD+CR0_NW) |
||
23 | or eax, CR0_CD ;disable caching |
||
24 | mov cr0, eax |
||
25 | wbinvd ;invalidate cache |
||
465 | serge | 26 | |
2434 | Serge | 27 | xor edi, edi |
28 | mov ebx, 'TEST' |
||
465 | serge | 29 | @@: |
2434 | Serge | 30 | add edi, 0x100000 |
31 | xchg ebx, dword [edi] |
||
32 | cmp dword [edi], 'TEST' |
||
33 | xchg ebx, dword [edi] |
||
34 | je @b |
||
465 | serge | 35 | |
2434 | Serge | 36 | and eax, not (CR0_CD+CR0_NW) ;enable caching |
37 | mov cr0, eax |
||
38 | inc dword [BOOT_VAR-OS_BASE + 0x9100] |
||
39 | xor eax, eax |
||
40 | mov [BOOT_VAR-OS_BASE + 0x9104], eax |
||
41 | mov [BOOT_VAR-OS_BASE + 0x9108], eax |
||
42 | mov [BOOT_VAR-OS_BASE + 0x910C], edi |
||
43 | mov [BOOT_VAR-OS_BASE + 0x9110], eax |
||
1103 | diamond | 44 | .ret: |
2434 | Serge | 45 | ret |
465 | serge | 46 | endp |
47 | |||
48 | align 4 |
||
49 | proc init_mem |
||
1103 | diamond | 50 | ; calculate maximum allocatable address and number of allocatable pages |
2434 | Serge | 51 | mov edi, BOOT_VAR-OS_BASE + 0x9104 |
52 | mov ecx, [edi-4] |
||
53 | xor esi, esi; esi will hold total amount of memory |
||
54 | xor edx, edx; edx will hold maximum allocatable address |
||
1103 | diamond | 55 | .calcmax: |
56 | ; round all to pages |
||
2434 | Serge | 57 | mov eax, [edi] |
58 | test eax, 0xFFF |
||
59 | jz @f |
||
60 | neg eax |
||
61 | and eax, 0xFFF |
||
62 | add [edi], eax |
||
63 | adc dword [edi+4], 0 |
||
64 | sub [edi+8], eax |
||
65 | sbb dword [edi+12], 0 |
||
66 | jc .unusable |
||
1103 | diamond | 67 | @@: |
2434 | Serge | 68 | and dword [edi+8], not 0xFFF |
69 | jz .unusable |
||
1103 | diamond | 70 | ; ignore memory after 4 Gb |
2434 | Serge | 71 | cmp dword [edi+4], 0 |
72 | jnz .unusable |
||
73 | mov eax, [edi] |
||
74 | cmp dword [edi+12], 0 |
||
75 | jnz .overflow |
||
76 | add eax, [edi+8] |
||
77 | jnc @f |
||
1103 | diamond | 78 | .overflow: |
2434 | Serge | 79 | mov eax, 0xFFFFF000 |
1103 | diamond | 80 | @@: |
2434 | Serge | 81 | cmp edx, eax |
82 | jae @f |
||
83 | mov edx, eax |
||
1103 | diamond | 84 | @@: |
2434 | Serge | 85 | sub eax, [edi] |
86 | mov [edi+8], eax |
||
87 | add esi, eax |
||
88 | jmp .usable |
||
1103 | diamond | 89 | .unusable: |
2434 | Serge | 90 | and dword [edi+8], 0 |
1103 | diamond | 91 | .usable: |
2434 | Serge | 92 | add edi, 20 |
93 | loop .calcmax |
||
1103 | diamond | 94 | .calculated: |
2434 | Serge | 95 | mov [MEM_AMOUNT-OS_BASE], esi |
96 | mov [pg_data.mem_amount-OS_BASE], esi |
||
97 | shr esi, 12 |
||
98 | mov [pg_data.pages_count-OS_BASE], esi |
||
465 | serge | 99 | |
2434 | Serge | 100 | shr edx, 12 |
101 | add edx, 31 |
||
102 | and edx, not 31 |
||
103 | shr edx, 3 |
||
104 | mov [pg_data.pagemap_size-OS_BASE], edx |
||
465 | serge | 105 | |
2434 | Serge | 106 | add edx, (sys_pgmap-OS_BASE)+4095 |
107 | and edx, not 4095 |
||
108 | mov [tmp_page_tabs], edx |
||
513 | serge | 109 | |
2434 | Serge | 110 | mov edx, esi |
111 | and edx, -1024 |
||
112 | cmp edx, (OS_BASE/4096) |
||
113 | jbe @F |
||
114 | mov edx, (OS_BASE/4096) |
||
115 | jmp .set |
||
1130 | diamond | 116 | @@: |
2434 | Serge | 117 | cmp edx, (HEAP_BASE-OS_BASE+HEAP_MIN_SIZE)/4096 |
118 | jae .set |
||
119 | mov edx, (HEAP_BASE-OS_BASE+HEAP_MIN_SIZE)/4096 |
||
1130 | diamond | 120 | .set: |
2434 | Serge | 121 | mov [pg_data.kernel_pages-OS_BASE], edx |
122 | shr edx, 10 |
||
123 | mov [pg_data.kernel_tables-OS_BASE], edx |
||
465 | serge | 124 | |
2434 | Serge | 125 | xor eax, eax |
126 | mov edi, sys_pgdir-OS_BASE |
||
127 | mov ecx, 4096/4 |
||
128 | cld |
||
129 | rep stosd |
||
465 | serge | 130 | |
2434 | Serge | 131 | mov edx, (sys_pgdir-OS_BASE)+ 0x800; (OS_BASE shr 20) |
132 | bt [cpu_caps-OS_BASE], CAPS_PSE |
||
133 | jnc .no_PSE |
||
465 | serge | 134 | |
2434 | Serge | 135 | mov ebx, cr4 |
136 | or ebx, CR4_PSE |
||
137 | mov eax, PG_LARGE+PG_SW |
||
138 | mov cr4, ebx |
||
139 | dec [pg_data.kernel_tables-OS_BASE] |
||
465 | serge | 140 | |
2434 | Serge | 141 | mov [edx], eax |
142 | add edx, 4 |
||
465 | serge | 143 | |
2434 | Serge | 144 | mov edi, [tmp_page_tabs] |
145 | jmp .map_kernel_heap ; new kernel fits to the first 4Mb - nothing to do with ".map_low" |
||
1455 | art_zh | 146 | .no_PSE: |
2434 | Serge | 147 | mov eax, PG_SW |
148 | mov ecx, [tmp_page_tabs] |
||
149 | shr ecx, 12 |
||
1455 | art_zh | 150 | .map_low: |
2434 | Serge | 151 | mov edi, [tmp_page_tabs] |
1455 | art_zh | 152 | @@: ; |
2434 | Serge | 153 | stosd |
154 | add eax, 0x1000 |
||
155 | dec ecx |
||
156 | jnz @B |
||
1455 | art_zh | 157 | |
158 | .map_kernel_heap: |
||
2434 | Serge | 159 | mov ecx, [pg_data.kernel_tables-OS_BASE] |
160 | shl ecx, 10 |
||
161 | xor eax, eax |
||
162 | rep stosd |
||
465 | serge | 163 | |
2434 | Serge | 164 | mov ecx, [pg_data.kernel_tables-OS_BASE] |
165 | mov eax, [tmp_page_tabs] |
||
166 | or eax, PG_SW |
||
167 | mov edi, edx |
||
2212 | Serge | 168 | |
465 | serge | 169 | .map_kernel_tabs: |
2434 | Serge | 170 | stosd |
171 | add eax, 0x1000 |
||
172 | dec ecx |
||
173 | jnz .map_kernel_tabs |
||
465 | serge | 174 | |
2434 | Serge | 175 | mov dword [sys_pgdir-OS_BASE+(page_tabs shr 20)], sys_pgdir+PG_SW-OS_BASE |
465 | serge | 176 | |
2434 | Serge | 177 | mov edi, (sys_pgdir-OS_BASE) |
178 | lea esi, [edi+(OS_BASE shr 20)] |
||
179 | movsd |
||
180 | movsd |
||
181 | ret |
||
465 | serge | 182 | endp |
183 | |||
184 | align 4 |
||
185 | proc init_page_map |
||
1103 | diamond | 186 | ; mark all memory as unavailable |
2434 | Serge | 187 | mov edi, sys_pgmap-OS_BASE |
188 | mov ecx, [pg_data.pagemap_size-OS_BASE] |
||
189 | shr ecx, 2 |
||
190 | xor eax, eax |
||
191 | cld |
||
192 | rep stosd |
||
465 | serge | 193 | |
1103 | diamond | 194 | ; scan through memory map and mark free areas as available |
2434 | Serge | 195 | mov ebx, BOOT_VAR-OS_BASE + 0x9104 |
196 | mov edx, [ebx-4] |
||
1103 | diamond | 197 | .scanmap: |
2434 | Serge | 198 | mov ecx, [ebx+8] |