Rev 168 | Rev 172 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 168 | Rev 170 | ||
---|---|---|---|
1 | tmp_page_tab equ 0x01000000 |
1 | tmp_page_tab equ 0x01000000 |
2 | 2 | ||
3 | align 4 |
3 | align 4 |
4 | proc mem_test |
4 | proc mem_test |
5 | mov eax, cr0 |
5 | mov eax, cr0 |
6 | or eax, (CR0_CD+CR0_NW);disable caching |
6 | or eax, (CR0_CD+CR0_NW);disable caching |
7 | mov cr0, eax |
7 | mov cr0, eax |
8 | wbinvd ;invalidate cache |
8 | wbinvd ;invalidate cache |
9 | 9 | ||
10 | xor edi, edi |
10 | xor edi, edi |
11 | mov ebx, 'TEST' |
11 | mov ebx, 'TEST' |
12 | @@: |
12 | @@: |
13 | add edi, 0x400000 |
13 | add edi, 0x400000 |
14 | xchg ebx, dword [edi] |
14 | xchg ebx, dword [edi] |
15 | cmp dword [edi], 'TEST' |
15 | cmp dword [edi], 'TEST' |
16 | xchg ebx, dword [edi] |
16 | xchg ebx, dword [edi] |
17 | je @b |
17 | je @b |
18 | 18 | ||
19 | and eax, not (CR0_CD+CR0_NW) |
19 | and eax, not (CR0_CD+CR0_NW) |
20 | mov cr0, eax |
20 | mov cr0, eax |
21 | mov eax, edi |
21 | mov eax, edi |
22 | ret |
22 | ret |
23 | endp |
23 | endp |
24 | 24 | ||
25 | align 4 |
25 | align 4 |
26 | proc init_memEx |
26 | proc init_memEx |
27 | xor eax, eax |
27 | xor eax, eax |
28 | mov edi, sys_pgdir |
28 | mov edi, sys_pgdir |
29 | mov ecx, 2048 |
29 | mov ecx, 2048 |
30 | rep stosd |
30 | rep stosd |
31 | 31 | ||
32 | bt [cpu_caps], CAPS_PSE |
32 | bt [cpu_caps], CAPS_PSE |
33 | jnc .no_PSE |
33 | jnc .no_PSE |
34 | 34 | ||
35 | mov ebx, cr4 |
35 | mov ebx, cr4 |
36 | or ebx, CR4_PSE |
36 | or ebx, CR4_PSE |
37 | mov eax, PG_LARGE+PG_SW |
37 | mov eax, PG_LARGE+PG_SW |
38 | bt [cpu_caps], CAPS_PGE |
38 | bt [cpu_caps], CAPS_PGE |
39 | jnc @F |
39 | jnc @F |
40 | or eax, PG_GLOBAL |
40 | or eax, PG_GLOBAL |
41 | or ebx, CR4_PGE |
41 | or ebx, CR4_PGE |
42 | 42 | ||
43 | @@: |
43 | @@: |
44 | mov cr4, ebx |
44 | mov cr4, ebx |
45 | 45 | ||
46 | mov dword [sys_pgdir], eax |
46 | mov dword [sys_pgdir], eax |
47 | add eax, 0x00400000 |
47 | add eax, 0x00400000 |
48 | mov dword [sys_pgdir+4], eax |
48 | mov dword [sys_pgdir+4], eax |
49 | add eax, 0x00400000 |
49 | add eax, 0x00400000 |
50 | mov dword [sys_pgdir+8], eax |
50 | mov dword [sys_pgdir+8], eax |
51 | add eax, 0x00400000 |
51 | add eax, 0x00400000 |
52 | mov dword [sys_pgdir+12], eax |
52 | mov dword [sys_pgdir+12], eax |
53 | 53 | ||
54 | mov dword [sys_pgdir+0x600], sys_master_tab+PG_SW |
54 | mov dword [sys_pgdir+0x600], sys_master_tab+PG_SW |
55 | mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW |
55 | mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW |
56 | 56 | ||
57 | mov ecx, [pg_data.kernel_tables] |
57 | mov ecx, [pg_data.kernel_tables] |
58 | sub ecx, 4 |
58 | sub ecx, 4 |
59 | mov eax, tmp_page_tab+PG_SW |
59 | mov eax, tmp_page_tab+PG_SW |
60 | mov edi, sys_pgdir+16 |
60 | mov edi, sys_pgdir+16 |
61 | mov esi, sys_master_tab+16 |
61 | mov esi, sys_master_tab+16 |
62 | 62 | ||
63 | jmp .map_kernel_tabs |
63 | jmp .map_kernel_tabs |
64 | .no_PSE: |
64 | .no_PSE: |
65 | mov eax, PG_SW |
65 | mov eax, PG_SW |
66 | mov esi, tmp_page_tab |
66 | mov esi, tmp_page_tab |
67 | mov ecx, 4096/4 ;0x0 - 0x00FFFFFF |
67 | mov ecx, 4096/4 ;0x0 - 0x00FFFFFF |
68 | .map_low: |
68 | .map_low: |
69 | mov [esi], eax |
69 | mov [esi], eax |
70 | add eax, 0x1000 |
70 | add eax, 0x1000 |
71 | mov [esi+4], eax |
71 | mov [esi+4], eax |
72 | add eax, 0x1000 |
72 | add eax, 0x1000 |
73 | mov [esi+8], eax |
73 | mov [esi+8], eax |
74 | add eax, 0x1000 |
74 | add eax, 0x1000 |
75 | mov [esi+12], eax |
75 | mov [esi+12], eax |
76 | add eax, 0x1000 |
76 | add eax, 0x1000 |
77 | add esi, 16 |
77 | add esi, 16 |
78 | dec ecx |
78 | dec ecx |
79 | jnz .map_low ;ÿäðî |
79 | jnz .map_low ;ÿäðî |
80 | 80 | ||
81 | mov ecx, [pg_data.kernel_tables] |
81 | mov ecx, [pg_data.kernel_tables] |
82 | mov eax, tmp_page_tab+PG_SW |
82 | mov eax, tmp_page_tab+PG_SW |
83 | mov edi, sys_pgdir |
83 | mov edi, sys_pgdir |
84 | mov esi, sys_master_tab |
84 | mov esi, sys_master_tab |
85 | 85 | ||
86 | .map_kernel_tabs: |
86 | .map_kernel_tabs: |
87 | 87 | ||
88 | mov [edi], eax |
88 | mov [edi], eax |
89 | mov [esi], eax |
89 | mov [esi], eax |
90 | add eax, 0x1000 |
90 | add eax, 0x1000 |
91 | add edi, 4 |
91 | add edi, 4 |
92 | add esi, 4 |
92 | add esi, 4 |
93 | dec ecx |
93 | dec ecx |
94 | jnz .map_kernel_tabs |
94 | jnz .map_kernel_tabs |
95 | 95 | ||
96 | mov edi, tmp_page_tab |
96 | mov edi, tmp_page_tab |
97 | bt [cpu_caps], CAPS_PSE |
97 | bt [cpu_caps], CAPS_PSE |
98 | jc @F |
98 | jc @F |
99 | add edi, 4096*4 ;skip low kernel memory |
99 | add edi, 4096*4 ;skip low kernel memory |
100 | @@: |
100 | @@: |
101 | mov ecx, [pg_data.kernel_tables] |
101 | mov ecx, [pg_data.kernel_tables] |
102 | sub ecx, 4 |
102 | sub ecx, 4 |
103 | shl ecx, 10 |
103 | shl ecx, 10 |
104 | xor eax, eax |
104 | xor eax, eax |
105 | cld |
105 | cld |
106 | rep stosd |
106 | rep stosd |
107 | 107 | ||
108 | mov dword [sys_pgdir+0x600], sys_master_tab+PG_SW |
108 | mov dword [sys_pgdir+0x600], sys_master_tab+PG_SW |
109 | mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW |
109 | mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW |
110 | ret |
110 | ret |
111 | endp |
111 | endp |
112 | 112 | ||
113 | ;align 4 |
- | |
114 | ;proc init_mem |
- | |
115 | ; |
- | |
116 | ; xor eax, eax |
- | |
117 | ; mov edi, sys_pgdir |
- | |
118 | ; mov ecx, 2048 |
- | |
119 | ; rep stosd |
- | |
120 | ; |
- | |
121 | ; bt [cpu_caps], CAPS_PSE |
- | |
122 | ; jc .use_PSE |
- | |
123 | ; |
- | |
124 | ; mov eax, PG_SW |
- | |
125 | ; mov esi, tmp_page_tab |
- | |
126 | ; mov ecx, 4096/4 ;0x0 - 0x00FFFFFF |
- | |
127 | ; |
- | |
128 | ;.map_low: |
- | |
129 | ; mov [esi], eax |
- | |
130 | ; add eax, 0x1000 |
- | |
131 | ; mov [esi+4], eax |
- | |
132 | ; add eax, 0x1000 |
- | |
133 | ; mov [esi+8], eax |
- | |
134 | ; add eax, 0x1000 |
- | |
135 | ; mov [esi+12], eax |
- | |
136 | ; add eax, 0x1000 |
- | |
137 | ; add esi, 16 |
- | |
138 | ; dec ecx |
- | |
139 | ; jnz .map_low ;ÿäðî |
- | |
140 | - | ||
141 | ; mov eax, tmp_page_tab+PG_SW |
- | |
142 | ; mov ecx, 4 |
- | |
143 | ; xor ebx, ebx |
- | |
144 | - | ||
145 | ;.map_page_tables: |
- | |
146 | ; mov [sys_pgdir+ebx], eax |
- | |
147 | ; mov [sys_master_tab+ebx], eax |
- | |
148 | ; add eax, 0x1000 |
- | |
149 | ; add ebx, 4 |
- | |
150 | ; dec ecx |
- | |
151 | ; jnz .map_page_tables |
- | |
152 | - | ||
153 | ; mov dword [sys_pgdir+0x600], sys_master_tab+PG_SW |
- | |
154 | ; mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW |
- | |
155 | - | ||
156 | ; ret |
- | |
157 | - | ||
158 | ;.use_PSE: |
- | |
159 | ; mov ebx, cr4 |
- | |
160 | ; or ebx, CR4_PSE |
- | |
161 | ; mov eax, PG_LARGE+PG_SW |
- | |
162 | ; bt [cpu_caps], CAPS_PGE |
- | |
163 | ; jnc @F |
- | |
164 | ; or eax, PG_GLOBAL |
- | |
165 | ; or ebx, CR4_PGE |
- | |
166 | ;@@: |
- | |
167 | ; mov dword [sys_pgdir], eax |
- | |
168 | ; add eax, 0x00400000 |
- | |
169 | ; mov dword [sys_pgdir+4], eax |
- | |
170 | ; add eax, 0x00400000 |
- | |
171 | ; mov dword [sys_pgdir+8], eax |
- | |
172 | ; add eax, 0x00400000 |
- | |
173 | ; mov dword [sys_pgdir+12], eax |
- | |
174 | ; |
- | |
175 | ; mov dword [sys_pgdir+0x600], sys_master_tab+PG_SW |
- | |
176 | ; mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW |
- | |
177 | - | ||
178 | ; mov cr4, ebx |
- | |
179 | ; ret |
- | |
180 | ;endp |
- | |
181 | - | ||
182 | align 4 |
113 | align 4 |
183 | proc init_page_map |
114 | proc init_page_map |
184 | mov edi, sys_pgmap |
115 | mov edi, sys_pgmap |
185 | mov ecx, 512/4 |
116 | mov ecx, 512/4 |
186 | xor eax,eax |
117 | xor eax,eax |
187 | cld |
118 | cld |
188 | rep stosd |
119 | rep stosd |
189 | 120 | ||
190 | not eax |
121 | not eax |
191 | mov ecx, [pg_data.pagemap_size] |
122 | mov ecx, [pg_data.pagemap_size] |
192 | sub ecx, 512 |
123 | sub ecx, 512 |
193 | shr ecx, 2 |
124 | shr ecx, 2 |
194 | rep stosd |
125 | rep stosd |
195 | 126 | ||
196 | mov edi, sys_pgmap+512 |
127 | mov edi, sys_pgmap+512 |
197 | mov edx, [pg_data.pages_count] |
128 | mov edx, [pg_data.pages_count] |
198 | mov ecx, [pg_data.kernel_tables] |
129 | mov ecx, [pg_data.kernel_tables] |
199 | bt [cpu_caps], CAPS_PSE |
130 | bt [cpu_caps], CAPS_PSE |
200 | jnc @f |
131 | jnc @f |
201 | sub ecx, 4 |
132 | sub ecx, 4 |
202 | @@: |
133 | @@: |
203 | sub edx, 4096 |
134 | sub edx, 4096 |
204 | sub edx, ecx |
135 | sub edx, ecx |
205 | mov [pg_data.pages_free], edx |
136 | mov [pg_data.pages_free], edx |
206 | 137 | ||
207 | xor eax, eax |
138 | xor eax, eax |
208 | mov ebx, ecx |
139 | mov ebx, ecx |
209 | shr ecx, 5 |
140 | shr ecx, 5 |
210 | rep stosd |
141 | rep stosd |
211 | 142 | ||
212 | not eax |
143 | not eax |
213 | mov ecx, ebx |
144 | mov ecx, ebx |
214 | and ecx, 31 |
145 | and ecx, 31 |
215 | shl eax, cl |
146 | shl eax, cl |
216 | stosd |
147 | stosd |
217 | 148 | ||
218 | mov [page_start], sys_pgmap+512 |
149 | mov [page_start], sys_pgmap+512 |
219 | mov ebx, sys_pgmap |
150 | mov ebx, sys_pgmap |
220 | add ebx, [pg_data.pagemap_size] |
151 | add ebx, [pg_data.pagemap_size] |
221 | mov [page_end], ebx |
152 | mov [page_end], ebx |
222 | 153 | ||
223 | mov [pg_data.pg_mutex], 0 |
154 | mov [pg_data.pg_mutex], 0 |
224 | 155 | ||
225 | ret |
156 | ret |
226 | endp |
157 | endp |
227 | 158 | ||
228 | ;align 4 |
- | |
229 | ;proc init_pg_mem |
- | |
230 | ; |
- | |
231 | ; mov edi, sys_pgmap |
- | |
232 | ; mov ecx, 512/4 |
- | |
233 | ; xor eax,eax |
- | |
234 | ; cld |
- | |
235 | ; rep stosd |
- | |
236 | ; |
- | |
237 | ; not eax |
- | |
238 | ; mov ecx, [pg_data.pagemap_size] |
- | |
239 | ; sub ecx, 512 |
- | |
240 | ; shr ecx, 2 |
- | |
241 | ; rep stosd |
- | |
242 | ; |
- | |
243 | ; shl eax, PAGES_USED |
- | |
244 | ; mov [sys_pgmap+512], eax |
- | |
245 | ; |
- | |
246 | ; mov [page_start], sys_pgmap+512 |
- | |
247 | ; mov ebx, sys_pgmap |
- | |
248 | ; add ebx, [pg_data.pagemap_size] |
- | |
249 | ; mov [page_end], ebx |
- | |
250 | ; mov eax, [pg_data.pages_count] |
- | |
251 | ; sub eax, 4096+PAGES_USED |
- | |
252 | ; mov [pg_data.pages_free], eax |
- | |
253 | ; |
- | |
254 | ; mov [pg_data.pages_faults], 0 |
- | |
255 | ; |
- | |
256 | ; mov edi, OS_BASE+0x01000000 |
- | |
257 | ; mov esi, [pg_data.kernel_tables] |
- | |
258 | ; sub esi, 4 |
- | |
259 | ; ja @f |
- | |
260 | ; mov esi, 1 |
- | |
261 | ;@@: |
- | |
262 | ; call alloc_page |
- | |
263 | ; stdcall map_page_table, sys_pgdir, edi, eax |
- | |
264 | ; add edi, 0x00400000 |
- | |
265 | ; dec esi |
- | |
266 | ; jnz @B |
- | |
267 | ; |
- | |
268 | ; mov ecx, [pg_data.kernel_tables] |
- | |
269 | ; sub ecx, 4 |
- | |
270 | ; shl ecx, 10 |
- | |
271 | ; mov edi, OS_BASE+0x01000000 |
- | |
272 | ; shr edi, 10 |
- | |
273 | ; add edi, pages_tab |
- | |
274 | ; xor eax, eax |
- | |
275 | ; cld |
- | |
276 | ; rep stosd |
- | |
277 | ; |
- | |
278 | ; mov eax, cr3 |
- | |
279 | ; mov cr3, eax |
- | |
280 | ; |
- | |
281 | ; mov [pg_data.pg_mutex], 0 |
- | |
282 | ; ret |
- | |
283 | ;endp |
- | |
284 | - | ||
285 | align 4 |
159 | align 4 |
286 | proc alloc_page |
160 | proc alloc_page |
287 | 161 | ||
288 | pushfd |
162 | pushfd |
289 | cli |
163 | cli |
290 | mov ebx, [page_start] |
164 | mov ebx, [page_start] |
291 | mov ecx, [page_end] |
165 | mov ecx, [page_end] |
292 | .l1: |
166 | .l1: |
293 | bsf eax,[ebx]; |
167 | bsf eax,[ebx]; |
294 | jnz .found |
168 | jnz .found |
295 | add ebx,4 |
169 | add ebx,4 |
296 | cmp ebx, ecx |
170 | cmp ebx, ecx |
297 | jb .l1 |
171 | jb .l1 |
298 | popfd |
172 | popfd |
299 | xor eax,eax |
173 | xor eax,eax |
300 | ret |
174 | ret |
301 | .found: |
175 | .found: |
302 | btr [ebx], eax |
176 | btr [ebx], eax |
303 | mov [page_start],ebx |
177 | mov [page_start],ebx |
304 | sub ebx, sys_pgmap |
178 | sub ebx, sys_pgmap |
305 | shl ebx, 3 |
179 | shl ebx, 3 |
306 | add eax,ebx |
180 | add eax,ebx |
307 | shl eax, 12 |
181 | shl eax, 12 |
308 | dec [pg_data.pages_free] |
182 | dec [pg_data.pages_free] |
309 | popfd |
183 | popfd |
310 | ret |
184 | ret |
311 | endp |
185 | endp |
312 | 186 | ||
313 | align 4 |
187 | align 4 |
314 | proc alloc_pages stdcall, count:dword |
188 | proc alloc_pages stdcall, count:dword |
315 | pushfd |
189 | pushfd |
316 | cli |
190 | cli |
317 | mov eax, [count] |
191 | mov eax, [count] |
318 | add eax, 7 |
192 | add eax, 7 |
319 | shr eax, 3 |
193 | shr eax, 3 |
320 | mov [count], eax |
194 | mov [count], eax |
321 | cmp eax, [pg_data.pages_free] |
195 | cmp eax, [pg_data.pages_free] |
322 | ja .fail |
196 | ja .fail |
323 | 197 | ||
324 | mov ecx, [page_start] |
198 | mov ecx, [page_start] |
325 | mov ebx, [page_end] |
199 | mov ebx, [page_end] |
326 | .find: |
200 | .find: |
327 | mov edx, [count] |
201 | mov edx, [count] |
328 | mov edi, ecx |
202 | mov edi, ecx |
329 | 203 | ||
330 | .match: |
204 | .match: |
331 | cmp byte [ecx], 0xFF |
205 | cmp byte [ecx], 0xFF |
332 | jne .next |
206 | jne .next |
333 | dec edx |
207 | dec edx |
334 | jz .ok |
208 | jz .ok |
335 | inc ecx |
209 | inc ecx |
336 | cmp ecx,ebx |
210 | cmp ecx,ebx |
337 | jb .match |
211 | jb .match |
338 | .fail: xor eax, eax |
212 | .fail: xor eax, eax |
339 | popfd |
213 | popfd |
340 | ret |
214 | ret |
341 | .next: |
215 | .next: |
342 | inc ecx |
216 | inc ecx |
343 | cmp ecx, ebx |
217 | cmp ecx, ebx |
344 | jb .find |
218 | jb .find |
345 | popfd |
219 | popfd |
346 | xor eax, eax |
220 | xor eax, eax |
347 | ret |
221 | ret |
348 | .ok: |
222 | .ok: |
349 | sub ecx, edi |
223 | sub ecx, edi |
350 | inc ecx |
224 | inc ecx |
351 | mov esi, edi |
225 | mov esi, edi |
352 | xor eax, eax |
226 | xor eax, eax |
353 | rep stosb |
227 | rep stosb |
354 | sub esi, sys_pgmap |
228 | sub esi, sys_pgmap |
355 | shl esi, 3+12 |
229 | shl esi, 3+12 |
356 | mov eax, esi |
230 | mov eax, esi |
357 | mov ebx, [count] |
231 | mov ebx, [count] |
358 | shl ebx, 3 |
232 | shl ebx, 3 |
359 | sub [pg_data.pages_free], ebx |
233 | sub [pg_data.pages_free], ebx |
360 | popfd |
234 | popfd |
361 | ret |
235 | ret |
362 | endp |
236 | endp |
363 | 237 | ||
364 | align 4 |
238 | align 4 |
365 | proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword |
239 | proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword |
366 | mov eax, [phis_addr] |
240 | mov eax, [phis_addr] |
367 | and eax, not 0xFFF |
241 | and eax, not 0xFFF |
368 | or eax, [flags] |
242 | or eax, [flags] |
369 | mov ebx, [lin_addr] |
243 | mov ebx, [lin_addr] |
370 | shr ebx, 12 |
244 | shr ebx, 12 |
371 | mov [pages_tab+ebx*4], eax |
245 | mov [pages_tab+ebx*4], eax |
372 | mov eax, [lin_addr] |
246 | mov eax, [lin_addr] |
373 | invlpg [eax] |
247 | invlpg [eax] |
374 | ret |
248 | ret |
375 | endp |
249 | endp |
376 | 250 | ||
377 | align 4 |
251 | align 4 |
378 | proc free_page |
252 | proc free_page |
379 | ;arg: eax page address |
253 | ;arg: eax page address |
380 | pushfd |
254 | pushfd |
381 | cli |
255 | cli |
382 | inc [pg_data.pages_free] |
256 | inc [pg_data.pages_free] |
383 | shr eax, 12 ;page index |
257 | shr eax, 12 ;page index |
384 | mov ebx, sys_pgmap |
258 | mov ebx, sys_pgmap |
385 | bts [ebx], eax ;that's all! |
259 | bts [ebx], eax ;that's all! |
386 | shr eax, 3 |
260 | shr eax, 3 |
387 | and eax, not 3 ;dword offset from page_map |
261 | and eax, not 3 ;dword offset from page_map |
388 | add eax, ebx |
262 | add eax, ebx |
389 | cmp [page_start], eax |
263 | cmp [page_start], eax |
390 | ja @f |
264 | ja @f |
391 | popfd |
265 | popfd |
392 | ret |
266 | ret |
393 | @@: |
267 | @@: |
394 | mov [page_start], eax |
268 | mov [page_start], eax |
395 | popfd |
269 | popfd |
396 | ret |
270 | ret |
397 | endp |
271 | endp |
398 | 272 | ||
399 | align 4 |
273 | align 4 |
400 | proc map_page_table stdcall,page_dir:dword, lin_addr:dword, phis_addr:dword |
274 | proc map_page_table stdcall,page_dir:dword, lin_addr:dword, phis_addr:dword |
401 | mov ebx, [lin_addr] |
275 | mov ebx, [lin_addr] |
402 | shr ebx, 22 |
276 | shr ebx, 22 |
403 | mov eax, [phis_addr] |
277 | mov eax, [phis_addr] |
404 | and eax, not 0xFFF |
278 | and eax, not 0xFFF |
405 | or eax, PG_UW ;+PG_NOCACHE |
279 | or eax, PG_UW ;+PG_NOCACHE |
406 | mov ecx, [page_dir] |
280 | mov ecx, [page_dir] |
407 | mov dword [ecx+ebx*4], eax |
281 | mov dword [ecx+ebx*4], eax |
408 | mov dword [master_tab+ebx*4], eax |
282 | mov dword [master_tab+ebx*4], eax |
409 | mov eax, [lin_addr] |
283 | mov eax, [lin_addr] |
410 | shr eax, 10 |
284 | shr eax, 10 |
411 | add eax, pages_tab |
285 | add eax, pages_tab |
412 | invlpg [eax] |
286 | invlpg [eax] |
413 | ret |
287 | ret |
414 | endp |
288 | endp |
415 | 289 | ||
416 | align 4 |
290 | align 4 |
417 | proc init_LFB |
291 | proc init_LFB |
418 | 292 | ||
419 | cmp dword [LFBAddress], -1 |
293 | cmp dword [LFBAddress], -1 |
420 | jne @f |
294 | jne @f |
421 | 295 | ||
422 | stdcall kernel_alloc, 0x280000 |
296 | stdcall kernel_alloc, 0x280000 |
423 | mov [LFBAddress], eax |
297 | mov [LFBAddress], eax |
424 | ret |
298 | ret |
425 | @@: |
299 | @@: |
426 | test [SCR_MODE],word 0100000000000000b |
300 | test [SCR_MODE],word 0100000000000000b |
427 | jz @f |
301 | jz @f |
428 | call map_LFB |
302 | call map_LFB |
429 | @@: |
303 | @@: |
430 | ret |
304 | ret |
431 | endp |
305 | endp |
432 | 306 | ||
433 | align 4 |
307 | align 4 |
434 | proc map_LFB |
308 | proc map_LFB |
435 | locals |
309 | locals |
436 | pg_count dd ? |
310 | pg_count dd ? |
437 | endl |
311 | endl |
438 | 312 | ||
439 | mov edi, [LFBSize] |
313 | mov edi, [LFBSize] |
440 | mov esi, [LFBAddress] |
314 | mov esi, [LFBAddress] |
441 | shr edi, 12 |
315 | shr edi, 12 |
442 | mov [pg_count], edi |
316 | mov [pg_count], edi |
443 | shr edi, 10 |
317 | shr edi, 10 |
444 | 318 | ||
445 | bt [cpu_caps], CAPS_PSE |
319 | bt [cpu_caps], CAPS_PSE |
446 | jnc .map_page_tables |
320 | jnc .map_page_tables |
447 | mov ebx, esi |
321 | mov ebx, esi |
448 | or esi, PG_LARGE+PG_UW |
322 | or esi, PG_LARGE+PG_UW |
449 | shr ebx, 20 |
323 | shr ebx, 20 |
450 | mov ecx, ebx |
324 | mov ecx, ebx |
451 | @@: |
325 | @@: |
452 | mov [sys_pgdir+ebx], esi |
326 | mov [sys_pgdir+ebx], esi |
453 | add ebx, 4 |
327 | add ebx, 4 |
454 | add esi, 0x00400000 |
328 | add esi, 0x00400000 |
455 | dec edi |
329 | dec edi |
456 | jnz @B |
330 | jnz @B |
457 | 331 | ||
458 | or dword [sys_pgdir+ecx], PG_GLOBAL |
332 | or dword [sys_pgdir+ecx], PG_GLOBAL |
459 | mov eax, cr3 ;flush TLB |
333 | mov eax, cr3 ;flush TLB |
460 | mov cr3, eax |
334 | mov cr3, eax |
461 | ret |
335 | ret |
462 | 336 | ||
463 | .map_page_tables: |
337 | .map_page_tables: |
464 | 338 | ||
465 | @@: |
339 | @@: |
466 | call alloc_page |
340 | call alloc_page |
467 | stdcall map_page_table,sys_pgdir, esi, eax |
341 | stdcall map_page_table,sys_pgdir, esi, eax |
468 | add esi, 0x00400000 |
342 | add esi, 0x00400000 |
469 | dec edi |
343 | dec edi |
470 | jnz @B |
344 | jnz @B |
471 | 345 | ||
472 | mov eax, [LFBAddress] |
346 | mov eax, [LFBAddress] |
473 | mov esi, eax |
347 | mov esi, eax |
474 | shr esi, 10 |
348 | shr esi, 10 |
475 | add esi, pages_tab |
349 | add esi, pages_tab |
476 | or eax, PG_UW |
350 | or eax, PG_UW |
477 | mov ecx, [pg_count] |
351 | mov ecx, [pg_count] |
478 | shr ecx, 2 |
352 | shr ecx, 2 |
479 | .map: |
353 | .map: |
480 | mov [esi], eax |
354 | mov [esi], eax |
481 | add eax, 0x1000 |
355 | add eax, 0x1000 |
482 | mov [esi+4], eax |
356 | mov [esi+4], eax |
483 | add eax, 0x1000 |
357 | add eax, 0x1000 |
484 | mov [esi+8], eax |
358 | mov [esi+8], eax |
485 | add eax, 0x1000 |
359 | add eax, 0x1000 |
486 | mov [esi+12], eax |
360 | mov [esi+12], eax |
487 | add eax, 0x1000 |
361 | add eax, 0x1000 |
488 | add esi, 16 |
362 | add esi, 16 |
489 | sub ecx, 1 |
363 | sub ecx, 1 |
490 | jnz .map |
364 | jnz .map |
491 | 365 | ||
492 | mov eax, cr3 ;flush TLB |
366 | mov eax, cr3 ;flush TLB |
493 | mov cr3, eax |
367 | mov cr3, eax |
494 | 368 | ||
495 | ret |
369 | ret |
496 | endp |
370 | endp |
497 | 371 | ||
498 | align 4 |
372 | align 4 |
499 | proc new_mem_resize stdcall, new_size:dword |
373 | proc new_mem_resize stdcall, new_size:dword |
500 | 374 | ||
501 | stdcall wait_mutex, pg_data.pg_mutex |
375 | stdcall wait_mutex, pg_data.pg_mutex |
502 | 376 | ||
503 | mov edi, [new_size] |
377 | mov edi, [new_size] |
504 | add edi,4095 |
378 | add edi,4095 |
505 | and edi,not 4095 |
379 | and edi,not 4095 |
506 | mov [new_size], edi |
380 | mov [new_size], edi |
507 | 381 | ||
508 | mov edx,[CURRENT_TASK] |
382 | mov edx,[CURRENT_TASK] |
509 | shl edx,8 |
383 | shl edx,8 |
510 | mov esi, [PROC_BASE+0x8c+edx] |
384 | mov esi, [PROC_BASE+0x8c+edx] |
511 | add esi, 4095 |
385 | add esi, 4095 |
512 | and esi, not 4095 |
386 | and esi, not 4095 |
513 | 387 | ||
514 | cmp edi, esi |
388 | cmp edi, esi |
515 | jae .expand |
389 | jae .expand |
516 | 390 | ||
517 | shr edi, 12 |
391 | shr edi, 12 |
518 | shr esi, 12 |
392 | shr esi, 12 |
519 | @@: |
393 | @@: |
520 | mov eax, [pages_tab+0x00181000+edi*4] |
394 | mov eax, [pages_tab+0x00181000+edi*4] |
521 | test eax, 1 |
395 | test eax, 1 |
522 | jz .next |
396 | jz .next |
523 | mov dword [pages_tab+0x00181000+edi*4], 2 |
397 | mov dword [pages_tab+0x00181000+edi*4], 2 |
524 | mov ebx, edi |
398 | mov ebx, edi |
525 | shl ebx, 12 |
399 | shl ebx, 12 |
526 | invlpg [ebx+std_application_base_address] |
400 | invlpg [ebx+std_application_base_address] |
527 | call free_page |
401 | call free_page |
528 | 402 | ||
529 | .next: add edi, 1 |
403 | .next: add edi, 1 |
530 | cmp edi, esi |
404 | cmp edi, esi |
531 | jb @B |
405 | jb @B |
532 | 406 | ||
533 | .update_size: |
407 | .update_size: |
534 | 408 | ||
535 | mov ebx, [new_size] |
409 | mov ebx, [new_size] |
536 | mov [PROC_BASE+0x8c+edx],ebx |
410 | mov [PROC_BASE+0x8c+edx],ebx |
537 | 411 | ||
538 | ;search threads and update |
412 | ;search threads and update |
539 | ;application memory size infomation |
413 | ;application memory size infomation |
540 | mov ecx,[PROC_BASE+0xb8+edx] |
414 | mov ecx,[PROC_BASE+0xb8+edx] |
541 | mov eax,2 |
415 | mov eax,2 |
542 | 416 | ||
543 | .search_threads: |
417 | .search_threads: |
544 | ;eax = current slot |
418 | ;eax = current slot |
545 | ;ebx = new memory size |
419 | ;ebx = new memory size |
546 | ;ecx = page directory |
420 | ;ecx = page directory |
547 | cmp eax,[TASK_COUNT] |
421 | cmp eax,[TASK_COUNT] |
548 | jg .search_threads_end |
422 | jg .search_threads_end |
549 | mov edx,eax |
423 | mov edx,eax |
550 | shl edx,5 |
424 | shl edx,5 |
551 | cmp word [CURRENT_TASK+edx+0xa],9 ;if slot empty? |
425 | cmp word [CURRENT_TASK+edx+0xa],9 ;if slot empty? |
552 | jz .search_threads_next |
426 | jz .search_threads_next |
553 | shl edx,3 |
427 | shl edx,3 |
554 | cmp [PROC_BASE+edx+0xb8],ecx ;if it is our thread? |
428 | cmp [PROC_BASE+edx+0xb8],ecx ;if it is our thread? |
555 | jnz .search_threads_next |
429 | jnz .search_threads_next |
556 | mov [PROC_BASE+edx+0x8c],ebx ;update memory size |
430 | mov [PROC_BASE+edx+0x8c],ebx ;update memory size |
557 | .search_threads_next: |
431 | .search_threads_next: |
558 | inc eax |
432 | inc eax |
559 | jmp .search_threads |
433 | jmp .search_threads |
560 | .search_threads_end: |
434 | .search_threads_end: |
561 | xor eax, eax |
435 | xor eax, eax |
562 | dec [pg_data.pg_mutex] |
436 | dec [pg_data.pg_mutex] |
563 | ret |
437 | ret |
564 | 438 | ||
565 | .expand: |
439 | .expand: |
566 | add edi, new_app_base |
440 | add edi, new_app_base |
567 | add esi, new_app_base |
441 | add esi, new_app_base |
568 | 442 | ||
569 | push esi |
443 | push esi |
570 | push edi |
444 | push edi |
571 | 445 | ||
572 | add edi, 0x3FFFFF |
446 | add edi, 0x3FFFFF |
573 | and edi, not(0x3FFFFF) |
447 | and edi, not(0x3FFFFF) |
574 | add esi, 0x3FFFFF |
448 | add esi, 0x3FFFFF |
575 | and esi, not(0x3FFFFF) |
449 | and esi, not(0x3FFFFF) |
576 | 450 | ||
577 | cmp esi, edi |
451 | cmp esi, edi |
578 | jae .grow |
452 | jae .grow |
579 | 453 | ||
580 | xchg esi, edi |
454 | xchg esi, edi |
581 | 455 | ||
582 | mov eax, cr3 |
456 | mov eax, cr3 |
583 | stdcall map_page,[tmp_task_pdir],eax,dword PG_SW+PG_NOCACHE |
457 | stdcall map_page,[tmp_task_pdir],eax,dword PG_SW+PG_NOCACHE |
584 | 458 | ||
585 | @@: |
459 | @@: |
586 | call alloc_page |
460 | call alloc_page |
587 | test eax, eax |
461 | test eax, eax |
588 | jz .exit |
462 | jz .exit |
589 | 463 | ||
590 | stdcall map_page_table,[tmp_task_pdir], edi, eax |
464 | stdcall map_page_table,[tmp_task_pdir], edi, eax |
591 | 465 | ||
592 | push edi |
466 | push edi |
593 | shr edi, 10 |
467 | shr edi, 10 |
594 | add edi, pages_tab |
468 | add edi, pages_tab |
595 | mov ecx, 1024 |
469 | mov ecx, 1024 |
596 | xor eax, eax |
470 | xor eax, eax |
597 | cld |
471 | cld |
598 | rep stosd |
472 | rep stosd |
599 | pop edi |
473 | pop edi |
600 | 474 | ||
601 | add edi, 0x00400000 |
475 | add edi, 0x00400000 |
602 | cmp edi, esi |
476 | cmp edi, esi |
603 | jb @B |
477 | jb @B |
604 | 478 | ||
605 | stdcall map_page,[tmp_task_pdir],dword 0,dword PG_UNMAP |
479 | stdcall map_page,[tmp_task_pdir],dword 0,dword PG_UNMAP |
606 | .grow: |
480 | .grow: |
607 | pop edi |
481 | pop edi |
608 | pop esi |
482 | pop esi |
609 | @@: |
483 | @@: |
610 | call alloc_page |
484 | call alloc_page |
611 | test eax, eax |
485 | test eax, eax |
612 | jz .exit |
486 | jz .exit |
613 | stdcall map_page,esi,eax,dword PG_UW |
487 | stdcall map_page,esi,eax,dword PG_UW |
614 | 488 | ||
615 | push edi |
489 | push edi |
616 | mov edi, esi |
490 | mov edi, esi |
617 | xor eax, eax |
491 | xor eax, eax |
618 | mov ecx, 1024 |
492 | mov ecx, 1024 |
619 | cld |
493 | cld |
620 | rep stosd |
494 | rep stosd |
621 | pop edi |
495 | pop edi |
622 | 496 | ||
623 | add esi, 0x1000 |
497 | add esi, 0x1000 |
624 | cmp esi, edi |
498 | cmp esi, edi |
625 | jna @B |
499 | jna @B |
626 | 500 | ||
627 | jmp .update_size |
501 | jmp .update_size |
628 | .exit: |
502 | .exit: |
629 | xor eax, eax |
503 | xor eax, eax |
630 | inc eax |
504 | inc eax |
631 | dec [pg_data.pg_mutex] |
505 | dec [pg_data.pg_mutex] |
632 | ret |
506 | ret |
633 | endp |
507 | endp |
634 | 508 | ||
635 | align 4 |
509 | align 4 |
636 | proc get_pg_addr stdcall, lin_addr:dword |
510 | proc get_pg_addr stdcall, lin_addr:dword |
637 | mov ebx, [lin_addr] |
511 | mov ebx, [lin_addr] |
638 | shr ebx, 12 |
512 | shr ebx, 12 |
639 | mov eax, [pages_tab+ebx*4] |
513 | mov eax, [pages_tab+ebx*4] |
640 | and eax, 0xFFFFF000 |
514 | and eax, 0xFFFFF000 |
641 | ret |
515 | ret |
642 | endp |
516 | endp |
643 | 517 | ||
644 | align 16 |
518 | align 16 |
645 | proc page_fault_handler |
519 | proc page_fault_handler |
646 | pushad |
520 | pushad |
647 | 521 | ||
648 | mov ebp, esp |
522 | mov ebp, esp |
649 | mov eax, cr2 |
523 | mov eax, cr2 |
650 | sub esp, 4 |
524 | sub esp, 4 |
651 | mov [esp], eax |
525 | mov [esp], eax |
652 | push ds |
526 | push ds |
653 | 527 | ||
654 | mov ax, 0x10 |
528 | mov ax, 0x10 |
655 | mov ds, ax |
529 | mov ds, ax |
656 | 530 | ||
657 | ; mov edx, 0x400 ;bocsh |
531 | ; mov edx, 0x400 ;bocsh |
658 | ; mov al,0xff ;bocsh |
532 | ; mov al,0xff ;bocsh |
659 | ; out dx, al ;bocsh |
533 | ; out dx, al ;bocsh |
660 | ; nop ;bocsh fix |
534 | ; nop ;bocsh fix |
661 | 535 | ||
662 | 536 | ||
663 | mov ebx, [ebp-4] |
537 | mov ebx, [ebp-4] |
664 | 538 | ||
665 | cmp ebx, 0xe0000000 |
539 | cmp ebx, 0xe0000000 |
666 | jae .lfb_addr |
540 | jae .lfb_addr |
667 | 541 | ||
668 | cmp ebx, 0x60400000 |
542 | cmp ebx, 0x60400000 |
669 | jae .user_space |
543 | jae .user_space |
670 | 544 | ||
671 | cmp ebx, 0x60000000 |
545 | cmp ebx, 0x60000000 |
672 | jae .tab_space |
546 | jae .tab_space |
673 | 547 | ||
674 | jmp .kernel_space |
548 | jmp .kernel_space |
675 | 549 | ||
676 | .user_space: |
550 | .user_space: |
677 | inc [pg_data.pages_faults] |
551 | inc [pg_data.pages_faults] |
678 | 552 | ||
679 | shr ebx, 12 |
553 | shr ebx, 12 |
680 | mov eax, [pages_tab+ebx*4] |
554 | mov eax, [pages_tab+ebx*4] |
681 | 555 | ||
682 | shr ebx, 10 |
556 | shr ebx, 10 |
683 | mov edx, [master_tab+ebx*4] |
557 | mov edx, [master_tab+ebx*4] |
684 | 558 | ||
685 | test eax, 2 |
559 | test eax, 2 |
686 | jz .exit |
560 | jz .exit |
687 | 561 | ||
688 | call alloc_page |
562 | call alloc_page |
689 | and eax, eax |
563 | and eax, eax |
690 | jz .exit |
564 | jz .exit |
691 | 565 | ||
692 | stdcall map_page,[ebp-4],eax,dword PG_UW |
566 | stdcall map_page,[ebp-4],eax,dword PG_UW |
693 | 567 | ||
694 | mov esi, [ebp-4] |
568 | mov esi, [ebp-4] |
695 | and esi, 0xFFFFF000 |
569 | and esi, 0xFFFFF000 |
696 | mov ecx, 1024 |
570 | mov ecx, 1024 |
697 | xor eax, eax |
571 | xor eax, eax |
698 | @@: |
572 | @@: |
699 | mov [esi], eax |
573 | mov [esi], eax |
700 | add esi, 4 |
574 | add esi, 4 |
701 | dec ecx |
575 | dec ecx |
702 | jnz @B |
576 | jnz @B |
703 | .exit: |
577 | .exit: |
704 | pop ds |
578 | pop ds |
705 | mov esp, ebp |
579 | mov esp, ebp |
706 | popad |
580 | popad |
707 | add esp, 4 |
581 | add esp, 4 |
708 | iretd |
582 | iretd |
709 | 583 | ||
710 | .kernel_space: |
584 | .kernel_space: |
711 | shr ebx, 12 |
585 | shr ebx, 12 |
712 | mov eax, [pages_tab+ebx*4] |
586 | mov eax, [pages_tab+ebx*4] |
713 | shr ebx, 10 |
587 | shr ebx, 10 |
714 | mov eax, [master_tab+ebx*4] |
588 | mov eax, [master_tab+ebx*4] |
715 | 589 | ||
716 | pop ds |
590 | pop ds |
717 | mov esp, ebp |
591 | mov esp, ebp |
718 | popad |
592 | popad |
719 | add esp, 4 |
593 | add esp, 4 |
720 | iretd |
594 | iretd |
721 | 595 | ||
722 | .old_addr: |
596 | .old_addr: |
723 | shr ebx, 12 |
597 | shr ebx, 12 |
724 | ; mov eax, [pages_tab+ebx*4] |
598 | ; mov eax, [pages_tab+ebx*4] |
725 | shr ebx, 10 |
599 | shr ebx, 10 |
726 | mov eax, [master_tab+ebx*4] |
600 | mov eax, [master_tab+ebx*4] |
727 | 601 | ||
728 | pop ds |
602 | pop ds |
729 | mov esp, ebp |
603 | mov esp, ebp |
730 | popad |
604 | popad |
731 | add esp, 4 |
605 | add esp, 4 |
732 | iretd |
606 | iretd |
733 | 607 | ||
734 | .lfb_addr: |
608 | .lfb_addr: |
735 | shr ebx, 22 |
609 | shr ebx, 22 |
736 | ;mov ecx, [sys_page_dir] |
610 | ;mov ecx, [sys_page_dir] |
737 | mov eax, [master_tab+ebx*4] |
611 | mov eax, [master_tab+ebx*4] |
738 | 612 | ||
739 | pop ds |
613 | pop ds |
740 | mov esp, ebp |
614 | mov esp, ebp |
741 | popad |
615 | popad |
742 | add esp, 4 |
616 | add esp, 4 |
743 | iretd |
617 | iretd |
744 | 618 | ||
745 | .tab_space: |
619 | .tab_space: |
746 | shr ebx, 12 |
620 | shr ebx, 12 |
747 | ; mov eax, [pages_tab+ebx*4] |
621 | ; mov eax, [pages_tab+ebx*4] |
748 | shr ebx, 10 |
622 | shr ebx, 10 |
749 | ;mov ecx, [sys_page_dir] |
623 | ;mov ecx, [sys_page_dir] |
750 | mov eax, [master_tab+ebx*4] |
624 | mov eax, [master_tab+ebx*4] |
751 | 625 | ||
752 | pop ds |
626 | pop ds |
753 | mov esp, ebp |
627 | mov esp, ebp |
754 | popad |
628 | popad |
755 | add esp, 4 |
629 | add esp, 4 |
756 | iretd |
630 | iretd |
757 | endp |
631 | endp |
758 | 632 | ||
759 | align 4 |
633 | align 4 |
760 | proc map_mem stdcall, lin_addr:dword,pdir:dword,\ |
634 | proc map_mem stdcall, lin_addr:dword,pdir:dword,\ |
761 | ofs:dword,buf_size:dword |
635 | ofs:dword,buf_size:dword |
762 | mov eax, [buf_size] |
636 | mov eax, [buf_size] |
763 | test eax, eax |
637 | test eax, eax |
764 | jz .exit |
638 | jz .exit |
765 | 639 | ||
766 | mov eax, [pdir] |
640 | mov eax, [pdir] |
767 | and eax, 0xFFFFF000 |
641 | and eax, 0xFFFFF000 |
768 | 642 | ||
769 | stdcall map_page,[ipc_pdir],eax,dword PG_UW |
643 | stdcall map_page,[ipc_pdir],eax,dword PG_UW |
770 | mov ebx, [ofs] |
644 | mov ebx, [ofs] |
771 | shr ebx, 22 |
645 | shr ebx, 22 |
772 | mov esi, [ipc_pdir] |
646 | mov esi, [ipc_pdir] |
773 | mov edi, [ipc_ptab] |
647 | mov edi, [ipc_ptab] |
774 | mov eax, [esi+ebx*4] |
648 | mov eax, [esi+ebx*4] |
775 | and eax, 0xFFFFF000 |
649 | and eax, 0xFFFFF000 |
776 | test eax, eax |
650 | test eax, eax |
777 | jz .exit |
651 | jz .exit |
778 | stdcall map_page,edi,eax,dword PG_UW |
652 | stdcall map_page,edi,eax,dword PG_UW |
779 | ; inc ebx |
653 | ; inc ebx |
780 | ; add edi, 0x1000 |
654 | ; add edi, 0x1000 |
781 | ; mov eax, [esi+ebx*4] |
655 | ; mov eax, [esi+ebx*4] |
782 | ; test eax, eax |
656 | ; test eax, eax |
783 | ; jz @f |
657 | ; jz @f |
784 | ; and eax, 0xFFFFF000 |
658 | ; and eax, 0xFFFFF000 |
785 | ; stdcall map_page, edi, eax |
659 | ; stdcall map_page, edi, eax |
786 | 660 | ||
787 | @@: mov edi, [lin_addr] |
661 | @@: mov edi, [lin_addr] |
788 | and edi, 0xFFFFF000 |
662 | and edi, 0xFFFFF000 |
789 | mov ecx, [buf_size] |
663 | mov ecx, [buf_size] |
790 | add ecx, 4095 |
664 | add ecx, 4095 |
791 | shr ecx, 12 |
665 | shr ecx, 12 |
792 | inc ecx |
666 | inc ecx |
793 | 667 | ||
794 | mov edx, [ofs] |
668 | mov edx, [ofs] |
795 | shr edx, 12 |
669 | shr edx, 12 |
796 | and edx, 0x3FF |
670 | and edx, 0x3FF |
797 | mov esi, [ipc_ptab] |
671 | mov esi, [ipc_ptab] |
798 | 672 | ||
799 | .map: mov eax, [esi+edx*4] |
673 | .map: mov eax, [esi+edx*4] |
800 | and eax, 0xFFFFF000 |
674 | and eax, 0xFFFFF000 |
801 | test eax, eax |
675 | test eax, eax |
802 | jz .exit |
676 | jz .exit |
803 | stdcall map_page,edi,eax,dword PG_UW |
677 | stdcall map_page,edi,eax,dword PG_UW |
804 | add edi, 0x1000 |
678 | add edi, 0x1000 |
805 | inc edx |
679 | inc edx |
806 | dec ecx |
680 | dec ecx |
807 | jnz .map |
681 | jnz .map |
808 | 682 | ||
809 | .exit: |
683 | .exit: |
810 | ret |
684 | ret |
811 | endp |
685 | endp |
812 | 686 | ||
813 | align 4 |
687 | align 4 |
814 | proc map_memEx stdcall, lin_addr:dword,pdir:dword,\ |
688 | proc map_memEx stdcall, lin_addr:dword,pdir:dword,\ |
815 | ofs:dword,buf_size:dword |
689 | ofs:dword,buf_size:dword |
816 | mov eax, [buf_size] |
690 | mov eax, [buf_size] |
817 | test eax, eax |
691 | test eax, eax |
818 | jz .exit |
692 | jz .exit |
819 | 693 | ||
820 | mov eax, [pdir] |
694 | mov eax, [pdir] |
821 | and eax, 0xFFFFF000 |
695 | and eax, 0xFFFFF000 |
822 | 696 | ||
823 | stdcall map_page,[proc_mem_pdir],eax,dword PG_UW |
697 | stdcall map_page,[proc_mem_pdir],eax,dword PG_UW |
824 | mov ebx, [ofs] |
698 | mov ebx, [ofs] |
825 | shr ebx, 22 |
699 | shr ebx, 22 |
826 | mov esi, [proc_mem_pdir] |
700 | mov esi, [proc_mem_pdir] |
827 | mov edi, [proc_mem_tab] |
701 | mov edi, [proc_mem_tab] |
828 | mov eax, [esi+ebx*4] |
702 | mov eax, [esi+ebx*4] |
829 | and eax, 0xFFFFF000 |
703 | and eax, 0xFFFFF000 |
830 | test eax, eax |
704 | test eax, eax |
831 | jz .exit |
705 | jz .exit |
832 | stdcall map_page,edi,eax,dword PG_UW |
706 | stdcall map_page,edi,eax,dword PG_UW |
833 | 707 | ||
834 | @@: mov edi, [lin_addr] |
708 | @@: mov edi, [lin_addr] |
835 | and edi, 0xFFFFF000 |
709 | and edi, 0xFFFFF000 |
836 | mov ecx, [buf_size] |
710 | mov ecx, [buf_size] |
837 | add ecx, 4095 |
711 | add ecx, 4095 |
838 | shr ecx, 12 |
712 | shr ecx, 12 |
839 | inc ecx |
713 | inc ecx |
840 | 714 | ||
841 | mov edx, [ofs] |
715 | mov edx, [ofs] |
842 | shr edx, 12 |
716 | shr edx, 12 |
843 | and edx, 0x3FF |
717 | and edx, 0x3FF |
844 | mov esi, [proc_mem_tab] |
718 | mov esi, [proc_mem_tab] |
845 | 719 | ||
846 | .map: mov eax, [esi+edx*4] |
720 | .map: mov eax, [esi+edx*4] |
847 | ; and eax, 0xFFFFF000 |
721 | ; and eax, 0xFFFFF000 |
848 | ; test eax, eax |
722 | ; test eax, eax |
849 | ; jz .exit |
723 | ; jz .exit |
850 | stdcall map_page,edi,eax,dword PG_UW |
724 | stdcall map_page,edi,eax,dword PG_UW |
851 | add edi, 0x1000 |
725 | add edi, 0x1000 |
852 | inc edx |
726 | inc edx |
853 | dec ecx |
727 | dec ecx |
854 | jnz .map |
728 | jnz .map |
855 | .exit: |
729 | .exit: |
856 | ret |
730 | ret |
857 | endp |
731 | endp |
858 | 732 | ||
859 | 733 | ||
860 | 734 | ||
861 | 735 | ||
862 | sys_IPC: |
736 | sys_IPC: |
863 | ;input: |
737 | ;input: |
864 | ; eax=1 - set ipc buffer area |
738 | ; eax=1 - set ipc buffer area |
865 | ; ebx=address of buffer |
739 | ; ebx=address of buffer |
866 | ; ecx=size of buffer |
740 | ; ecx=size of buffer |
867 | ; eax=2 - send message |
741 | ; eax=2 - send message |
868 | ; ebx=PID |
742 | ; ebx=PID |
869 | ; ecx=address of message |
743 | ; ecx=address of message |
870 | ; edx=size of message |
744 | ; edx=size of message |
871 | 745 | ||
872 | cmp eax,1 |
746 | cmp eax,1 |
873 | jne @f |
747 | jne @f |
874 | call set_ipc_buff |
748 | call set_ipc_buff |
875 | mov [esp+36], eax |
749 | mov [esp+36], eax |
876 | ret |
750 | ret |
877 | 751 | ||
878 | @@: |
752 | @@: |
879 | cmp eax, 2 |
753 | cmp eax, 2 |
880 | jne @f |
754 | jne @f |
881 | stdcall sys_ipc_send, ebx, ecx, edx |
755 | stdcall sys_ipc_send, ebx, ecx, edx |
882 | mov [esp+36], eax |
756 | mov [esp+36], eax |
883 | ret |
757 | ret |
884 | 758 | ||
885 | @@: |
759 | @@: |
886 | xor eax, eax |
760 | xor eax, eax |
887 | not eax |
761 | not eax |
888 | mov [esp+36], eax |
762 | mov [esp+36], eax |
889 | ret |
763 | ret |
890 | 764 | ||
891 | align 4 |
765 | align 4 |
892 | proc set_ipc_buff |
766 | proc set_ipc_buff |
893 | 767 | ||
894 | mov eax,[CURRENT_TASK] |
768 | mov eax,[CURRENT_TASK] |
895 | shl eax,8 |
769 | shl eax,8 |
896 | add eax, PROC_BASE |
770 | add eax, PROC_BASE |
897 | pushf |
771 | pushf |
898 | cli |
772 | cli |
899 | mov [eax+0xA0],ebx ;set fields in extended information area |
773 | mov [eax+0xA0],ebx ;set fields in extended information area |
900 | mov [eax+0xA4],ecx |
774 | mov [eax+0xA4],ecx |
901 | 775 | ||
902 | add ebx, new_app_base |
776 | add ebx, new_app_base |
903 | add ecx, ebx |
777 | add ecx, ebx |
904 | add ecx, 4095 |
778 | add ecx, 4095 |
905 | and ecx, not 4095 |
779 | and ecx, not 4095 |
906 | 780 | ||
907 | .touch: mov eax, [ebx] |
781 | .touch: mov eax, [ebx] |
908 | add ebx, 0x1000 |
782 | add ebx, 0x1000 |
909 | cmp ebx, ecx |
783 | cmp ebx, ecx |
910 | jna .touch |
784 | jna .touch |
911 | 785 | ||
912 | popf |
786 | popf |
913 | xor eax, eax |
787 | xor eax, eax |
914 | ret |
788 | ret |
915 | endp |
789 | endp |
916 | 790 | ||
917 | proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword |
791 | proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword |
918 | locals |
792 | locals |
919 | dst_slot dd ? |
793 | dst_slot dd ? |
920 | dst_offset dd ? |
794 | dst_offset dd ? |
921 | buf_size dd ? |
795 | buf_size dd ? |
922 | endl |
796 | endl |
923 | 797 | ||
924 | pushf |
798 | pushf |
925 | cli |
799 | cli |
926 | 800 | ||
927 | mov eax, [PID] |
801 | mov eax, [PID] |
928 | call pid_to_slot |
802 | call pid_to_slot |
929 | test eax,eax |
803 | test eax,eax |
930 | jz .no_pid |
804 | jz .no_pid |
931 | 805 | ||
932 | mov [dst_slot], eax |
806 | mov [dst_slot], eax |
933 | shl eax,8 |
807 | shl eax,8 |
934 | mov edi,[eax+PROC_BASE+0xa0] ;is ipc area defined? |
808 | mov edi,[eax+PROC_BASE+0xa0] ;is ipc area defined? |
935 | test edi,edi |
809 | test edi,edi |
936 | jz .no_ipc_area |
810 | jz .no_ipc_area |
937 | 811 | ||
938 | mov ebx, edi |
812 | mov ebx, edi |
939 | add edi, new_app_base |
813 | add edi, new_app_base |
940 | and ebx, 0xFFF |
814 | and ebx, 0xFFF |
941 | mov [dst_offset], ebx |
815 | mov [dst_offset], ebx |
942 | 816 | ||
943 | mov esi, [eax+PROC_BASE+0xa4] |
817 | mov esi, [eax+PROC_BASE+0xa4] |
944 | mov [buf_size], esi |
818 | mov [buf_size], esi |
945 | 819 | ||
946 | stdcall map_mem, [ipc_tmp], [PROC_BASE+eax+0xB8],\ |
820 | stdcall map_mem, [ipc_tmp], [PROC_BASE+eax+0xB8],\ |
947 | edi, esi |
821 | edi, esi |
948 | 822 | ||
949 | mov edi, [dst_offset] |
823 | mov edi, [dst_offset] |
950 | add edi, [ipc_tmp] |
824 | add edi, [ipc_tmp] |
951 | cmp dword [edi], 0 |
825 | cmp dword [edi], 0 |
952 | jnz .ipc_blocked ;if dword [buffer]<>0 - ipc blocked now |
826 | jnz .ipc_blocked ;if dword [buffer]<>0 - ipc blocked now |
953 | mov ebx, dword [edi+4] |
827 | mov ebx, dword [edi+4] |
954 | mov edx, ebx |
828 | mov edx, ebx |
955 | add ebx, 8 |
829 | add ebx, 8 |
956 | add ebx, [msg_size] |
830 | add ebx, [msg_size] |
957 | cmp ebx, [buf_size] |
831 | cmp ebx, [buf_size] |
958 | ja .buffer_overflow ;esi<0 - not enough memory in buffer |
832 | ja .buffer_overflow ;esi<0 - not enough memory in buffer |
959 | mov dword [edi+4], ebx |
833 | mov dword [edi+4], ebx |
960 | mov eax,[TASK_BASE] |
834 | mov eax,[TASK_BASE] |
961 | mov eax, [eax+0x04] ;eax - our PID |
835 | mov eax, [eax+0x04] ;eax - our PID |
962 | mov edi, [dst_offset] |
836 | mov edi, [dst_offset] |
963 | add edi, [ipc_tmp] |
837 | add edi, [ipc_tmp] |
964 | add edi, edx |
838 | add edi, edx |
965 | mov [edi], eax |
839 | mov [edi], eax |
966 | mov ecx, [msg_size] |
840 | mov ecx, [msg_size] |
967 | 841 | ||
968 | mov [edi+4], ecx |
842 | mov [edi+4], ecx |
969 | add edi, 8 |
843 | add edi, 8 |
970 | mov esi, [msg_addr] |
844 | mov esi, [msg_addr] |
971 | add esi, new_app_base |
845 | add esi, new_app_base |
972 | cld |
846 | cld |
973 | rep movsb |
847 | rep movsb |
974 | 848 | ||
975 | mov ebx, [ipc_tmp] |
849 | mov ebx, [ipc_tmp] |
976 | mov edx, ebx |
850 | mov edx, ebx |
977 | shr ebx, 12 |
851 | shr ebx, 12 |
978 | xor eax, eax |
852 | xor eax, eax |
979 | mov [pages_tab+ebx*4], eax |
853 | mov [pages_tab+ebx*4], eax |
980 | invlpg [edx] |
854 | invlpg [edx] |
981 | 855 | ||
982 | mov ebx, [ipc_pdir] |
856 | mov ebx, [ipc_pdir] |
983 | mov edx, ebx |
857 | mov edx, ebx |
984 | shr ebx, 12 |
858 | shr ebx, 12 |
985 | xor eax, eax |
859 | xor eax, eax |
986 | mov [pages_tab+ebx*4], eax |
860 | mov [pages_tab+ebx*4], eax |
987 | invlpg [edx] |
861 | invlpg [edx] |
988 | 862 | ||
989 | mov ebx, [ipc_ptab] |
863 | mov ebx, [ipc_ptab] |
990 | mov edx, ebx |
864 | mov edx, ebx |
991 | shr ebx, 12 |
865 | shr ebx, 12 |
992 | xor eax, eax |
866 | xor eax, eax |
993 | mov [pages_tab+ebx*4], eax |
867 | mov [pages_tab+ebx*4], eax |
994 | invlpg [edx] |
868 | invlpg [edx] |
995 | 869 | ||
996 | mov eax, [dst_slot] |
870 | mov eax, [dst_slot] |
997 | shl eax, 8 |
871 | shl eax, 8 |
998 | or [eax+PROC_BASE+0xA8],dword 0x40 |
872 | or [eax+PROC_BASE+0xA8],dword 0x40 |
999 | cmp dword [check_idle_semaphore],20 |
873 | cmp dword [check_idle_semaphore],20 |
1000 | jge .ipc_no_cis |
874 | jge .ipc_no_cis |
1001 | 875 | ||
1002 | mov dword [check_idle_semaphore],5 |
876 | mov dword [check_idle_semaphore],5 |
1003 | .ipc_no_cis: |
877 | .ipc_no_cis: |
1004 | popf |
878 | popf |
1005 | xor eax, eax |
879 | xor eax, eax |
1006 | ret |
880 | ret |
1007 | .no_pid: |
881 | .no_pid: |
1008 | popf |
882 | popf |
1009 | mov eax, 4 |
883 | mov eax, 4 |
1010 | ret |
884 | ret |
1011 | .no_ipc_area: |
885 | .no_ipc_area: |
1012 | popf |
886 | popf |
1013 | xor eax, eax |
887 | xor eax, eax |
1014 | inc eax |
888 | inc eax |
1015 | ret |
889 | ret |
1016 | .ipc_blocked: |
890 | .ipc_blocked: |
1017 | popf |
891 | popf |
1018 | mov eax, 2 |
892 | mov eax, 2 |
1019 | ret |
893 | ret |
1020 | .buffer_overflow: |
894 | .buffer_overflow: |
1021 | popf |
895 | popf |
1022 | mov eax, 3 |
896 | mov eax, 3 |
1023 | ret |
897 | ret |
1024 | endp |
898 | endp |
1025 | 899 | ||
1026 | align 4 |
900 | align 4 |
1027 | proc get_mem_info stdcall, val:dword |
901 | sysfn_meminfo: |
1028 | 902 | ||
1029 | mov esi, [val] |
- | |
1030 | - | ||
- | 903 | add ebx, new_app_base |
|
1031 | mov eax, [pg_data.pages_count] |
904 | mov eax, [pg_data.pages_count] |
1032 | mov [esi], eax |
905 | mov [ebx], eax |
1033 | mov ebx, [pg_data.pages_free] |
906 | mov ecx, [pg_data.pages_free] |
1034 | mov [esi+4], ebx |
907 | mov [ebx+4], ecx |
1035 | mov ecx, [pg_data.pages_faults] |
908 | mov edx, [pg_data.pages_faults] |
1036 | mov [esi+8], ecx |
909 | mov [ebx+8], edx |
- | 910 | mov esi, [heap_size] |
|
- | 911 | mov [ebx+12], esi |
|
- | 912 | mov edi, [heap_free] |
|
- | 913 | mov [ebx+16], edi |
|
- | 914 | mov eax, [heap_blocks] |
|
- | 915 | mov [ebx+20], eax |
|
- | 916 | mov ecx, [free_blocks] |
|
- | 917 | mov [ebx+24], ecx |
|
1037 | 918 | ||
1038 | ret |
- | |
1039 | endp |
919 | ret |
1040 | 920 | ||
1041 | align 4 |
921 | align 4 |
1042 | new_services: |
922 | new_services: |
1043 | 923 | ||
1044 | cmp eax,4 |
924 | cmp eax,4 |
1045 | jle sys_sheduler |
925 | jle sys_sheduler |
1046 | 926 | ||
1047 | cmp eax, 10 |
927 | cmp eax, 11 |
1048 | jb .fail |
928 | jb .fail |
1049 | ja @f |
929 | ja @f |
1050 | 930 | ||
1051 | add ebx, new_app_base |
931 | ; add ebx, new_app_base |
1052 | stdcall get_mem_info, ebx |
932 | ; stdcall get_mem_info, ebx |
1053 | mov [esp+36], eax |
933 | ; mov [esp+36], eax |
1054 | ret |
934 | ; ret |
1055 | @@: |
935 | ;@@: |
1056 | cmp eax, 11 |
936 | ; cmp eax, 11 |
1057 | ja @f |
937 | ; ja @f |
1058 | 938 | ||
1059 | stdcall init_heap, ebx |
939 | stdcall init_heap, ebx |
1060 | mov [esp+36], eax |
940 | mov [esp+36], eax |
1061 | ret |
941 | ret |
1062 | @@: |
942 | @@: |
1063 | cmp eax, 12 |
943 | cmp eax, 12 |
1064 | ja @f |
944 | ja @f |
1065 | 945 | ||
1066 | stdcall user_alloc, ebx |
946 | stdcall user_alloc, ebx |
1067 | mov [esp+36], eax |
947 | mov [esp+36], eax |
1068 | ret |
948 | ret |
1069 | @@: |
949 | @@: |
1070 | cmp eax, 13 |
950 | cmp eax, 13 |
1071 | ja @f |
951 | ja @f |
1072 | 952 | ||
1073 | stdcall user_free, ebx |
953 | stdcall user_free, ebx |
1074 | mov [esp+36], eax |
954 | mov [esp+36], eax |
1075 | ret |
955 | ret |
1076 | @@: |
956 | @@: |
1077 | cmp eax, 14 |
957 | cmp eax, 14 |
1078 | ja @f |
958 | ja @f |
1079 | add ebx,new_app_base |
959 | add ebx,new_app_base |
1080 | stdcall get_notify, ebx |
960 | stdcall get_notify, ebx |
1081 | ret |
961 | ret |
1082 | @@: |
962 | @@: |
1083 | cmp eax, 15 |
963 | cmp eax, 15 |
1084 | ja @f |
964 | ja @f |
1085 | mov ecx, [CURRENT_TASK] |
965 | mov ecx, [CURRENT_TASK] |
1086 | shl ecx, 8 |
966 | shl ecx, 8 |
1087 | mov eax, [ecx+PROC_BASE+APPDATA.fpu_handler] |
967 | mov eax, [ecx+PROC_BASE+APPDATA.fpu_handler] |
1088 | mov [ecx+PROC_BASE+APPDATA.fpu_handler], ebx |
968 | mov [ecx+PROC_BASE+APPDATA.fpu_handler], ebx |
1089 | mov [esp+36], eax |
969 | mov [esp+36], eax |
1090 | ret |
970 | ret |
1091 | @@: |
971 | @@: |
1092 | cmp eax, 16 |
972 | cmp eax, 16 |
1093 | ja @f |
973 | ja @f |
1094 | 974 | ||
1095 | add ebx, new_app_base |
975 | add ebx, new_app_base |
1096 | stdcall get_service, ebx |
976 | stdcall get_service, ebx |
1097 | mov [esp+36], eax |
977 | mov [esp+36], eax |
1098 | ret |
978 | ret |
1099 | @@: |
979 | @@: |
1100 | cmp eax, 17 |
980 | cmp eax, 17 |
1101 | ja @f |
981 | ja @f |
1102 | stdcall srv_handlerEx, ebx |
982 | stdcall srv_handlerEx, ebx |
1103 | mov [esp+36], eax |
983 | mov [esp+36], eax |
1104 | ret |
984 | ret |
1105 | @@: |
985 | @@: |
1106 | cmp eax, 18 |
986 | cmp eax, 18 |
1107 | ja @f |
987 | ja @f |
1108 | mov ecx, [CURRENT_TASK] |
988 | mov ecx, [CURRENT_TASK] |
1109 | shl ecx, 8 |
989 | shl ecx, 8 |
1110 | mov eax, [ecx+PROC_BASE+APPDATA.sse_handler] |
990 | mov eax, [ecx+PROC_BASE+APPDATA.sse_handler] |
1111 | mov [ecx+PROC_BASE+APPDATA.sse_handler], ebx |
991 | mov [ecx+PROC_BASE+APPDATA.sse_handler], ebx |
1112 | mov [esp+36], eax |
992 | mov [esp+36], eax |
1113 | ret |
993 | ret |
1114 | 994 | ||
1115 | @@: |
995 | @@: |
1116 | .fail: |
996 | .fail: |
1117 | xor eax, eax |
997 | xor eax, eax |
1118 | mov [esp+36], eax |
998 | mov [esp+36], eax |
1119 | ret |
999 | ret |
1120 | 1000 | ||
1121 | 1001 | ||
1122 | align 4 |
1002 | align 4 |
1123 | proc strncmp stdcall, str1:dword, str2:dword, count:dword |
1003 | proc strncmp stdcall, str1:dword, str2:dword, count:dword |
1124 | 1004 | ||
1125 | mov ecx,[count] |
1005 | mov ecx,[count] |
1126 | jecxz .end |
1006 | jecxz .end |
1127 | 1007 | ||
1128 | mov ebx,ecx |
1008 | mov ebx,ecx |
1129 | 1009 | ||
1130 | mov edi,[str1] |
1010 | mov edi,[str1] |
1131 | mov esi,edi |
1011 | mov esi,edi |
1132 | xor eax,eax |
1012 | xor eax,eax |
1133 | repne scasb |
1013 | repne scasb |
1134 | neg ecx ; cx = count - strlen |
1014 | neg ecx ; cx = count - strlen |
1135 | add ecx,ebx ; strlen + count - strlen |
1015 | add ecx,ebx ; strlen + count - strlen |
1136 | 1016 | ||
1137 | .okay: |
1017 | .okay: |
1138 | mov edi,esi |
1018 | mov edi,esi |
1139 | mov esi,[str2] |
1019 | mov esi,[str2] |
1140 | repe cmpsb |
1020 | repe cmpsb |
1141 | mov al,[esi-1] |
1021 | mov al,[esi-1] |
1142 | xor ecx,ecx |
1022 | xor ecx,ecx |
1143 | 1023 | ||
1144 | cmp al,[edi-1] |
1024 | cmp al,[edi-1] |
1145 | ja .str2_big |
1025 | ja .str2_big |
1146 | je .end |
1026 | je .end |
1147 | 1027 | ||
1148 | .str1_big: |
1028 | .str1_big: |
1149 | sub ecx,2 |
1029 | sub ecx,2 |
1150 | 1030 | ||
1151 | .str2_big: |
1031 | .str2_big: |
1152 | not ecx |
1032 | not ecx |
1153 | .end: |
1033 | .end: |
1154 | mov eax,ecx |
1034 | mov eax,ecx |
1155 | ret |
1035 | ret |
1156 | endp |
1036 | endp |
1157 | 1037 | ||
1158 | align 4 |
1038 | align 4 |
1159 | proc fpu_save |
1039 | proc fpu_save |
1160 | clts |
1040 | clts |
1161 | mov ebx, [fpu_owner] |
1041 | mov ebx, [fpu_owner] |
1162 | shl ebx, 8 |
1042 | shl ebx, 8 |
1163 | mov eax, [ebx+PROC_BASE+0x10] |
1043 | mov eax, [ebx+PROC_BASE+0x10] |
1164 | mov ebx, [CURRENT_TASK] |
1044 | mov ebx, [CURRENT_TASK] |
1165 | mov [fpu_owner], ebx |
1045 | mov [fpu_owner], ebx |
1166 | 1046 | ||
1167 | bt [cpu_caps], CAPS_FXSR |
1047 | bt [cpu_caps], CAPS_FXSR |
1168 | jnc .no_SSE |
1048 | jnc .no_SSE |
1169 | 1049 | ||
1170 | fxsave [eax] |
1050 | fxsave [eax] |
1171 | ret |
1051 | ret |
1172 | .no_SSE: |
1052 | .no_SSE: |
1173 | fnsave [eax] |
1053 | fnsave [eax] |
1174 | ret |
1054 | ret |
1175 | endp |
1055 | endp |
1176 | 1056 | ||
1177 | align 4 |
1057 | align 4 |
1178 | proc fpu_restore |
1058 | proc fpu_restore |
1179 | mov ebx, [CURRENT_TASK] |
1059 | mov ebx, [CURRENT_TASK] |
1180 | shl ebx, 8 |
1060 | shl ebx, 8 |
1181 | mov eax, [ebx+PROC_BASE+0x10] |
1061 | mov eax, [ebx+PROC_BASE+0x10] |
1182 | bt [cpu_caps], CAPS_FXSR |
1062 | bt [cpu_caps], CAPS_FXSR |
1183 | jnc .no_SSE |
1063 | jnc .no_SSE |
1184 | 1064 | ||
1185 | fxrstor [eax] |
1065 | fxrstor [eax] |
1186 | ret |
1066 | ret |
1187 | .no_SSE: |
1067 | .no_SSE: |
1188 | frstor [eax] |
1068 | frstor [eax] |
1189 | ret |
1069 | ret |
1190 | endp |
1070 | endp |
1191 | 1071 | ||
1192 | align 4 |
1072 | align 4 |
1193 | proc test_cpu |
1073 | proc test_cpu |
1194 | locals |
1074 | locals |
1195 | cpu_type dd ? |
1075 | cpu_type dd ? |
1196 | cpu_id dd ? |
1076 | cpu_id dd ? |
1197 | cpu_Intel dd ? |
1077 | cpu_Intel dd ? |
1198 | cpu_AMD dd ? |
1078 | cpu_AMD dd ? |
1199 | endl |
1079 | endl |
1200 | 1080 | ||
1201 | mov [cpu_type], 0 |
1081 | mov [cpu_type], 0 |
1202 | 1082 | ||
1203 | pushfd |
1083 | pushfd |
1204 | pop eax |
1084 | pop eax |
1205 | mov ecx, eax |
1085 | mov ecx, eax |
1206 | xor eax, 0x40000 |
1086 | xor eax, 0x40000 |
1207 | push eax |
1087 | push eax |
1208 | popfd |
1088 | popfd |
1209 | pushfd |
1089 | pushfd |
1210 | pop eax |
1090 | pop eax |
1211 | xor eax, ecx |
1091 | xor eax, ecx |
1212 | mov [cpu_type], CPU_386 |
1092 | mov [cpu_type], CPU_386 |
1213 | jz .end_cpu |
1093 | jz .end_cpu |
1214 | push ecx |
1094 | push ecx |
1215 | popfd |
1095 | popfd |
1216 | 1096 | ||
1217 | mov [cpu_type], CPU_486 |
1097 | mov [cpu_type], CPU_486 |
1218 | mov eax, ecx |
1098 | mov eax, ecx |
1219 | xor eax, 0x200000 |
1099 | xor eax, 0x200000 |
1220 | push eax |
1100 | push eax |
1221 | popfd |
1101 | popfd |
1222 | pushfd |
1102 | pushfd |
1223 | pop eax |
1103 | pop eax |
1224 | xor eax, ecx |
1104 | xor eax, ecx |
1225 | je .end_cpu |
1105 | je .end_cpu |
1226 | mov [cpu_id], 1 |
1106 | mov [cpu_id], 1 |
1227 | 1107 | ||
1228 | xor eax, eax |
1108 | xor eax, eax |
1229 | cpuid |
1109 | cpuid |
1230 | mov [cpu_vendor], ebx |
1110 | mov [cpu_vendor], ebx |
1231 | mov [cpu_vendor+4], edx |
1111 | mov [cpu_vendor+4], edx |
1232 | mov [cpu_vendor+8], ecx |
1112 | mov [cpu_vendor+8], ecx |
1233 | cmp ebx, dword [intel_str] |
1113 | cmp ebx, dword [intel_str] |
1234 | jne .check_AMD |
1114 | jne .check_AMD |
1235 | cmp edx, dword [intel_str+4] |
1115 | cmp edx, dword [intel_str+4] |
1236 | jne .check_AMD |
1116 | jne .check_AMD |
1237 | cmp ecx, dword [intel_str+8] |
1117 | cmp ecx, dword [intel_str+8] |
1238 | jne .check_AMD |
1118 | jne .check_AMD |
1239 | mov [cpu_Intel], 1 |
1119 | mov [cpu_Intel], 1 |
1240 | cmp eax, 1 |
1120 | cmp eax, 1 |
1241 | jl .end_cpuid |
1121 | jl .end_cpuid |
1242 | mov eax, 1 |
1122 | mov eax, 1 |
1243 | cpuid |
1123 | cpuid |
1244 | mov [cpu_sign], eax |
1124 | mov [cpu_sign], eax |
1245 | mov [cpu_info], ebx |
1125 | mov [cpu_info], ebx |
1246 | mov [cpu_caps], edx |
1126 | mov [cpu_caps], edx |
1247 | mov [cpu_caps+4],ecx |
1127 | mov [cpu_caps+4],ecx |
1248 | 1128 | ||
1249 | shr eax, 8 |
1129 | shr eax, 8 |
1250 | and eax, 0x0f |
1130 | and eax, 0x0f |
1251 | mov [cpu_type], eax |
1131 | mov [cpu_type], eax |
1252 | ret |
1132 | ret |
1253 | 1133 | ||
1254 | .end_cpuid: |
1134 | .end_cpuid: |
1255 | mov eax, [cpu_type] |
1135 | mov eax, [cpu_type] |
1256 | ret |
1136 | ret |
1257 | 1137 | ||
1258 | .check_AMD: |
1138 | .check_AMD: |
1259 | cmp ebx, dword [AMD_str] |
1139 | cmp ebx, dword [AMD_str] |
1260 | jne .end_cpu |
1140 | jne .end_cpu |
1261 | cmp edx, dword [AMD_str+4] |
1141 | cmp edx, dword [AMD_str+4] |
1262 | jne .end_cpu |
1142 | jne .end_cpu |
1263 | cmp ecx, dword [AMD_str+8] |
1143 | cmp ecx, dword [AMD_str+8] |
1264 | jne .end_cpu |
1144 | jne .end_cpu |
1265 | mov [cpu_AMD], 1 |
1145 | mov [cpu_AMD], 1 |
1266 | cmp eax, 1 |
1146 | cmp eax, 1 |
1267 | jl .end_cpuid |
1147 | jl .end_cpuid |
1268 | mov eax, 1 |
1148 | mov eax, 1 |
1269 | cpuid |
1149 | cpuid |
1270 | mov [cpu_sign], eax |
1150 | mov [cpu_sign], eax |
1271 | mov [cpu_info], ebx |
1151 | mov [cpu_info], ebx |
1272 | mov [cpu_caps], edx |
1152 | mov [cpu_caps], edx |
1273 | mov [cpu_caps+4],ecx |
1153 | mov [cpu_caps+4],ecx |
1274 | shr eax, 8 |
1154 | shr eax, 8 |
1275 | and eax, 0x0f |
1155 | and eax, 0x0f |
1276 | mov [cpu_type], eax |
1156 | mov [cpu_type], eax |
1277 | .end_cpu: |
1157 | .end_cpu: |
1278 | mov eax, [cpu_type] |
1158 | mov eax, [cpu_type] |
1279 | ret |
1159 | ret |
1280 | endp |
1160 | endp |
1281 | 1161 | ||
1282 | MEM_WB equ 6 ;write-back memory |
1162 | MEM_WB equ 6 ;write-back memory |
1283 | MEM_WC equ 1 ;write combined memory |
1163 | MEM_WC equ 1 ;write combined memory |
1284 | MEM_UC equ 0 ;uncached memory |
1164 | MEM_UC equ 0 ;uncached memory |
1285 | 1165 | ||
1286 | align 4 |
1166 | align 4 |
1287 | proc init_mtrr |
1167 | proc init_mtrr |
1288 | 1168 | ||
1289 | cmp [0x2f0000+0x901c],byte 2 |
1169 | cmp [0x2f0000+0x901c],byte 2 |
1290 | je .exit |
1170 | je .exit |
1291 | 1171 | ||
1292 | mov eax, cr0 |
1172 | mov eax, cr0 |
1293 | or eax, 0x60000000 ;disable caching |
1173 | or eax, 0x60000000 ;disable caching |
1294 | mov cr0, eax |
1174 | mov cr0, eax |
1295 | wbinvd ;invalidate cache |
1175 | wbinvd ;invalidate cache |
1296 | 1176 | ||
1297 | mov ecx, 0x2FF |
1177 | mov ecx, 0x2FF |
1298 | rdmsr ; |
1178 | rdmsr ; |
1299 | push eax |
1179 | push eax |
1300 | 1180 | ||
1301 | xor edx, edx |
1181 | xor edx, edx |
1302 | xor eax, eax |
1182 | xor eax, eax |
1303 | mov ecx, 0x2FF |
1183 | mov ecx, 0x2FF |
1304 | wrmsr ;disable all MTRR |
1184 | wrmsr ;disable all MTRR |
1305 | 1185 | ||
1306 | stdcall set_mtrr, dword 0,dword 0,[MEM_AMOUNT],MEM_WB |
1186 | stdcall set_mtrr, dword 0,dword 0,[MEM_AMOUNT],MEM_WB |
1307 | stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC |
1187 | stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC |
1308 | xor edx, edx |
1188 | xor edx, edx |
1309 | xor eax, eax |
1189 | xor eax, eax |
1310 | mov ecx, 0x204 |
1190 | mov ecx, 0x204 |
1311 | mov ebx, 6 |
1191 | mov ebx, 6 |
1312 | @@: |
1192 | @@: |
1313 | wrmsr ;disable unused MTRR |
1193 | wrmsr ;disable unused MTRR |
1314 | inc ecx |
1194 | inc ecx |
1315 | wrmsr |
1195 | wrmsr |
1316 | inc ecx |
1196 | inc ecx |
1317 | dec ebx |
1197 | dec ebx |
1318 | jnz @b |
1198 | jnz @b |
1319 | 1199 | ||
1320 | wbinvd ;again invalidate |
1200 | wbinvd ;again invalidate |
1321 | 1201 | ||
1322 | pop eax |
1202 | pop eax |
1323 | or eax, 0x800 ;set default memtype to UC |
1203 | or eax, 0x800 ;set default memtype to UC |
1324 | and al, 0xF0 |
1204 | and al, 0xF0 |
1325 | mov ecx, 0x2FF |
1205 | mov ecx, 0x2FF |
1326 | wrmsr ;and enable MTRR |
1206 | wrmsr ;and enable MTRR |
1327 | 1207 | ||
1328 | mov eax, cr0 |
1208 | mov eax, cr0 |
1329 | and eax, not 0x60000000 |
1209 | and eax, not 0x60000000 |
1330 | mov cr0, eax ; enable caching |
1210 | mov cr0, eax ; enable caching |
1331 | .exit: |
1211 | .exit: |
1332 | ret |
1212 | ret |
1333 | endp |
1213 | endp |
1334 | 1214 | ||
1335 | align 4 |
1215 | align 4 |
1336 | proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword |
1216 | proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword |
1337 | 1217 | ||
1338 | xor edx, edx |
1218 | xor edx, edx |
1339 | mov eax, [base] |
1219 | mov eax, [base] |
1340 | or eax, [mem_type] |
1220 | or eax, [mem_type] |
1341 | mov ecx, [reg] |
1221 | mov ecx, [reg] |
1342 | lea ecx, [0x200+ecx*2] |
1222 | lea ecx, [0x200+ecx*2] |
1343 | wrmsr |
1223 | wrmsr |
1344 | 1224 | ||
1345 | mov ebx, [size] |
1225 | mov ebx, [size] |
1346 | dec ebx |
1226 | dec ebx |
1347 | mov eax, 0xFFFFFFFF |
1227 | mov eax, 0xFFFFFFFF |
1348 | mov edx, 0x0000000F |
1228 | mov edx, 0x0000000F |
1349 | sub eax, ebx |
1229 | sub eax, ebx |
1350 | sbb edx, 0 |
1230 | sbb edx, 0 |
1351 | or eax, 0x800 |
1231 | or eax, 0x800 |
1352 | inc ecx |
1232 | inc ecx |
1353 | wrmsr |
1233 | wrmsr |
1354 | ret |
1234 | ret |
1355 | endp |
1235 | endp |
1356 | 1236 | ||
1357 | - | ||
1358 | iglobal |
1237 | iglobal |
1359 | align 4 |
1238 | align 4 |
1360 | intel_str db "GenuineIntel",0 |
1239 | intel_str db "GenuineIntel",0 |
1361 | AMD_str db "AuthenticAMD",0 |
1240 | AMD_str db "AuthenticAMD",0 |
1362 | endg |
1241 | endg |
1363 | 1242 | ||
1364 | uglobal |
1243 | uglobal |
1365 | align 16 |
1244 | align 16 |
1366 | irq_tab rd 16 |
1245 | irq_tab rd 16 |
1367 | 1246 | ||
1368 | 1247 | ||
1369 | MEM_FreeSpace rd 1 |
1248 | MEM_FreeSpace rd 1 |
1370 | 1249 | ||
1371 | ipc_tmp rd 1 |
1250 | ipc_tmp rd 1 |
1372 | ipc_pdir rd 1 |
1251 | ipc_pdir rd 1 |
1373 | ipc_ptab rd 1 |
1252 | ipc_ptab rd 1 |
1374 | 1253 | ||
1375 | proc_mem_map rd 1 |
1254 | proc_mem_map rd 1 |
1376 | proc_mem_pdir rd 1 |
1255 | proc_mem_pdir rd 1 |
1377 | proc_mem_tab rd 1 |
1256 | proc_mem_tab rd 1 |
1378 | 1257 | ||
1379 | tmp_task_pdir rd 1 |
1258 | tmp_task_pdir rd 1 |
1380 | tmp_task_ptab rd 1 |
1259 | tmp_task_ptab rd 1 |
1381 | tmp_task_data rd 1 |
1260 | tmp_task_data rd 1 |
1382 | 1261 | ||
1383 | current_pdir rd 1 |
1262 | current_pdir rd 1 |
1384 | 1263 | ||
1385 | fpu_data rd 1 |
1264 | fpu_data rd 1 |
1386 | fdd_buff rd 1 |
1265 | fdd_buff rd 1 |
1387 | 1266 | ||
1388 | ;;CPUID information |
1267 | ;;CPUID information |
1389 | 1268 | ||
1390 | cpu_vendor rd 3 |
1269 | cpu_vendor rd 3 |
1391 | cpu_sign rd 1 |
1270 | cpu_sign rd 1 |
1392 | cpu_info rd 1 |
1271 | cpu_info rd 1 |
1393 | 1272 | ||
1394 | endg |
1273 | endg |
1395 | 1274 | ||
1396 | uglobal |
1275 | uglobal |
1397 | align 16 |
1276 | align 16 |
1398 | dll_tab rb 32*32 |
1277 | dll_tab rb 32*32 |
1399 | srv_tab rb 32*32 |
1278 | srv_tab rb 32*32 |
1400 | dll_map rd 1 |
1279 | dll_map rd 1 |
1401 | srv_map rd 1 |
1280 | srv_map rd 1 |
1402 | 1281 | ||
1403 | mem_used_list rd 1 |
1282 | mem_used_list rd 1 |
1404 | mem_block_list rd 64 |
1283 | mem_block_list rd 64 |
1405 | mem_block_map rb 512 |
1284 | mem_block_map rb 512 |
1406 | mem_block_arr rd 1 |
1285 | mem_block_arr rd 1 |
1407 | mem_block_start rd 1 |
1286 | mem_block_start rd 1 |
1408 | mem_block_end rd 1 |
1287 | mem_block_end rd 1 |
1409 | mem_block_mask rd 2 |
1288 | mem_block_mask rd 2 |
1410 | 1289 | heap_size rd 1 |
|
- | 1290 | heap_free rd 1 |
|
- | 1291 | heap_blocks rd 1 |
|
- | 1292 | free_blocks rd 1 |
|
- | 1293 | ||
1411 | page_start rd 1 |
1294 | page_start rd 1 |
1412 | page_end rd 1 |
1295 | page_end rd 1 |
1413 | sys_page_map rd 1 |
1296 | sys_page_map rd 1 |
1414 | app_load rd 1 |
1297 | ; app_load rd 1 |
1415 | endg |
1298 | endg |
1416 | 1299 | ||
1417 | 1300 | ||
1418 | ; push eax |
1301 | ; push eax |
1419 | ; push edx |
1302 | ; push edx |
1420 | ; mov edx, 0x400 ;bocsh |
1303 | ; mov edx, 0x400 ;bocsh |
1421 | ; mov al,0xff ;bocsh |
1304 | ; mov al,0xff ;bocsh |
1422 | ; out dx, al ;bocsh |
1305 | ; out dx, al ;bocsh |
1423 | ; nop ;bocsh fix |
1306 | ; pop edx |
1424 | ; pop edx |
- | |
1425 | ; pop eax0>> |
1307 | ; pop eax0>> |