Rev 365 | Rev 379 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
164 | serge | 1 | |
357 | serge | 2 | |
164 | serge | 3 | |
4 | proc mem_test |
||
5 | |||
214 | serge | 6 | |
164 | serge | 7 | and eax, not (CR0_CD+CR0_NW) |
212 | serge | 8 | or eax, CR0_CD ;disable caching |
214 | serge | 9 | mov cr0, eax |
164 | serge | 10 | wbinvd ;invalidate cache |
214 | serge | 11 | |
164 | serge | 12 | |
214 | serge | 13 | mov ebx, 'TEST' |
164 | serge | 14 | @@: |
15 | add edi, 0x400000 |
||
16 | xchg ebx, dword [edi] |
||
17 | cmp dword [edi], 'TEST' |
||
18 | xchg ebx, dword [edi] |
||
19 | je @b |
||
20 | mov [MEM_AMOUNT], edi |
||
357 | serge | 21 | |
164 | serge | 22 | |
212 | serge | 23 | mov cr0, eax |
164 | serge | 24 | mov eax, edi |
25 | mov [LFBSize], 0x00800000 |
||
214 | serge | 26 | ret |
164 | serge | 27 | endp |
28 | |||
29 | |||
30 | proc init_mem |
||
357 | serge | 31 | |
32 | |||
33 | |||
34 | |||
35 | mov [pg_data.kernel_max], eax |
||
36 | |||
37 | |||
38 | mov edx, eax |
||
39 | mov [pg_data.pages_count], eax |
||
40 | mov [pg_data.kernel_pages], eax |
||
41 | |||
42 | |||
43 | mov [pg_data.pagemap_size], eax |
||
44 | |||
45 | |||
46 | cmp edx, 3 |
||
47 | ja @f |
||
48 | inc edx ;at least 4Mb for kernel heap |
||
49 | @@: |
||
50 | mov [pg_data.kernel_tables], edx |
||
51 | |||
52 | |||
164 | serge | 53 | mov edi, sys_pgdir |
54 | mov ecx, 2048 |
||
55 | cld |
||
357 | serge | 56 | rep stosd |
164 | serge | 57 | |
58 | |||
357 | serge | 59 | bt [cpu_caps], CAPS_PSE |
164 | serge | 60 | jnc .no_PSE |
61 | |||
62 | |||
63 | or ebx, CR4_PSE |
||
64 | mov eax, PG_LARGE+PG_SW |
||
65 | bt [cpu_caps], CAPS_PGE |
||
66 | jnc @F |
||
67 | or eax, PG_GLOBAL |
||
68 | or ebx, CR4_PGE |
||
69 | @@: |
||
70 | mov cr4, ebx |
||
168 | serge | 71 | sub [pg_data.kernel_tables], 2 |
357 | serge | 72 | |
168 | serge | 73 | |
357 | serge | 74 | add eax, 0x00400000 |
164 | serge | 75 | mov [edx+4], eax |
357 | serge | 76 | add edx, 8 |
77 | |||
164 | serge | 78 | |
357 | serge | 79 | mov ecx, (HEAP_BASE-0x800000)/4096 |
80 | jmp .map_low |
||
81 | .no_PSE: |
||
164 | serge | 82 | mov eax, PG_SW |
83 | mov ecx, HEAP_BASE/4096 |
||
357 | serge | 84 | .map_low: |
164 | serge | 85 | mov edi, tmp_page_tab |
357 | serge | 86 | @@: ; |
87 | stosd |
||
88 | add eax, 0x1000 |
||
164 | serge | 89 | dec ecx |
90 | jnz @B |
||
357 | serge | 91 | |
164 | serge | 92 | |
93 | shl ecx, 10 |
||
357 | serge | 94 | xor eax, eax |
95 | rep stosd |
||
96 | |||
97 | |||
98 | mov eax, tmp_page_tab+PG_SW |
||
164 | serge | 99 | mov edi, edx |
357 | serge | 100 | |
164 | serge | 101 | |
102 | |||
103 | |||
357 | serge | 104 | add eax, 0x1000 |
164 | serge | 105 | dec ecx |
106 | jnz .map_kernel_tabs |
||
107 | |||
108 | |||
378 | serge | 109 | ret |
164 | serge | 110 | endp |
111 | |||
112 | |||
113 | proc init_page_map |
||
114 | |||
357 | serge | 115 | |
164 | serge | 116 | mov ecx, (HEAP_BASE/4096)/32 ;384/4 |
357 | serge | 117 | mov ebx, ecx |
118 | xor eax,eax |
||
164 | serge | 119 | cld |
120 | rep stosd |
||
121 | |||
122 | |||
123 | mov ecx, [pg_data.pagemap_size] |
||
124 | sub ecx, ebx |
||
357 | serge | 125 | shr ecx, 2 |
164 | serge | 126 | rep stosd |
127 | |||
128 | |||
357 | serge | 129 | mov edx, [pg_data.pages_count] |
164 | serge | 130 | mov ecx, [pg_data.kernel_tables] |
131 | add ecx, (HEAP_BASE/4096) and 31 |
||
357 | serge | 132 | sub edx, HEAP_BASE/4096 |
133 | sub edx, ecx |
||
164 | serge | 134 | mov [pg_data.pages_free], edx |
135 | |||
136 | |||
137 | mov ebx, ecx |
||
138 | shr ecx, 5 |
||
139 | rep stosd |
||
140 | |||
141 | |||
142 | mov ecx, ebx |
||
143 | and ecx, 31 |
||
144 | shl eax, cl |
||
145 | mov [page_start], edi; sys_pgmap+384 |
||
357 | serge | 146 | stosd |
164 | serge | 147 | |
148 | |||
149 | add ebx, [pg_data.pagemap_size] |
||
150 | mov [page_end], ebx |
||
151 | |||
152 | |||
153 | |||
154 | |||
155 | endp |
||
156 | |||
157 | |||
158 | proc alloc_page |
||
159 | |||
160 | |||
161 | cli |
||
162 | mov ebx, [page_start] |
||
163 | mov ecx, [page_end] |
||
164 | .l1: |
||
165 | bsf eax,[ebx]; |
||
166 | jnz .found |
||
167 | add ebx,4 |
||
168 | cmp ebx, ecx |
||
169 | jb .l1 |
||
170 | popfd |
||
171 | xor eax,eax |
||
172 | ret |
||
173 | .found: |
||
174 | btr [ebx], eax |
||
175 | mov [page_start],ebx |
||
176 | sub ebx, sys_pgmap |
||
177 | lea eax, [eax+ebx*8] |
||
254 | serge | 178 | shl eax, 12 |
164 | serge | 179 | dec [pg_data.pages_free] |
180 | popfd |
||
181 | ret |
||
182 | endp |
||
183 | |||
184 | |||
185 | proc alloc_pages stdcall, count:dword |
||
186 | pushfd |
||
187 | cli |
||
188 | mov eax, [count] |
||
189 | add eax, 7 |
||
190 | shr eax, 3 |
||
191 | mov [count], eax |
||
192 | cmp eax, [pg_data.pages_free] |
||
193 | ja .fail |
||
194 | |||
195 | |||
196 | mov ebx, [page_end] |
||
197 | .find: |
||
198 | mov edx, [count] |
||
199 | mov edi, ecx |
||
200 | .match: |
||
201 | cmp byte [ecx], 0xFF |
||
202 | jne .next |
||
203 | dec edx |
||
204 | jz .ok |
||
205 | inc ecx |
||
206 | cmp ecx,ebx |
||
207 | jb .match |
||
208 | .fail: xor eax, eax |
||
209 | popfd |
||
210 | ret |
||
211 | .next: |
||
212 | inc ecx |
||
213 | cmp ecx, ebx |
||
214 | jb .find |
||
215 | popfd |
||
216 | xor eax, eax |
||
217 | ret |
||
218 | .ok: |
||
219 | sub ecx, edi |
||
220 | inc ecx |
||
221 | mov esi, edi |
||
222 | xor eax, eax |
||
223 | rep stosb |
||
224 | sub esi, sys_pgmap |
||
225 | shl esi, 3+12 |
||
226 | mov eax, esi |
||
227 | mov ebx, [count] |
||
228 | shl ebx, 3 |
||
229 | sub [pg_data.pages_free], ebx |
||
230 | popfd |
||
231 | ret |
||
232 | endp |
||
233 | |||
234 | |||