Rev 448 | Rev 490 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 448 | Rev 465 | ||
---|---|---|---|
1 | $Revision: 448 $ |
1 | $Revision: 465 $ |
2 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
3 | ;; ;; |
3 | ;; ;; |
4 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
4 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
5 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; Distributed under terms of the GNU General Public License ;; |
6 | ;; ;; |
6 | ;; ;; |
7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
8 | - | ||
9 | tmp_page_tab equ HEAP_BASE |
- | |
10 | - | ||
11 | align 4 |
- | |
12 | proc mem_test |
- | |
13 | - | ||
14 | mov eax, cr0 |
- | |
15 | and eax, not (CR0_CD+CR0_NW) |
- | |
16 | or eax, CR0_CD ;disable caching |
- | |
17 | mov cr0, eax |
- | |
18 | wbinvd ;invalidate cache |
- | |
19 | - | ||
20 | xor edi, edi |
- | |
21 | mov ebx, 'TEST' |
- | |
22 | @@: |
- | |
23 | add edi, 0x400000 |
- | |
24 | xchg ebx, dword [edi] |
- | |
25 | cmp dword [edi], 'TEST' |
- | |
26 | xchg ebx, dword [edi] |
- | |
27 | je @b |
- | |
28 | mov [MEM_AMOUNT], edi |
- | |
29 | - | ||
30 | and eax, not (CR0_CD+CR0_NW) ;enable caching |
- | |
31 | mov cr0, eax |
- | |
32 | mov eax, edi |
- | |
33 | mov [LFBSize], 0x00800000 |
- | |
34 | ret |
- | |
35 | endp |
- | |
36 | - | ||
37 | align 4 |
- | |
38 | proc init_mem |
- | |
39 | - | ||
40 | mov eax, [MEM_AMOUNT] |
- | |
41 | - | ||
42 | mov [pg_data.mem_amount], eax |
- | |
43 | mov [pg_data.kernel_max], eax |
- | |
44 | - | ||
45 | shr eax, 12 |
- | |
46 | mov edx, eax |
- | |
47 | mov [pg_data.pages_count], eax |
- | |
48 | mov [pg_data.kernel_pages], eax |
- | |
49 | - | ||
50 | shr eax, 3 |
- | |
51 | mov [pg_data.pagemap_size], eax |
- | |
52 | - | ||
53 | shr edx, 10 |
- | |
54 | cmp edx, 3 |
- | |
55 | ja @f |
- | |
56 | inc edx ;at least 4Mb for kernel heap |
- | |
57 | @@: |
- | |
58 | mov [pg_data.kernel_tables], edx |
- | |
59 | - | ||
60 | xor eax, eax |
- | |
61 | mov edi, sys_pgdir |
- | |
62 | mov ecx, 2048 |
- | |
63 | cld |
- | |
64 | rep stosd |
- | |
65 | - | ||
66 | mov edx, sys_pgdir |
- | |
67 | bt [cpu_caps], CAPS_PSE |
- | |
68 | jnc .no_PSE |
- | |
69 | - | ||
70 | mov ebx, cr4 |
- | |
71 | or ebx, CR4_PSE |
- | |
72 | mov eax, PG_LARGE+PG_SW |
- | |
73 | bt [cpu_caps], CAPS_PGE |
- | |
74 | jnc @F |
- | |
75 | or eax, PG_GLOBAL |
- | |
76 | or ebx, CR4_PGE |
- | |
77 | @@: |
- | |
78 | mov cr4, ebx |
- | |
79 | sub [pg_data.kernel_tables], 2 |
- | |
80 | - | ||
81 | mov [edx], eax |
- | |
82 | add eax, 0x00400000 |
- | |
83 | mov [edx+4], eax |
- | |
84 | add edx, 8 |
- | |
85 | - | ||
86 | mov eax, 0x800000+PG_SW |
- | |
87 | mov ecx, (HEAP_BASE-0x800000)/4096 |
- | |
88 | jmp .map_low |
- | |
89 | .no_PSE: |
- | |
90 | mov eax, PG_SW |
- | |
91 | mov ecx, HEAP_BASE/4096 |
- | |
92 | .map_low: |
- | |
93 | mov edi, tmp_page_tab |
- | |
94 | @@: ; |
- | |
95 | stosd |
- | |
96 | add eax, 0x1000 |
- | |
97 | dec ecx |
- | |
98 | jnz @B |
- | |
99 | - | ||
100 | mov ecx, [pg_data.kernel_tables] |
- | |
101 | shl ecx, 10 |
- | |
102 | xor eax, eax |
- | |
103 | rep stosd |
- | |
104 | - | ||
105 | mov ecx, [pg_data.kernel_tables] |
- | |
106 | mov eax, tmp_page_tab+PG_SW |
- | |
107 | mov edi, edx |
- | |
108 | - | ||
109 | .map_kernel_tabs: |
- | |
110 | - | ||
111 | stosd |
- | |
112 | add eax, 0x1000 |
- | |
113 | dec ecx |
- | |
114 | jnz .map_kernel_tabs |
- | |
115 | - | ||
116 | mov dword [sys_pgdir+(page_tabs shr 20)], sys_pgdir+PG_SW |
- | |
117 | ret |
- | |
118 | endp |
- | |
119 | - | ||
120 | align 4 |
- | |
121 | proc init_page_map |
- | |
122 | - | ||
123 | mov edi, sys_pgmap |
- | |
124 | mov ecx, (HEAP_BASE/4096)/32 ;384/4 |
- | |
125 | mov ebx, ecx |
- | |
126 | xor eax,eax |
- | |
127 | cld |
- | |
128 | rep stosd |
- | |
129 | - | ||
130 | not eax |
- | |
131 | mov ecx, [pg_data.pagemap_size] |
- | |
132 | sub ecx, ebx |
- | |
133 | shr ecx, 2 |
- | |
134 | rep stosd |
- | |
135 | - | ||
136 | lea edi, [sys_pgmap+ebx*4] ;+384 |
- | |
137 | mov edx, [pg_data.pages_count] |
- | |
138 | mov ecx, [pg_data.kernel_tables] |
- | |
139 | add ecx, (HEAP_BASE/4096) and 31 |
- | |
140 | sub edx, HEAP_BASE/4096 |
- | |
141 | sub edx, ecx |
- | |
142 | mov [pg_data.pages_free], edx |
- | |
143 | - | ||
144 | xor eax, eax |
- | |
145 | mov ebx, ecx |
- | |
146 | shr ecx, 5 |
- | |
147 | rep stosd |
- | |
148 | - | ||
149 | not eax |
- | |
150 | mov ecx, ebx |
- | |
151 | and ecx, 31 |
- | |
152 | shl eax, cl |
- | |
153 | mov [page_start], edi; sys_pgmap+384 |
- | |
154 | stosd |
- | |
155 | - | ||
156 | mov ebx, sys_pgmap |
- | |
157 | add ebx, [pg_data.pagemap_size] |
- | |
158 | mov [page_end], ebx |
- | |
159 | - | ||
160 | mov [pg_data.pg_mutex], 0 |
- | |
161 | - | ||
162 | ret |
- | |
163 | endp |
- | |
164 | 8 | ||
165 | align 4 |
9 | align 4 |
166 | proc alloc_page |
10 | proc alloc_page |
167 | 11 | ||
168 | pushfd |
12 | pushfd |
169 | cli |
13 | cli |
170 | mov ebx, [page_start] |
14 | mov ebx, [page_start] |
171 | mov ecx, [page_end] |
15 | mov ecx, [page_end] |
172 | .l1: |
16 | .l1: |
173 | bsf eax,[ebx]; |
17 | bsf eax,[ebx]; |
174 | jnz .found |
18 | jnz .found |
175 | add ebx,4 |
19 | add ebx,4 |
176 | cmp ebx, ecx |
20 | cmp ebx, ecx |
177 | jb .l1 |
21 | jb .l1 |
178 | popfd |
22 | popfd |
179 | xor eax,eax |
23 | xor eax,eax |
180 | ret |
24 | ret |
181 | .found: |
25 | .found: |
182 | btr [ebx], eax |
26 | btr [ebx], eax |
183 | mov [page_start],ebx |
27 | mov [page_start],ebx |
184 | sub ebx, sys_pgmap |
28 | sub ebx, sys_pgmap |
185 | lea eax, [eax+ebx*8] |
29 | lea eax, [eax+ebx*8] |
186 | shl eax, 12 |
30 | shl eax, 12 |
187 | dec [pg_data.pages_free] |
31 | dec [pg_data.pages_free] |
188 | popfd |
32 | popfd |
189 | ret |
33 | ret |
190 | endp |
34 | endp |
191 | 35 | ||
192 | align 4 |
36 | align 4 |
193 | proc alloc_pages stdcall, count:dword |
37 | proc alloc_pages stdcall, count:dword |
194 | pushfd |
38 | pushfd |
195 | cli |
39 | cli |
196 | mov eax, [count] |
40 | mov eax, [count] |
197 | add eax, 7 |
41 | add eax, 7 |
198 | shr eax, 3 |
42 | shr eax, 3 |
199 | mov [count], eax |
43 | mov [count], eax |
200 | cmp eax, [pg_data.pages_free] |
44 | cmp eax, [pg_data.pages_free] |
201 | ja .fail |
45 | ja .fail |
202 | 46 | ||
203 | mov ecx, [page_start] |
47 | mov ecx, [page_start] |
204 | mov ebx, [page_end] |
48 | mov ebx, [page_end] |
205 | .find: |
49 | .find: |
206 | mov edx, [count] |
50 | mov edx, [count] |
207 | mov edi, ecx |
51 | mov edi, ecx |
208 | .match: |
52 | .match: |
209 | cmp byte [ecx], 0xFF |
53 | cmp byte [ecx], 0xFF |
210 | jne .next |
54 | jne .next |
211 | dec edx |
55 | dec edx |
212 | jz .ok |
56 | jz .ok |
213 | inc ecx |
57 | inc ecx |
214 | cmp ecx,ebx |
58 | cmp ecx,ebx |
215 | jb .match |
59 | jb .match |
216 | .fail: xor eax, eax |
60 | .fail: xor eax, eax |
217 | popfd |
61 | popfd |
218 | ret |
62 | ret |
219 | .next: |
63 | .next: |
220 | inc ecx |
64 | inc ecx |
221 | cmp ecx, ebx |
65 | cmp ecx, ebx |
222 | jb .find |
66 | jb .find |
223 | popfd |
67 | popfd |
224 | xor eax, eax |
68 | xor eax, eax |
225 | ret |
69 | ret |
226 | .ok: |
70 | .ok: |
227 | sub ecx, edi |
71 | sub ecx, edi |
228 | inc ecx |
72 | inc ecx |
229 | mov esi, edi |
73 | mov esi, edi |
230 | xor eax, eax |
74 | xor eax, eax |
231 | rep stosb |
75 | rep stosb |
232 | sub esi, sys_pgmap |
76 | sub esi, sys_pgmap |
233 | shl esi, 3+12 |
77 | shl esi, 3+12 |
234 | mov eax, esi |
78 | mov eax, esi |
235 | mov ebx, [count] |
79 | mov ebx, [count] |
236 | shl ebx, 3 |
80 | shl ebx, 3 |
237 | sub [pg_data.pages_free], ebx |
81 | sub [pg_data.pages_free], ebx |
238 | popfd |
82 | popfd |
239 | ret |
83 | ret |
240 | endp |
84 | endp |
241 | 85 | ||
242 | align 4 |
86 | align 4 |
243 | proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword |
87 | proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword |
244 | push ebx |
88 | push ebx |
245 | mov eax, [phis_addr] |
89 | mov eax, [phis_addr] |
246 | and eax, not 0xFFF |
90 | and eax, not 0xFFF |
247 | or eax, [flags] |
91 | or eax, [flags] |
248 | mov ebx, [lin_addr] |
92 | mov ebx, [lin_addr] |
249 | shr ebx, 12 |
93 | shr ebx, 12 |
250 | mov [page_tabs+ebx*4], eax |
94 | mov [page_tabs+ebx*4], eax |
251 | mov eax, [lin_addr] |
95 | mov eax, [lin_addr] |
252 | invlpg [eax] |
96 | invlpg [eax] |
253 | pop ebx |
97 | pop ebx |
254 | ret |
98 | ret |
255 | endp |
99 | endp |
256 | 100 | ||
257 | align 4 |
101 | align 4 |
258 | map_space: ;not implemented |
102 | map_space: ;not implemented |
259 | 103 | ||
260 | 104 | ||
261 | ret |
105 | ret |
262 | 106 | ||
263 | 107 | ||
264 | align 4 |
108 | align 4 |
265 | proc free_page |
109 | proc free_page |
266 | ;arg: eax page address |
110 | ;arg: eax page address |
267 | pushfd |
111 | pushfd |
268 | cli |
112 | cli |
269 | shr eax, 12 ;page index |
113 | shr eax, 12 ;page index |
270 | bts dword [sys_pgmap], eax ;that's all! |
114 | bts dword [sys_pgmap], eax ;that's all! |
271 | cmc |
115 | cmc |
272 | adc [pg_data.pages_free], 0 |
116 | adc [pg_data.pages_free], 0 |
273 | shr eax, 3 |
117 | shr eax, 3 |
274 | and eax, not 3 ;dword offset from page_map |
118 | and eax, not 3 ;dword offset from page_map |
275 | add eax, sys_pgmap |
119 | add eax, sys_pgmap |
276 | cmp [page_start], eax |
120 | cmp [page_start], eax |
277 | ja @f |
121 | ja @f |
278 | popfd |
122 | popfd |
279 | ret |
123 | ret |
280 | @@: |
124 | @@: |
281 | mov [page_start], eax |
125 | mov [page_start], eax |
282 | popfd |
126 | popfd |
283 | ret |
127 | ret |
284 | endp |
128 | endp |
285 | 129 | ||
286 | ; param |
130 | ; param |
287 | ; eax= page base + page flags |
131 | ; eax= page base + page flags |
288 | ; ebx= liear address |
132 | ; ebx= liear address |
289 | ; ecx= count |
133 | ; ecx= count |
290 | 134 | ||
291 | align 4 |
135 | align 4 |
292 | commit_pages: |
136 | commit_pages: |
293 | 137 | ||
294 | test ecx, ecx |
138 | test ecx, ecx |
295 | jz .fail |
139 | jz .fail |
296 | 140 | ||
297 | mov edi, ebx |
141 | mov edi, ebx |
298 | mov ebx, pg_data.pg_mutex |
142 | mov ebx, pg_data.pg_mutex |
299 | call wait_mutex ;ebx |
143 | call wait_mutex ;ebx |
300 | 144 | ||
301 | mov edx, 0x1000 |
145 | mov edx, 0x1000 |
302 | mov ebx, edi |
146 | mov ebx, edi |
303 | shr ebx, 12 |
147 | shr ebx, 12 |
304 | @@: |
148 | @@: |
305 | mov [page_tabs+ebx*4], eax |
149 | mov [page_tabs+ebx*4], eax |
306 | invlpg [edi] |
150 | invlpg [edi] |
307 | add edi, edx |
151 | add edi, edx |
308 | add eax, edx |
152 | add eax, edx |
309 | inc ebx |
153 | inc ebx |
310 | dec ecx |
154 | dec ecx |
311 | jnz @B |
155 | jnz @B |
312 | mov [pg_data.pg_mutex],ecx |
156 | mov [pg_data.pg_mutex],ecx |
313 | .fail: |
157 | .fail: |
314 | ret |
158 | ret |
315 | 159 | ||
316 | 160 | ||
317 | ; param |
161 | ; param |
318 | ; eax= base |
162 | ; eax= base |
319 | ; ecx= count |
163 | ; ecx= count |
320 | 164 | ||
321 | align 4 |
165 | align 4 |
322 | release_pages: |
166 | release_pages: |
323 | 167 | ||
324 | pushad |
168 | pushad |
325 | mov ebx, pg_data.pg_mutex |
169 | mov ebx, pg_data.pg_mutex |
326 | call wait_mutex ;ebx |
170 | call wait_mutex ;ebx |
327 | 171 | ||
328 | mov esi, eax |
172 | mov esi, eax |
329 | mov edi, eax |
173 | mov edi, eax |
330 | 174 | ||
331 | shr esi, 10 |
175 | shr esi, 10 |
332 | add esi, page_tabs |
176 | add esi, page_tabs |
333 | 177 | ||
334 | mov ebp, [pg_data.pages_free] |
178 | mov ebp, [pg_data.pages_free] |
335 | mov ebx, [page_start] |
179 | mov ebx, [page_start] |
336 | mov edx, sys_pgmap |
180 | mov edx, sys_pgmap |
337 | @@: |
181 | @@: |
338 | xor eax, eax |
182 | xor eax, eax |
339 | xchg eax, [esi] |
183 | xchg eax, [esi] |
340 | invlpg [edi] |
184 | invlpg [edi] |
341 | 185 | ||
342 | test eax, 1 |
186 | test eax, 1 |
343 | jz .next |
187 | jz .next |
344 | 188 | ||
345 | shr eax, 12 |
189 | shr eax, 12 |
346 | bts [edx], eax |
190 | bts [edx], eax |
347 | cmc |
191 | cmc |
348 | adc ebp, 0 |
192 | adc ebp, 0 |
349 | shr eax, 3 |
193 | shr eax, 3 |
350 | and eax, -4 |
194 | and eax, -4 |
351 | add eax, edx |
195 | add eax, edx |
352 | cmp eax, ebx |
196 | cmp eax, ebx |
353 | jae .next |
197 | jae .next |
354 | 198 | ||
355 | mov ebx, eax |
199 | mov ebx, eax |
356 | .next: |
200 | .next: |
357 | add edi, 0x1000 |
201 | add edi, 0x1000 |
358 | add esi, 4 |
202 | add esi, 4 |
359 | dec ecx |
203 | dec ecx |
360 | jnz @B |
204 | jnz @B |
361 | mov [pg_data.pages_free], ebp |
205 | mov [pg_data.pages_free], ebp |
362 | and [pg_data.pg_mutex],0 |
206 | and [pg_data.pg_mutex],0 |
363 | popad |
207 | popad |
364 | ret |
208 | ret |
365 | 209 | ||
366 | align 4 |
210 | align 4 |
367 | proc map_page_table stdcall, lin_addr:dword, phis_addr:dword |
211 | proc map_page_table stdcall, lin_addr:dword, phis_addr:dword |
368 | push ebx |
212 | push ebx |
369 | mov ebx, [lin_addr] |
213 | mov ebx, [lin_addr] |
370 | shr ebx, 22 |
214 | shr ebx, 22 |
371 | mov eax, [phis_addr] |
215 | mov eax, [phis_addr] |
372 | and eax, not 0xFFF |
216 | and eax, not 0xFFF |
373 | or eax, PG_UW ;+PG_NOCACHE |
217 | or eax, PG_UW ;+PG_NOCACHE |
374 | mov dword [master_tab+ebx*4], eax |
218 | mov dword [master_tab+ebx*4], eax |
375 | mov eax, [lin_addr] |
219 | mov eax, [lin_addr] |
376 | shr eax, 10 |
220 | shr eax, 10 |
377 | add eax, page_tabs |
221 | add eax, page_tabs |
378 | invlpg [eax] |
222 | invlpg [eax] |
379 | pop ebx |
223 | pop ebx |
380 | ret |
224 | ret |
381 | endp |
225 | endp |
382 | 226 | ||
383 | align 4 |
227 | align 4 |
384 | proc init_LFB |
228 | proc init_LFB |
385 | locals |
229 | locals |
386 | pg_count dd ? |
230 | pg_count dd ? |
387 | endl |
231 | endl |
388 | 232 | ||
389 | cmp dword [LFBAddress], -1 |
233 | cmp dword [LFBAddress], -1 |
390 | jne @f |
234 | jne @f |
391 | mov [BOOT_VAR+0x901c],byte 2 |
235 | mov [BOOT_VAR+0x901c],byte 2 |
392 | stdcall kernel_alloc, 0x280000 |
236 | stdcall kernel_alloc, 0x280000 |
393 | mov [LFBAddress], eax |
237 | mov [LFBAddress], eax |
394 | ret |
238 | ret |
395 | @@: |
239 | @@: |
396 | test [SCR_MODE],word 0100000000000000b |
240 | test [SCR_MODE],word 0100000000000000b |
397 | jnz @f |
241 | jnz @f |
398 | mov [BOOT_VAR+0x901c],byte 2 |
242 | mov [BOOT_VAR+0x901c],byte 2 |
399 | ret |
243 | ret |
400 | @@: |
244 | @@: |
401 | mov edx, LFB_BASE |
245 | mov edx, LFB_BASE |
402 | mov esi, [LFBAddress] |
246 | mov esi, [LFBAddress] |
403 | mov edi, [LFBSize] |
247 | mov edi, 0x00800000 |
404 | mov dword [exp_lfb+4], edx |
248 | mov dword [exp_lfb+4], edx |
405 | 249 | ||
406 | shr edi, 12 |
250 | shr edi, 12 |
407 | mov [pg_count], edi |
251 | mov [pg_count], edi |
408 | shr edi, 10 |
252 | shr edi, 10 |
409 | 253 | ||
410 | bt [cpu_caps], CAPS_PSE |
254 | bt [cpu_caps], CAPS_PSE |
411 | jnc .map_page_tables |
255 | jnc .map_page_tables |
412 | or esi, PG_LARGE+PG_UW |
256 | or esi, PG_LARGE+PG_UW |
413 | shr edx, 20 |
- | |
414 | mov ecx, edx |
257 | mov edx, sys_pgdir+(LFB_BASE shr 20) |
415 | @@: |
258 | @@: |
416 | mov [sys_pgdir+edx], esi |
259 | mov [edx], esi |
417 | add edx, 4 |
260 | add edx, 4 |
418 | add esi, 0x00400000 |
261 | add esi, 0x00400000 |
419 | dec edi |
262 | dec edi |
420 | jnz @B |
263 | jnz @B |
421 | 264 | ||
422 | bt [cpu_caps], CAPS_PGE |
265 | bt [cpu_caps], CAPS_PGE |
423 | jnc @F |
266 | jnc @F |
424 | or dword [sys_pgdir+ecx], PG_GLOBAL |
267 | or dword [sys_pgdir+(LFB_BASE shr 20)], PG_GLOBAL |
425 | @@: |
268 | @@: |
426 | mov dword [LFBAddress], LFB_BASE |
269 | mov dword [LFBAddress], LFB_BASE |
427 | mov eax, cr3 ;flush TLB |
270 | mov eax, cr3 ;flush TLB |
428 | mov cr3, eax |
271 | mov cr3, eax |
429 | ret |
272 | ret |
430 | 273 | ||
431 | .map_page_tables: |
274 | .map_page_tables: |
- | 275 | ||
432 | 276 | @@: |
|
433 | call alloc_page |
277 | call alloc_page |
434 | stdcall map_page_table, edx, eax |
278 | stdcall map_page_table, edx, eax |
435 | add edx, 0x00400000 |
279 | add edx, 0x00400000 |
436 | dec edi |
280 | dec edi |
437 | jnz .map_page_tables |
281 | jnz @B |
438 | 282 | ||
439 | mov eax, [LFBAddress] |
283 | mov eax, [LFBAddress] |
440 | mov edi, page_tabs + (LFB_BASE shr 10) |
284 | mov edi, page_tabs + (LFB_BASE shr 10) |
441 | or eax, PG_UW |
285 | or eax, PG_UW |
442 | mov ecx, [pg_count] |
286 | mov ecx, [pg_count] |
443 | cld |
287 | cld |
444 | @@: |
288 | @@: |
445 | stosd |
289 | stosd |
446 | add eax, 0x1000 |
290 | add eax, 0x1000 |
447 | dec ecx |
291 | dec ecx |
448 | jnz @B |
292 | jnz @B |
449 | 293 | ||
450 | mov dword [LFBAddress], LFB_BASE |
294 | mov dword [LFBAddress], LFB_BASE |
451 | mov eax, cr3 ;flush TLB |
295 | mov eax, cr3 ;flush TLB |
452 | mov cr3, eax |
296 | mov cr3, eax |
453 | 297 | ||
454 | ret |
298 | ret |
455 | endp |
299 | endp |
456 | 300 | ||
457 | align 4 |
301 | align 4 |
458 | proc new_mem_resize stdcall, new_size:dword |
302 | proc new_mem_resize stdcall, new_size:dword |
459 | 303 | ||
460 | mov ebx, pg_data.pg_mutex |
304 | mov ebx, pg_data.pg_mutex |
461 | call wait_mutex ;ebx |
305 | call wait_mutex ;ebx |
462 | 306 | ||
463 | mov edi, [new_size] |
307 | mov edi, [new_size] |
464 | add edi,4095 |
308 | add edi,4095 |
465 | and edi,not 4095 |
309 | and edi,not 4095 |
466 | mov [new_size], edi |
310 | mov [new_size], edi |
467 | 311 | ||
468 | mov edx,[CURRENT_TASK] |
- | |
469 | shl edx,8 |
312 | mov edx,[current_slot] |
470 | cmp [SLOT_BASE+APPDATA.heap_base+edx],0 |
313 | cmp [edx+APPDATA.heap_base],0 |
471 | jne .exit |
314 | jne .exit |
472 | 315 | ||
473 | mov esi, [SLOT_BASE+APPDATA.mem_size+edx] |
316 | mov esi, [edx+APPDATA.mem_size] |
474 | add esi, 4095 |
317 | add esi, 4095 |
475 | and esi, not 4095 |
318 | and esi, not 4095 |
476 | 319 | ||
477 | cmp edi, esi |
320 | cmp edi, esi |
478 | jae .expand |
321 | jae .expand |
479 | 322 | ||
480 | shr edi, 12 |
323 | shr edi, 12 |
481 | shr esi, 12 |
324 | shr esi, 12 |
482 | @@: |
325 | @@: |
483 | mov eax, [app_page_tabs+edi*4] |
326 | mov eax, [app_page_tabs+edi*4] |
484 | test eax, 1 |
327 | test eax, 1 |
485 | jz .next |
328 | jz .next |
486 | mov dword [app_page_tabs+edi*4], 2 |
329 | mov dword [app_page_tabs+edi*4], 2 |
487 | mov ebx, edi |
330 | mov ebx, edi |
488 | shl ebx, 12 |
331 | shl ebx, 12 |
489 | invlpg [ebx+std_application_base_address] |
332 | invlpg [ebx+std_application_base_address] |
490 | call free_page |
333 | call free_page |
491 | 334 | ||
492 | .next: add edi, 1 |
335 | .next: add edi, 1 |
493 | cmp edi, esi |
336 | cmp edi, esi |
494 | jb @B |
337 | jb @B |
495 | 338 | ||
496 | .update_size: |
339 | .update_size: |
497 | mov ebx, [new_size] |
340 | mov ebx, [new_size] |
498 | call update_mem_size |
341 | call update_mem_size |
499 | 342 | ||
500 | xor eax, eax |
343 | xor eax, eax |
501 | dec [pg_data.pg_mutex] |
344 | dec [pg_data.pg_mutex] |
502 | ret |
345 | ret |
503 | - | ||
504 | .expand: |
346 | .expand: |
505 | add edi, new_app_base |
- | |
506 | add esi, new_app_base |
- | |
507 | 347 | ||
508 | push esi |
348 | push esi |
509 | push edi |
349 | push edi |
510 | 350 | ||
511 | add edi, 0x3FFFFF |
351 | add edi, 0x3FFFFF |
512 | and edi, not(0x3FFFFF) |
352 | and edi, not(0x3FFFFF) |
513 | add esi, 0x3FFFFF |
353 | add esi, 0x3FFFFF |
514 | and esi, not(0x3FFFFF) |
354 | and esi, not(0x3FFFFF) |
515 | 355 | ||
516 | cmp esi, edi |
356 | cmp esi, edi |
517 | jae .grow |
357 | jae .grow |
518 | 358 | ||
519 | xchg esi, edi |
359 | xchg esi, edi |
520 | 360 | ||
521 | @@: |
361 | @@: |
522 | call alloc_page |
362 | call alloc_page |
523 | test eax, eax |
363 | test eax, eax |
524 | jz .exit |
364 | jz .exit |
525 | 365 | ||
526 | stdcall map_page_table, edi, eax |
366 | stdcall map_page_table, edi, eax |
527 | 367 | ||
528 | push edi |
368 | push edi |
529 | shr edi, 10 |
369 | shr edi, 10 |
530 | add edi, page_tabs |
370 | add edi, page_tabs |
531 | mov ecx, 1024 |
371 | mov ecx, 1024 |
532 | xor eax, eax |
372 | xor eax, eax |
533 | cld |
373 | cld |
534 | rep stosd |
374 | rep stosd |
535 | pop edi |
375 | pop edi |
536 | 376 | ||
537 | add edi, 0x00400000 |
377 | add edi, 0x00400000 |
538 | cmp edi, esi |
378 | cmp edi, esi |
539 | jb @B |
379 | jb @B |
540 | .grow: |
380 | .grow: |
541 | pop edi |
381 | pop edi |
542 | pop esi |
382 | pop esi |
543 | @@: |
383 | @@: |
544 | call alloc_page |
384 | call alloc_page |
545 | test eax, eax |
385 | test eax, eax |
546 | jz .exit |
386 | jz .exit |
547 | stdcall map_page,esi,eax,dword PG_UW |
387 | stdcall map_page,esi,eax,dword PG_UW |
548 | 388 | ||
549 | push edi |
389 | push edi |
550 | mov edi, esi |
390 | mov edi, esi |
551 | xor eax, eax |
391 | xor eax, eax |
552 | mov ecx, 1024 |
392 | mov ecx, 1024 |
553 | cld |
393 | cld |
554 | rep stosd |
394 | rep stosd |
555 | pop edi |
395 | pop edi |
556 | 396 | ||
557 | add esi, 0x1000 |
397 | add esi, 0x1000 |
558 | cmp esi, edi |
398 | cmp esi, edi |
559 | jb @B |
399 | jb @B |
560 | 400 | ||
561 | jmp .update_size |
401 | jmp .update_size |
562 | .exit: |
402 | .exit: |
563 | xor eax, eax |
403 | xor eax, eax |
564 | inc eax |
404 | inc eax |
565 | dec [pg_data.pg_mutex] |
405 | dec [pg_data.pg_mutex] |
566 | ret |
406 | ret |
567 | endp |
407 | endp |
568 | 408 | ||
569 | update_mem_size: |
409 | update_mem_size: |
570 | ; in: edx = slot shl 8 |
410 | ; in: edx = slot base |
571 | ; ebx = new memory size |
411 | ; ebx = new memory size |
572 | ; destroys eax,ecx,edx |
412 | ; destroys eax,ecx,edx |
573 | 413 | ||
574 | mov [SLOT_BASE+APPDATA.mem_size+edx],ebx |
414 | mov [APPDATA.mem_size+edx],ebx |
575 | ;search threads and update |
415 | ;search threads and update |
576 | ;application memory size infomation |
416 | ;application memory size infomation |
577 | mov ecx,[SLOT_BASE+APPDATA.dir_table+edx] |
417 | mov ecx,[APPDATA.dir_table+edx] |
578 | mov eax,2 |
418 | mov eax,2 |
579 | 419 | ||
580 | .search_threads: |
420 | .search_threads: |
581 | ;eax = current slot |
421 | ;eax = current slot |
582 | ;ebx = new memory size |
422 | ;ebx = new memory size |
583 | ;ecx = page directory |
423 | ;ecx = page directory |
584 | cmp eax,[TASK_COUNT] |
424 | cmp eax,[TASK_COUNT] |
585 | jg .search_threads_end |
425 | jg .search_threads_end |
586 | mov edx,eax |
426 | mov edx,eax |
587 | shl edx,5 |
427 | shl edx,5 |
588 | cmp word [CURRENT_TASK+edx+TASKDATA.state],9 ;if slot empty? |
428 | cmp word [CURRENT_TASK+edx+TASKDATA.state],9 ;if slot empty? |
589 | jz .search_threads_next |
429 | jz .search_threads_next |
590 | shl edx,3 |
430 | shl edx,3 |
591 | cmp [SLOT_BASE+edx+APPDATA.dir_table],ecx ;if it is our thread? |
431 | cmp [SLOT_BASE+edx+APPDATA.dir_table],ecx ;if it is our thread? |
592 | jnz .search_threads_next |
432 | jnz .search_threads_next |
593 | mov [SLOT_BASE+edx+APPDATA.mem_size],ebx ;update memory size |
433 | mov [SLOT_BASE+edx+APPDATA.mem_size],ebx ;update memory size |
594 | .search_threads_next: |
434 | .search_threads_next: |
595 | inc eax |
435 | inc eax |
596 | jmp .search_threads |
436 | jmp .search_threads |
597 | .search_threads_end: |
437 | .search_threads_end: |
598 | ret |
438 | ret |
599 | 439 | ||
600 | ; param |
440 | ; param |
601 | ; eax= linear address |
441 | ; eax= linear address |
602 | ; |
442 | ; |
603 | ; retval |
443 | ; retval |
604 | ; eax= phisical page address |
444 | ; eax= phisical page address |
605 | 445 | ||
606 | align 4 |
446 | align 4 |
607 | get_pg_addr: |
447 | get_pg_addr: |
608 | shr eax, 12 |
448 | shr eax, 12 |
609 | mov eax, [page_tabs+eax*4] |
449 | mov eax, [page_tabs+eax*4] |
610 | and eax, 0xFFFFF000 |
450 | and eax, 0xFFFFF000 |
611 | ret |
451 | ret |
- | 452 | ||
612 | 453 | ||
613 | align 4 |
454 | align 4 |
614 | proc page_fault_handler |
- | |
- | 455 | proc page_fault_handler |
|
- | 456 | ||
- | 457 | .err_code equ ebp+32 |
|
- | 458 | .err_addr equ ebp-4 |
|
615 | pushad |
459 | |
616 | 460 | pushad |
|
617 | mov ebp, esp |
461 | mov ebp, esp |
618 | mov eax, cr2 |
462 | mov eax, cr2 |
619 | push eax |
463 | push eax |
620 | push ds |
- | |
621 | push es |
- | |
622 | 464 | ||
623 | mov ax, 0x10 |
465 | mov ax, app_data |
624 | mov ds, ax |
466 | mov ds, ax |
625 | mov es, ax |
467 | mov es, ax |
626 | 468 | ||
627 | inc [pg_data.pages_faults] |
469 | inc [pg_data.pages_faults] |
- | 470 | ||
- | 471 | ; push eax |
|
- | 472 | ; push edx |
|
- | 473 | ; mov edx, 0x400 ;bochs |
|
628 | 474 | ; mov al,0xff ;bochs |
|
- | 475 | ; out dx, al ;bochs |
|
- | 476 | ; pop edx |
|
629 | mov ebx, [ebp-4] |
477 | ; pop eax |
630 | 478 | ||
631 | cmp ebx, 0x80000000 |
479 | mov ebx, [.err_addr] |
632 | jae .user_space |
480 | mov eax, [.err_code] |
633 | 481 | ||
634 | cmp ebx, app_page_tabs |
482 | cmp ebx, OS_BASE |
635 | jae .alloc |
- | |
636 | - | ||
637 | cmp ebx, page_tabs |
- | |
638 | jae .tab_space |
483 | jb .user_space ;ñòðà Ãèöà â ïà ìÿòè ïðèëîæåÃèÿ ; |
- | 484 | ||
- | 485 | cmp ebx, page_tabs |
|
- | 486 | jb .kernel_space ;ñòðà Ãèöà â ïà ìÿòè ÿäðà |
|
- | 487 | ||
- | 488 | cmp ebx, kernel_tabs |
|
- | 489 | jb .alloc;.app_tabs ;òà áëèöû ñòðà Ãèö ïðèëîæåÃèÿ ; |
|
- | 490 | ;ïðîñòî ñîçäà äèì îäÃó |
|
- | 491 | ||
- | 492 | cmp ebx, LFB_BASE |
|
- | 493 | jb .core_tabs ;òà áëèöû ñòðà Ãèö ÿäðà |
|
- | 494 | ;Îøèáêà |
|
639 | 495 | .lfb: |
|
- | 496 | ;îáëà ñòü LFB |
|
- | 497 | ;Îøèáêà |
|
- | 498 | jmp .fail |
|
- | 499 | ||
640 | cmp ebx, 0x7DC00000 |
500 | align 4 |
641 | jae .lfb_addr |
501 | .user_space: |
642 | 502 | test eax, PG_MAP |
|
643 | jmp .kernel_space |
503 | jnz .err_access ;Ñòðà Ãèöà ïðèñóòñòâóåò |
644 | 504 | ;Îøèáêà äîñòóïà ? |
|
645 | .user_space: |
505 | |
646 | shr ebx, 12 |
506 | shr ebx, 12 |
647 | mov ecx, ebx |
507 | mov ecx, ebx |
648 | shr ecx, 10 |
508 | shr ecx, 10 |
649 | mov edx, [master_tab+ecx*4] |
509 | mov edx, [master_tab+ecx*4] |
650 | test edx, 1 |
510 | test edx, PG_MAP |
651 | jz .fail |
511 | jz .fail ;òà áëèöà ñòðà Ãèö ÃÃ¥ ñîçäà Ãà |
- | 512 | ;ÃåâåðÃûé à äðåñ â ïðîãðà ììå |
|
652 | 513 | ||
653 | mov eax, [page_tabs+ebx*4] |
514 | mov eax, [page_tabs+ebx*4] |
654 | test eax, 2 |
515 | test eax, 2 |
655 | jz .fail |
516 | jz .fail ;à äðåñ ÃÃ¥ çà ðåçåðâèðîâà à äëÿ ; |
- | 517 | ;èñïîëüçîâà Ãèÿ. Îøèáêà |
|
656 | .alloc: |
518 | .alloc: |
657 | call alloc_page |
519 | call alloc_page |
658 | and eax, eax |
520 | and eax, eax |
659 | jz .exit |
521 | jz .fail |
660 | 522 | ||
661 | stdcall map_page,[ebp-4],eax,dword PG_UW |
523 | stdcall map_page,[ebp-4],eax,dword PG_UW |
662 | 524 | ||
663 | mov edi, [ebp-4] |
525 | mov edi, [ebp-4] |
664 | and edi, 0xFFFFF000 |
526 | and edi, 0xFFFFF000 |
665 | mov ecx, 1024 |
527 | mov ecx, 1024 |
666 | xor eax, eax |
528 | xor eax, eax |
667 | cld |
529 | cld |
668 | rep stosd |
530 | rep stosd |
669 | .exit: |
531 | .exit: |
670 | pop es |
- | |
671 | pop ds |
- | |
672 | mov esp, ebp |
532 | mov esp, ebp |
673 | popad |
533 | popad |
674 | add esp, 4 |
534 | add esp, 4 |
675 | iretd |
535 | iretd |
- | 536 | ||
- | 537 | .err_access: |
|
- | 538 | ;Ãèêîãäà ÃÃ¥ ïðîèñõîäèò |
|
- | 539 | jmp .fail |
|
- | 540 | ||
- | 541 | .kernel_space: |
|
- | 542 | test eax, PG_MAP |
|
- | 543 | jz .fail ;ñòðà Ãèöà ÃÃ¥ ïðèñóòñòâóåò |
|
- | 544 | ||
- | 545 | test eax, 4 ;U/S |
|
- | 546 | jnz .fail ;ïðèëîæåÃèå îáðà òèëîñü ê ïà ìÿòè |
|
- | 547 | ;ÿäðà |
|
- | 548 | test eax, 8 |
|
- | 549 | jnz .fail ;óñòà Ãîâëåà çà ðåçåðâèðîâà ÃÃûé áèò |
|
- | 550 | ;â òà áëèöà õ ñòðà Ãèö. äîáà âëåÃî â P4/Xeon |
|
- | 551 | ||
- | 552 | ;ïîïûòêà çà ïèñè â çà ùèù¸ÃÃóþ ñòðà Ãèöó ÿäðà |
|
- | 553 | ||
- | 554 | cmp ebx, tss._io_map_0 |
|
- | 555 | jb .fail |
|
- | 556 | ||
- | 557 | cmp ebx, tss._io_map_0+8192 |
|
- | 558 | jae .fail |
|
- | 559 | ||
- | 560 | ; io permission map |
|
- | 561 | ; copy-on-write protection |
|
- | 562 | ||
- | 563 | call alloc_page |
|
- | 564 | and eax, eax |
|
- | 565 | jz .fail |
|
- | 566 | ||
- | 567 | push eax |
|
- | 568 | stdcall map_page,[ebp-4],eax,dword PG_SW |
|
- | 569 | pop eax |
|
- | 570 | mov edi, [.err_addr] |
|
- | 571 | and edi, -4096 |
|
- | 572 | lea esi, [edi+(not tss._io_map_0)+1]; -tss._io_map_0 |
|
- | 573 | ||
- | 574 | mov ebx, esi |
|
- | 575 | shr ebx, 12 |
|
- | 576 | mov edx, [current_slot] |
|
- | 577 | or eax, PG_SW |
|
- | 578 | mov [edx+APPDATA.io_map+ebx*4], eax |
|
- | 579 | ||
- | 580 | add esi, [default_io_map] |
|
- | 581 | mov ecx, 4096/4 |
|
- | 582 | cld |
|
- | 583 | rep movsd |
|
- | 584 | jmp .exit |
|
- | 585 | ||
- | 586 | ||
- | 587 | ;ÃÃ¥ îáðà áà òûâà åì. Îøèáêà |
|
- | 588 | ||
- | 589 | .core_tabs: |
|
676 | .fail: |
590 | .fail: |
677 | pop es |
- | |
678 | pop ds |
- | |
679 | mov esp, ebp |
591 | mov esp, ebp |
680 | popad |
592 | popad |
681 | add esp, 4 |
593 | add esp, 4 |
- | 594 | ||
- | 595 | ; iretd |
|
682 | 596 | ||
683 | save_ring3_context ;debugger support |
597 | save_ring3_context ;debugger support |
684 | 598 | ||
685 | mov bl, 14 |
599 | mov bl, 14 |
686 | jmp exc_c |
600 | jmp exc_c |
687 | iretd |
601 | iretd |
688 | - | ||
689 | .kernel_space: |
- | |
690 | ; shr ebx, 12 |
- | |
691 | ; mov eax, [page_tabs+ebx*4] |
- | |
692 | ; shr ebx, 10 |
- | |
693 | ; mov eax, [master_tab+ebx*4] |
- | |
694 | jmp .exit |
- | |
695 | .old_addr: |
- | |
696 | ; shr ebx, 12 |
- | |
697 | ; mov eax, [page_tabs+ebx*4] |
- | |
698 | ; shr ebx, 10 |
- | |
699 | ; mov eax, [master_tab+ebx*4] |
- | |
700 | jmp .exit |
- | |
701 | .lfb_addr: |
- | |
702 | ; shr ebx, 22 |
- | |
703 | ; ;mov ecx, [sys_page_dir] |
- | |
704 | ; mov eax, [master_tab+ebx*4] |
- | |
705 | jmp .exit |
- | |
706 | .tab_space: |
- | |
707 | ; shr ebx, 12 |
- | |
708 | ; mov eax, [page_tabs+ebx*4] |
- | |
709 | ; shr ebx, 10 |
- | |
710 | ; ;mov ecx, [sys_page_dir] |
- | |
711 | ; mov eax, [master_tab+ebx*4] |
- | |
712 | jmp .exit |
- | |
713 | endp |
602 | endp |
714 | 603 | ||
715 | align 4 |
604 | align 4 |
716 | proc map_mem stdcall, lin_addr:dword,pdir:dword,\ |
605 | proc map_mem stdcall, lin_addr:dword,pdir:dword,\ |
717 | ofs:dword,buf_size:dword |
606 | ofs:dword,buf_size:dword |
718 | mov eax, [buf_size] |
607 | mov eax, [buf_size] |
719 | test eax, eax |
608 | test eax, eax |
720 | jz .exit |
609 | jz .exit |
721 | 610 | ||
722 | mov eax, [pdir] |
611 | mov eax, [pdir] |
723 | and eax, 0xFFFFF000 |
612 | and eax, 0xFFFFF000 |
724 | 613 | ||
725 | stdcall map_page,[ipc_pdir],eax,dword PG_UW |
614 | stdcall map_page,[ipc_pdir],eax,dword PG_UW |
726 | mov ebx, [ofs] |
615 | mov ebx, [ofs] |
727 | shr ebx, 22 |
616 | shr ebx, 22 |
728 | mov esi, [ipc_pdir] |
617 | mov esi, [ipc_pdir] |
729 | mov edi, [ipc_ptab] |
618 | mov edi, [ipc_ptab] |
730 | mov eax, [esi+ebx*4] |
619 | mov eax, [esi+ebx*4] |
731 | and eax, 0xFFFFF000 |
620 | and eax, 0xFFFFF000 |
732 | test eax, eax |
621 | test eax, eax |
733 | jz .exit |
622 | jz .exit |
734 | stdcall map_page,edi,eax,dword PG_UW |
623 | stdcall map_page,edi,eax,dword PG_UW |
735 | ; inc ebx |
624 | ; inc ebx |
736 | ; add edi, 0x1000 |
625 | ; add edi, 0x1000 |
737 | ; mov eax, [esi+ebx*4] |
626 | ; mov eax, [esi+ebx*4] |
738 | ; test eax, eax |
627 | ; test eax, eax |
739 | ; jz @f |
628 | ; jz @f |
740 | ; and eax, 0xFFFFF000 |
629 | ; and eax, 0xFFFFF000 |
741 | ; stdcall map_page, edi, eax |
630 | ; stdcall map_page, edi, eax |
742 | 631 | ||
743 | @@: mov edi, [lin_addr] |
632 | @@: mov edi, [lin_addr] |
744 | and edi, 0xFFFFF000 |
633 | and edi, 0xFFFFF000 |
745 | mov ecx, [buf_size] |
634 | mov ecx, [buf_size] |
746 | add ecx, 4095 |
635 | add ecx, 4095 |
747 | shr ecx, 12 |
636 | shr ecx, 12 |
748 | inc ecx |
637 | inc ecx |
749 | 638 | ||
750 | mov edx, [ofs] |
639 | mov edx, [ofs] |
751 | shr edx, 12 |
640 | shr edx, 12 |
752 | and edx, 0x3FF |
641 | and edx, 0x3FF |
753 | mov esi, [ipc_ptab] |
642 | mov esi, [ipc_ptab] |
754 | 643 | ||
755 | .map: mov eax, [esi+edx*4] |
644 | .map: mov eax, [esi+edx*4] |
756 | and eax, 0xFFFFF000 |
645 | and eax, 0xFFFFF000 |
757 | test eax, eax |
646 | test eax, eax |
758 | jz .exit |
647 | jz .exit |
759 | stdcall map_page,edi,eax,dword PG_UW |
648 | stdcall map_page,edi,eax,dword PG_UW |
760 | add edi, 0x1000 |
649 | add edi, 0x1000 |
761 | inc edx |
650 | inc edx |
762 | dec ecx |
651 | dec ecx |
763 | jnz .map |
652 | jnz .map |
764 | 653 | ||
765 | .exit: |
654 | .exit: |
766 | ret |
655 | ret |
767 | endp |
656 | endp |
768 | 657 | ||
769 | align 4 |
658 | align 4 |
770 | proc map_memEx stdcall, lin_addr:dword,pdir:dword,\ |
659 | proc map_memEx stdcall, lin_addr:dword,pdir:dword,\ |
771 | ofs:dword,buf_size:dword |
660 | ofs:dword,buf_size:dword |
772 | mov eax, [buf_size] |
661 | mov eax, [buf_size] |
773 | test eax, eax |
662 | test eax, eax |
774 | jz .exit |
663 | jz .exit |
775 | 664 | ||
776 | mov eax, [pdir] |
665 | mov eax, [pdir] |
777 | and eax, 0xFFFFF000 |
666 | and eax, 0xFFFFF000 |
778 | 667 | ||
779 | stdcall map_page,[proc_mem_pdir],eax,dword PG_UW |
668 | stdcall map_page,[proc_mem_pdir],eax,dword PG_UW |
780 | mov ebx, [ofs] |
669 | mov ebx, [ofs] |
781 | shr ebx, 22 |
670 | shr ebx, 22 |
782 | mov esi, [proc_mem_pdir] |
671 | mov esi, [proc_mem_pdir] |
783 | mov edi, [proc_mem_tab] |
672 | mov edi, [proc_mem_tab] |
784 | mov eax, [esi+ebx*4] |
673 | mov eax, [esi+ebx*4] |
785 | and eax, 0xFFFFF000 |
674 | and eax, 0xFFFFF000 |
786 | test eax, eax |
675 | test eax, eax |
787 | jz .exit |
676 | jz .exit |
788 | stdcall map_page,edi,eax,dword PG_UW |
677 | stdcall map_page,edi,eax,dword PG_UW |
789 | 678 | ||
790 | @@: mov edi, [lin_addr] |
679 | @@: mov edi, [lin_addr] |
791 | and edi, 0xFFFFF000 |
680 | and edi, 0xFFFFF000 |
792 | mov ecx, [buf_size] |
681 | mov ecx, [buf_size] |
793 | add ecx, 4095 |
682 | add ecx, 4095 |
794 | shr ecx, 12 |
683 | shr ecx, 12 |
795 | inc ecx |
684 | inc ecx |
796 | 685 | ||
797 | mov edx, [ofs] |
686 | mov edx, [ofs] |
798 | shr edx, 12 |
687 | shr edx, 12 |
799 | and edx, 0x3FF |
688 | and edx, 0x3FF |
800 | mov esi, [proc_mem_tab] |
689 | mov esi, [proc_mem_tab] |
801 | 690 | ||
802 | .map: mov eax, [esi+edx*4] |
691 | .map: mov eax, [esi+edx*4] |
803 | ; and eax, 0xFFFFF000 |
692 | ; and eax, 0xFFFFF000 |
804 | ; test eax, eax |
693 | ; test eax, eax |
805 | ; jz .exit |
694 | ; jz .exit |
806 | stdcall map_page,edi,eax,dword PG_UW |
695 | stdcall map_page,edi,eax,dword PG_UW |
807 | add edi, 0x1000 |
696 | add edi, 0x1000 |
808 | inc edx |
697 | inc edx |
809 | dec ecx |
698 | dec ecx |
810 | jnz .map |
699 | jnz .map |
811 | .exit: |
700 | .exit: |
812 | ret |
701 | ret |
813 | endp |
702 | endp |
814 | 703 | ||
815 | 704 | ||
816 | 705 | ||
817 | 706 | ||
818 | sys_IPC: |
707 | sys_IPC: |
819 | ;input: |
708 | ;input: |
820 | ; eax=1 - set ipc buffer area |
709 | ; eax=1 - set ipc buffer area |
821 | ; ebx=address of buffer |
710 | ; ebx=address of buffer |
822 | ; ecx=size of buffer |
711 | ; ecx=size of buffer |
823 | ; eax=2 - send message |
712 | ; eax=2 - send message |
824 | ; ebx=PID |
713 | ; ebx=PID |
825 | ; ecx=address of message |
714 | ; ecx=address of message |
826 | ; edx=size of message |
715 | ; edx=size of message |
827 | 716 | ||
828 | cmp eax,1 |
717 | cmp eax,1 |
829 | jne @f |
718 | jne @f |
830 | call set_ipc_buff |
719 | call set_ipc_buff |
831 | mov [esp+36], eax |
720 | mov [esp+36], eax |
832 | ret |
721 | ret |
833 | @@: |
722 | @@: |
834 | cmp eax, 2 |
723 | cmp eax, 2 |
835 | jne @f |
724 | jne @f |
836 | stdcall sys_ipc_send, ebx, ecx, edx |
725 | stdcall sys_ipc_send, ebx, ecx, edx |
837 | mov [esp+36], eax |
726 | mov [esp+36], eax |
838 | ret |
727 | ret |
839 | @@: |
728 | @@: |
840 | xor eax, eax |
729 | xor eax, eax |
841 | not eax |
730 | not eax |
842 | mov [esp+36], eax |
731 | mov [esp+36], eax |
843 | ret |
732 | ret |
844 | 733 | ||
845 | align 4 |
734 | align 4 |
846 | proc set_ipc_buff |
735 | proc set_ipc_buff |
847 | 736 | ||
848 | mov eax,[CURRENT_TASK] |
- | |
849 | shl eax,8 |
- | |
850 | add eax, SLOT_BASE |
737 | mov eax,[current_slot] |
851 | pushf |
738 | pushf |
852 | cli |
739 | cli |
853 | mov [eax+0xA0],ebx ;set fields in extended information area |
740 | mov [eax+APPDATA.ipc_start],ebx ;set fields in extended information area |
854 | mov [eax+0xA4],ecx |
- | |
855 | 741 | mov [eax+APPDATA.ipc_size],ecx |
|
856 | add ebx, new_app_base |
742 | |
857 | add ecx, ebx |
743 | add ecx, ebx |
858 | add ecx, 4095 |
744 | add ecx, 4095 |
859 | and ecx, not 4095 |
745 | and ecx, not 4095 |
860 | 746 | ||
861 | .touch: mov eax, [ebx] |
747 | .touch: mov eax, [ebx] |
862 | add ebx, 0x1000 |
748 | add ebx, 0x1000 |
863 | cmp ebx, ecx |
749 | cmp ebx, ecx |
864 | jna .touch |
750 | jna .touch |
865 | 751 | ||
866 | popf |
752 | popf |
867 | xor eax, eax |
753 | xor eax, eax |
868 | ret |
754 | ret |
869 | endp |
755 | endp |
870 | 756 | ||
871 | proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword |
757 | proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword |
872 | locals |
758 | locals |
873 | dst_slot dd ? |
759 | dst_slot dd ? |
874 | dst_offset dd ? |
760 | dst_offset dd ? |
875 | buf_size dd ? |
761 | buf_size dd ? |
876 | endl |
762 | endl |
877 | 763 | ||
878 | pushf |
764 | pushf |
879 | cli |
765 | cli |
880 | 766 | ||
881 | mov eax, [PID] |
767 | mov eax, [PID] |
882 | call pid_to_slot |
768 | call pid_to_slot |
883 | test eax,eax |
769 | test eax,eax |
884 | jz .no_pid |
770 | jz .no_pid |
885 | 771 | ||
886 | mov [dst_slot], eax |
772 | mov [dst_slot], eax |
887 | shl eax,8 |
773 | shl eax,8 |
888 | mov edi,[eax+SLOT_BASE+0xa0] ;is ipc area defined? |
774 | mov edi,[eax+SLOT_BASE+0xa0] ;is ipc area defined? |
889 | test edi,edi |
775 | test edi,edi |
890 | jz .no_ipc_area |
776 | jz .no_ipc_area |
891 | 777 | ||
892 | mov ebx, edi |
778 | mov ebx, edi |
893 | add edi, new_app_base |
779 | ; add edi, new_app_base |
894 | and ebx, 0xFFF |
780 | and ebx, 0xFFF |
895 | mov [dst_offset], ebx |
781 | mov [dst_offset], ebx |
896 | 782 | ||
897 | mov esi, [eax+SLOT_BASE+0xa4] |
783 | mov esi, [eax+SLOT_BASE+0xa4] |
898 | mov [buf_size], esi |
784 | mov [buf_size], esi |
899 | 785 | ||
900 | stdcall map_mem, [ipc_tmp], [SLOT_BASE+eax+0xB8],\ |
786 | stdcall map_mem, [ipc_tmp], [SLOT_BASE+eax+0xB8],\ |
901 | edi, esi |
787 | edi, esi |
902 | 788 | ||
903 | mov edi, [dst_offset] |
789 | mov edi, [dst_offset] |
904 | add edi, [ipc_tmp] |
790 | add edi, [ipc_tmp] |
905 | cmp dword [edi], 0 |
791 | cmp dword [edi], 0 |
906 | jnz .ipc_blocked ;if dword [buffer]<>0 - ipc blocked now |
792 | jnz .ipc_blocked ;if dword [buffer]<>0 - ipc blocked now |
907 | 793 | ||
908 | mov ebx, dword [edi+4] |
794 | mov ebx, dword [edi+4] |
909 | mov edx, ebx |
795 | mov edx, ebx |
910 | add ebx, 8 |
796 | add ebx, 8 |
911 | add ebx, [msg_size] |
797 | add ebx, [msg_size] |
912 | cmp ebx, [buf_size] |
798 | cmp ebx, [buf_size] |
913 | ja .buffer_overflow ;esi<0 - not enough memory in buffer |
799 | ja .buffer_overflow ;esi<0 - not enough memory in buffer |
914 | 800 | ||
915 | mov dword [edi+4], ebx |
801 | mov dword [edi+4], ebx |
916 | mov eax,[TASK_BASE] |
802 | mov eax,[TASK_BASE] |
917 | mov eax, [eax+0x04] ;eax - our PID |
803 | mov eax, [eax+0x04] ;eax - our PID |
918 | mov edi, [dst_offset] |
804 | mov edi, [dst_offset] |
919 | add edi, [ipc_tmp] |
805 | add edi, [ipc_tmp] |
920 | add edi, edx |
806 | add edi, edx |
921 | mov [edi], eax |
807 | mov [edi], eax |
922 | mov ecx, [msg_size] |
808 | mov ecx, [msg_size] |
923 | 809 | ||
924 | mov [edi+4], ecx |
810 | mov [edi+4], ecx |
925 | add edi, 8 |
811 | add edi, 8 |
926 | mov esi, [msg_addr] |
812 | mov esi, [msg_addr] |
927 | add esi, new_app_base |
813 | ; add esi, new_app_base |
928 | cld |
814 | cld |
929 | rep movsb |
815 | rep movsb |
930 | 816 | ||
931 | mov ebx, [ipc_tmp] |
817 | mov ebx, [ipc_tmp] |
932 | mov edx, ebx |
818 | mov edx, ebx |
933 | shr ebx, 12 |
819 | shr ebx, 12 |
934 | xor eax, eax |
820 | xor eax, eax |
935 | mov [page_tabs+ebx*4], eax |
821 | mov [page_tabs+ebx*4], eax |
936 | invlpg [edx] |
822 | invlpg [edx] |
937 | 823 | ||
938 | mov ebx, [ipc_pdir] |
824 | mov ebx, [ipc_pdir] |
939 | mov edx, ebx |
825 | mov edx, ebx |
940 | shr ebx, 12 |
826 | shr ebx, 12 |
941 | xor eax, eax |
827 | xor eax, eax |
942 | mov [page_tabs+ebx*4], eax |
828 | mov [page_tabs+ebx*4], eax |
943 | invlpg [edx] |
829 | invlpg [edx] |
944 | 830 | ||
945 | mov ebx, [ipc_ptab] |
831 | mov ebx, [ipc_ptab] |
946 | mov edx, ebx |
832 | mov edx, ebx |
947 | shr ebx, 12 |
833 | shr ebx, 12 |
948 | xor eax, eax |
834 | xor eax, eax |
949 | mov [page_tabs+ebx*4], eax |
835 | mov [page_tabs+ebx*4], eax |
950 | invlpg [edx] |
836 | invlpg [edx] |
951 | 837 | ||
952 | mov eax, [dst_slot] |
838 | mov eax, [dst_slot] |
953 | shl eax, 8 |
839 | shl eax, 8 |
954 | or [eax+SLOT_BASE+0xA8],dword 0x40 |
840 | or [eax+SLOT_BASE+0xA8],dword 0x40 |
955 | cmp dword [check_idle_semaphore],20 |
841 | cmp dword [check_idle_semaphore],20 |
956 | jge .ipc_no_cis |
842 | jge .ipc_no_cis |
957 | 843 | ||
958 | mov dword [check_idle_semaphore],5 |
844 | mov dword [check_idle_semaphore],5 |
959 | .ipc_no_cis: |
845 | .ipc_no_cis: |
960 | popf |
846 | popf |
961 | xor eax, eax |
847 | xor eax, eax |
962 | ret |
848 | ret |
963 | .no_pid: |
849 | .no_pid: |
964 | popf |
850 | popf |
965 | mov eax, 4 |
851 | mov eax, 4 |
966 | ret |
852 | ret |
967 | .no_ipc_area: |
853 | .no_ipc_area: |
968 | popf |
854 | popf |
969 | xor eax, eax |
855 | xor eax, eax |
970 | inc eax |
856 | inc eax |
971 | ret |
857 | ret |
972 | .ipc_blocked: |
858 | .ipc_blocked: |
973 | popf |
859 | popf |
974 | mov eax, 2 |
860 | mov eax, 2 |
975 | ret |
861 | ret |
976 | .buffer_overflow: |
862 | .buffer_overflow: |
977 | popf |
863 | popf |
978 | mov eax, 3 |
864 | mov eax, 3 |
979 | ret |
865 | ret |
980 | endp |
866 | endp |
981 | 867 | ||
982 | align 4 |
868 | align 4 |
983 | sysfn_meminfo: |
869 | sysfn_meminfo: |
984 | 870 | ||
985 | add ebx, new_app_base |
871 | ; add ebx, new_app_base |
986 | cmp ebx, new_app_base |
872 | cmp ebx, OS_BASE |
987 | jb .fail |
873 | jae .fail |
988 | 874 | ||
989 | mov eax, [pg_data.pages_count] |
875 | mov eax, [pg_data.pages_count] |
990 | mov [ebx], eax |
876 | mov [ebx], eax |
991 | shl eax, 12 |
877 | shl eax, 12 |
992 | mov [esp+36], eax |
878 | mov [esp+36], eax |
993 | mov ecx, [pg_data.pages_free] |
879 | mov ecx, [pg_data.pages_free] |
994 | mov [ebx+4], ecx |
880 | mov [ebx+4], ecx |
995 | mov edx, [pg_data.pages_faults] |
881 | mov edx, [pg_data.pages_faults] |
996 | mov [ebx+8], edx |
882 | mov [ebx+8], edx |
997 | mov esi, [heap_size] |
883 | mov esi, [heap_size] |
998 | mov [ebx+12], esi |
884 | mov [ebx+12], esi |
999 | mov edi, [heap_free] |
885 | mov edi, [heap_free] |
1000 | mov [ebx+16], edi |
886 | mov [ebx+16], edi |
1001 | mov eax, [heap_blocks] |
887 | mov eax, [heap_blocks] |
1002 | mov [ebx+20], eax |
888 | mov [ebx+20], eax |
1003 | mov ecx, [free_blocks] |
889 | mov ecx, [free_blocks] |
1004 | mov [ebx+24], ecx |
890 | mov [ebx+24], ecx |
1005 | ret |
891 | ret |
1006 | .fail: |
892 | .fail: |
1007 | mov dword [esp+36], -1 |
893 | mov dword [esp+36], -1 |
1008 | ret |
894 | ret |
1009 | 895 | ||
1010 | align 4 |
896 | align 4 |
1011 | new_services: |
897 | new_services: |
1012 | 898 | ||
1013 | cmp eax,4 |
899 | cmp eax,4 |
1014 | jle sys_sheduler |
900 | jle sys_sheduler |
1015 | 901 | ||
1016 | cmp eax, 11 |
902 | cmp eax, 11 |
1017 | jb .fail |
903 | jb .fail |
1018 | ja @f |
904 | ja @f |
1019 | 905 | ||
1020 | call init_heap |
906 | call init_heap |
1021 | mov [esp+36], eax |
907 | mov [esp+36], eax |
1022 | ret |
908 | ret |
1023 | @@: |
909 | @@: |
1024 | cmp eax, 12 |
910 | cmp eax, 12 |
1025 | ja @f |
911 | ja @f |
1026 | 912 | ||
1027 | stdcall user_alloc, ebx |
913 | stdcall user_alloc, ebx |
1028 | mov [esp+36], eax |
914 | mov [esp+36], eax |
1029 | ret |
915 | ret |
1030 | @@: |
916 | @@: |
1031 | cmp eax, 13 |
917 | cmp eax, 13 |
1032 | ja @f |
918 | ja @f |
1033 | add ebx, new_app_base |
- | |
1034 | stdcall user_free, ebx |
919 | stdcall user_free, ebx |
1035 | mov [esp+36], eax |
920 | mov [esp+36], eax |
1036 | ret |
921 | ret |
1037 | @@: |
922 | @@: |
1038 | cmp eax, 14 |
923 | cmp eax, 14 |
1039 | ja @f |
924 | ja @f |
1040 | add ebx, new_app_base |
- | |
1041 | cmp ebx, new_app_base |
925 | cmp ebx, OS_BASE |
1042 | jb .fail |
926 | jae .fail |
1043 | stdcall get_event_ex, ebx, ecx |
927 | stdcall get_event_ex, ebx, ecx |
1044 | mov [esp+36], eax |
928 | mov [esp+36], eax |
1045 | ret |
929 | ret |
1046 | @@: |
930 | @@: |
1047 | cmp eax, 15 |
931 | cmp eax, 15 |
1048 | ja @f |
932 | ja @f |
1049 | mov ecx, [CURRENT_TASK] |
933 | mov ecx, [current_slot] |
1050 | shl ecx, 8 |
- | |
1051 | mov eax, [ecx+SLOT_BASE+APPDATA.fpu_handler] |
934 | mov eax, [ecx+APPDATA.fpu_handler] |
1052 | mov [ecx+SLOT_BASE+APPDATA.fpu_handler], ebx |
935 | mov [ecx+APPDATA.fpu_handler], ebx |
1053 | mov [esp+36], eax |
936 | mov [esp+36], eax |
1054 | ret |
937 | ret |
1055 | @@: |
938 | @@: |
1056 | cmp eax, 16 |
939 | cmp eax, 16 |
1057 | ja @f |
940 | ja @f |
1058 | 941 | ||
1059 | test ebx, ebx |
942 | test ebx, ebx |
1060 | jz .fail |
943 | jz .fail |
1061 | add ebx, new_app_base |
- | |
1062 | cmp ebx, new_app_base |
944 | cmp ebx, OS_BASE |
1063 | jb .fail |
945 | jae .fail |
1064 | stdcall get_service, ebx |
946 | stdcall get_service, ebx |
1065 | mov [esp+36], eax |
947 | mov [esp+36], eax |
1066 | ret |
948 | ret |
1067 | @@: |
949 | @@: |
1068 | cmp eax, 17 |
950 | cmp eax, 17 |
1069 | ja @f |
951 | ja @f |
1070 | call srv_handlerEx ;ebx |
952 | call srv_handlerEx ;ebx |
1071 | mov [esp+36], eax |
953 | mov [esp+36], eax |
1072 | ret |
954 | ret |
1073 | @@: |
955 | @@: |
1074 | cmp eax, 18 |
956 | cmp eax, 18 |
1075 | ja @f |
957 | ja @f |
1076 | mov ecx, [CURRENT_TASK] |
958 | mov ecx, [current_slot] |
1077 | shl ecx, 8 |
- | |
1078 | mov eax, [ecx+SLOT_BASE+APPDATA.sse_handler] |
959 | mov eax, [ecx+APPDATA.sse_handler] |
1079 | mov [ecx+SLOT_BASE+APPDATA.sse_handler], ebx |
960 | mov [ecx+APPDATA.sse_handler], ebx |
1080 | mov [esp+36], eax |
961 | mov [esp+36], eax |
1081 | ret |
962 | ret |
1082 | @@: |
963 | @@: |
1083 | cmp eax, 19 |
964 | cmp eax, 19 |
1084 | ja @f |
965 | ja @f |
1085 | add ebx, new_app_base |
- | |
1086 | cmp ebx, new_app_base |
966 | cmp ebx, OS_BASE |
1087 | jb .fail |
967 | jae .fail |
1088 | stdcall load_library, ebx |
968 | stdcall load_library, ebx |
1089 | mov [esp+36], eax |
969 | mov [esp+36], eax |
1090 | ret |
970 | ret |
1091 | 971 | ||
1092 | @@: |
972 | @@: |
1093 | cmp eax, 20 |
973 | cmp eax, 20 |
1094 | ja .fail |
974 | ja .fail |
1095 | mov eax, ecx |
975 | mov eax, ecx |
1096 | call user_realloc |
976 | call user_realloc |
1097 | mov [esp+36], eax |
977 | mov [esp+36], eax |
1098 | ret |
978 | ret |
1099 | 979 | ||
1100 | .fail: |
980 | .fail: |
1101 | xor eax, eax |
981 | xor eax, eax |
1102 | mov [esp+36], eax |
982 | mov [esp+36], eax |
1103 | ret |
983 | ret |
1104 | 984 | ||
1105 | align 4 |
985 | align 4 |
1106 | proc strncmp stdcall, str1:dword, str2:dword, count:dword |
- | |
1107 | - | ||
1108 | mov ecx,[count] |
- | |
1109 | jecxz .end |
- | |
1110 | - | ||
1111 | mov ebx,ecx |
- | |
1112 | - | ||
1113 | mov edi,[str1] |
- | |
1114 | mov esi,edi |
- | |
1115 | xor eax,eax |
- | |
1116 | repne scasb |
- | |
1117 | neg ecx ; cx = count - strlen |
- | |
1118 | add ecx,ebx ; strlen + count - strlen |
- | |
1119 | - | ||
1120 | .okay: |
- | |
1121 | mov edi,esi |
- | |
1122 | mov esi,[str2] |
- | |
1123 | repe cmpsb |
- | |
1124 | mov al,[esi-1] |
- | |
1125 | xor ecx,ecx |
- | |
1126 | - | ||
1127 | cmp al,[edi-1] |
- | |
1128 | ja .str2_big |
- | |
1129 | je .end |
- | |
1130 | - | ||
1131 | .str1_big: |
- | |
1132 | sub ecx,2 |
- | |
1133 | - | ||
1134 | .str2_big: |
- | |
1135 | not ecx |
- | |
1136 | .end: |
- | |
1137 | mov eax,ecx |
- | |
1138 | ret |
- | |
1139 | endp |
- | |
1140 | - | ||
1141 | align 4 |
- | |
1142 | proc test_cpu |
- | |
1143 | locals |
- | |
1144 | cpu_type dd ? |
- | |
1145 | cpu_id dd ? |
- | |
1146 | cpu_Intel dd ? |
- | |
1147 | cpu_AMD dd ? |
- | |
1148 | endl |
- | |
1149 | - | ||
1150 | mov [cpu_type], 0 |
- | |
1151 | xor eax, eax |
- | |
1152 | mov [cpu_caps], eax |
- | |
1153 | mov [cpu_caps+4], eax |
- | |
1154 | - | ||
1155 | pushfd |
- | |
1156 | pop eax |
- | |
1157 | mov ecx, eax |
- | |
1158 | xor eax, 0x40000 |
- | |
1159 | push eax |
- | |
1160 | popfd |
- | |
1161 | pushfd |
- | |
1162 | pop eax |
- | |
1163 | xor eax, ecx |
- | |
1164 | mov [cpu_type], CPU_386 |
- | |
1165 | jz .end_cpuid |
- | |
1166 | push ecx |
- | |
1167 | popfd |
- | |
1168 | - | ||
1169 | mov [cpu_type], CPU_486 |
- | |
1170 | mov eax, ecx |
- | |
1171 | xor eax, 0x200000 |
- | |
1172 | push eax |
- | |
1173 | popfd |
- | |
1174 | pushfd |
- | |
1175 | pop eax |
- | |
1176 | xor eax, ecx |
- | |
1177 | je .end_cpuid |
- | |
1178 | mov [cpu_id], 1 |
- | |
1179 | - | ||
1180 | xor eax, eax |
- | |
1181 | cpuid |
- | |
1182 | mov [cpu_vendor], ebx |
- | |
1183 | mov [cpu_vendor+4], edx |
- | |
1184 | mov [cpu_vendor+8], ecx |
- | |
1185 | cmp ebx, dword [intel_str] |
- | |
1186 | jne .check_AMD |
- | |
1187 | cmp edx, dword [intel_str+4] |
- | |
1188 | jne .check_AMD |
- | |
1189 | cmp ecx, dword [intel_str+8] |
- | |
1190 | jne .check_AMD |
- | |
1191 | mov [cpu_Intel], 1 |
- | |
1192 | cmp eax, 1 |
- | |
1193 | jl .end_cpuid |
- | |
1194 | mov eax, 1 |
- | |
1195 | cpuid |
- | |
1196 | mov [cpu_sign], eax |
- | |
1197 | mov [cpu_info], ebx |
- | |
1198 | mov [cpu_caps], edx |
- | |
1199 | mov [cpu_caps+4],ecx |
- | |
1200 | - | ||
1201 | shr eax, 8 |
- | |
1202 | and eax, 0x0f |
- | |
1203 | ret |
- | |
1204 | .end_cpuid: |
- | |
1205 | mov eax, [cpu_type] |
- | |
1206 | ret |
- | |
1207 | - | ||
1208 | .check_AMD: |
- | |
1209 | cmp ebx, dword [AMD_str] |
- | |
1210 | jne .unknown |
- | |
1211 | cmp edx, dword [AMD_str+4] |
- | |
1212 | jne .unknown |
- | |
1213 | cmp ecx, dword [AMD_str+8] |
- | |
1214 | jne .unknown |
- | |
1215 | mov [cpu_AMD], 1 |
- | |
1216 | cmp eax, 1 |
- | |
1217 | jl .unknown |
- | |
1218 | mov eax, 1 |
- | |
1219 | cpuid |
- | |
1220 | mov [cpu_sign], eax |
- | |
1221 | mov [cpu_info], ebx |
- | |
1222 | mov [cpu_caps], edx |
- | |
1223 | mov [cpu_caps+4],ecx |
- | |
1224 | shr eax, 8 |
- | |
1225 | and eax, 0x0f |
- | |
1226 | ret |
- | |
1227 | .unknown: |
- | |
1228 | mov eax, 1 |
- | |
1229 | cpuid |
- | |
1230 | mov [cpu_sign], eax |
- | |
1231 | mov [cpu_info], ebx |
- | |
1232 | mov [cpu_caps], edx |
- | |
1233 | mov [cpu_caps+4],ecx |
- | |
1234 | shr eax, 8 |
- | |
1235 | and eax, 0x0f |
- | |
1236 | ret |
- | |
1237 | endp |
- | |
1238 | - | ||
1239 | MEM_WB equ 6 ;write-back memory |
- | |
1240 | MEM_WC equ 1 ;write combined memory |
- | |
1241 | MEM_UC equ 0 ;uncached memory |
- | |
1242 | - | ||
1243 | align 4 |
- | |
1244 | proc init_mtrr |
986 | proc init_mtrr |
1245 | 987 | ||
1246 | cmp [BOOT_VAR+0x901c],byte 2 |
988 | cmp [BOOT_VAR+0x901c],byte 2 |
1247 | je .exit |
989 | je .exit |
1248 | 990 | ||
1249 | bt [cpu_caps], CAPS_MTRR |
991 | bt [cpu_caps], CAPS_MTRR |
1250 | jnc .exit |
992 | jnc .exit |
1251 | 993 | ||
1252 | mov eax, cr0 |
994 | mov eax, cr0 |
1253 | or eax, 0x60000000 ;disable caching |
995 | or eax, 0x60000000 ;disable caching |
1254 | mov cr0, eax |
996 | mov cr0, eax |
1255 | wbinvd ;invalidate cache |
997 | wbinvd ;invalidate cache |
1256 | 998 | ||
1257 | mov ecx, 0x2FF |
999 | mov ecx, 0x2FF |
1258 | rdmsr ; |
1000 | rdmsr ; |
1259 | push eax |
1001 | push eax |
1260 | 1002 | ||
1261 | xor edx, edx |
1003 | xor edx, edx |
1262 | xor eax, eax |
1004 | xor eax, eax |
1263 | mov ecx, 0x2FF |
1005 | mov ecx, 0x2FF |
1264 | wrmsr ;disable all MTRR |
1006 | wrmsr ;disable all MTRR |
1265 | 1007 | ||
1266 | stdcall set_mtrr, dword 0,dword 0,[MEM_AMOUNT],MEM_WB |
1008 | stdcall set_mtrr, dword 0,dword 0,[MEM_AMOUNT],MEM_WB |
1267 | stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC |
1009 | stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC |
1268 | xor edx, edx |
1010 | xor edx, edx |
1269 | xor eax, eax |
1011 | xor eax, eax |
1270 | mov ecx, 0x204 |
1012 | mov ecx, 0x204 |
1271 | mov ebx, 6 |
1013 | mov ebx, 6 |
1272 | @@: |
1014 | @@: |
1273 | wrmsr ;disable unused MTRR |
1015 | wrmsr ;disable unused MTRR |
1274 | inc ecx |
1016 | inc ecx |
1275 | wrmsr |
1017 | wrmsr |
1276 | inc ecx |
1018 | inc ecx |
1277 | dec ebx |
1019 | dec ebx |
1278 | jnz @b |
1020 | jnz @b |
1279 | 1021 | ||
1280 | wbinvd ;again invalidate |
1022 | wbinvd ;again invalidate |
1281 | 1023 | ||
1282 | pop eax |
1024 | pop eax |
1283 | or eax, 0x800 ;set default memtype to UC |
1025 | or eax, 0x800 ;set default memtype to UC |
1284 | and al, 0xF0 |
1026 | and al, 0xF0 |
1285 | mov ecx, 0x2FF |
1027 | mov ecx, 0x2FF |
1286 | wrmsr ;and enable MTRR |
1028 | wrmsr ;and enable MTRR |
1287 | 1029 | ||
1288 | mov eax, cr0 |
1030 | mov eax, cr0 |
1289 | and eax, not 0x60000000 |
1031 | and eax, not 0x60000000 |
1290 | mov cr0, eax ; enable caching |
1032 | mov cr0, eax ; enable caching |
1291 | .exit: |
1033 | .exit: |
1292 | ret |
1034 | ret |
1293 | endp |
1035 | endp |
1294 | 1036 | ||
1295 | align 4 |
1037 | align 4 |
1296 | proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword |
1038 | proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword |
1297 | 1039 | ||
1298 | xor edx, edx |
1040 | xor edx, edx |
1299 | mov eax, [base] |
1041 | mov eax, [base] |
1300 | or eax, [mem_type] |
1042 | or eax, [mem_type] |
1301 | mov ecx, [reg] |
1043 | mov ecx, [reg] |
1302 | lea ecx, [0x200+ecx*2] |
1044 | lea ecx, [0x200+ecx*2] |
1303 | wrmsr |
1045 | wrmsr |
1304 | 1046 | ||
1305 | mov ebx, [size] |
1047 | mov ebx, [size] |
1306 | dec ebx |
1048 | dec ebx |
1307 | mov eax, 0xFFFFFFFF |
1049 | mov eax, 0xFFFFFFFF |
1308 | mov edx, 0x0000000F |
1050 | mov edx, 0x0000000F |
1309 | sub eax, ebx |
1051 | sub eax, ebx |
1310 | sbb edx, 0 |
1052 | sbb edx, 0 |
1311 | or eax, 0x800 |
1053 | or eax, 0x800 |
1312 | inc ecx |
1054 | inc ecx |
1313 | wrmsr |
1055 | wrmsr |
1314 | ret |
1056 | ret |
1315 | endp |
1057 | endp |
- | 1058 | ||
- | 1059 | ||
- | 1060 | align 4 |
|
- | 1061 | proc strncmp stdcall, str1:dword, str2:dword, count:dword |
|
- | 1062 | ||
- | 1063 | mov ecx,[count] |
|
- | 1064 | jecxz .end |
|
- | 1065 | ||
- | 1066 | mov ebx,ecx |
|
- | 1067 | ||
- | 1068 | mov edi,[str1] |
|
- | 1069 | mov esi,edi |
|
- | 1070 | xor eax,eax |
|
- | 1071 | repne scasb |
|
- | 1072 | neg ecx ; cx = count - strlen |
|
- | 1073 | add ecx,ebx ; strlen + count - strlen |
|
- | 1074 | ||
- | 1075 | .okay: |
|
- | 1076 | mov edi,esi |
|
- | 1077 | mov esi,[str2] |
|
- | 1078 | repe cmpsb |
|
- | 1079 | mov al,[esi-1] |
|
- | 1080 | xor ecx,ecx |
|
- | 1081 | ||
- | 1082 | cmp al,[edi-1] |
|
- | 1083 | ja .str2_big |
|
- | 1084 | je .end |
|
- | 1085 | ||
- | 1086 | .str1_big: |
|
- | 1087 | sub ecx,2 |
|
- | 1088 | ||
- | 1089 | .str2_big: |
|
- | 1090 | not ecx |
|
- | 1091 | .end: |
|
- | 1092 | mov eax,ecx |
|
- | 1093 | ret |
|
- | 1094 | endp |
|
1316 | 1095 | ||
1317 | align 4 |
1096 | align 4 |
1318 | proc stall stdcall, delay:dword |
1097 | proc stall stdcall, delay:dword |
1319 | push ecx |
1098 | push ecx |
1320 | push edx |
1099 | push edx |
1321 | push ebx |
1100 | push ebx |
1322 | push eax |
1101 | push eax |
1323 | 1102 | ||
1324 | mov eax, [delay] |
1103 | mov eax, [delay] |
1325 | mul [stall_mcs] |
1104 | mul [stall_mcs] |
1326 | mov ebx, eax ;low |
1105 | mov ebx, eax ;low |
1327 | mov ecx, edx ;high |
1106 | mov ecx, edx ;high |
1328 | rdtsc |
1107 | rdtsc |
1329 | add ebx, eax |
1108 | add ebx, eax |
1330 | adc ecx,edx |
1109 | adc ecx,edx |
1331 | @@: |
1110 | @@: |
1332 | rdtsc |
1111 | rdtsc |
1333 | sub eax, ebx |
1112 | sub eax, ebx |
1334 | sbb edx, ecx |
1113 | sbb edx, ecx |
1335 | jb @B |
1114 | jb @B |
1336 | 1115 | ||
1337 | pop eax |
1116 | pop eax |
1338 | pop ebx |
1117 | pop ebx |
1339 | pop edx |
1118 | pop edx |
1340 | pop ecx |
1119 | pop ecx |
1341 | ret |
1120 | ret |
1342 | endp |
1121 | endp |
1343 | - | ||
1344 | iglobal |
- | |
1345 | align 4 |
- | |
1346 | intel_str db "GenuineIntel",0 |
- | |
1347 | AMD_str db "AuthenticAMD",0 |
- | |
1348 | endg |
- | |
1349 | - | ||
1350 | uglobal |
- | |
1351 | align 16 |
- | |
1352 | irq_tab rd 16 |
- | |
1353 | - | ||
1354 | MEM_FreeSpace rd 1 |
- | |
1355 | - | ||
1356 | ipc_tmp rd 1 |
- | |
1357 | ipc_pdir rd 1 |
- | |
1358 | ipc_ptab rd 1 |
- | |
1359 | - | ||
1360 | proc_mem_map rd 1 |
- | |
1361 | proc_mem_pdir rd 1 |
- | |
1362 | proc_mem_tab rd 1 |
- | |
1363 | - | ||
1364 | tmp_task_pdir rd 1 |
- | |
1365 | tmp_task_ptab rd 1 |
- | |
1366 | - | ||
1367 | fdd_buff rd 1 |
- | |
1368 | LFBSize rd 1 |
- | |
1369 | - | ||
1370 | stall_mcs rd 1 |
- | |
1371 | ;;CPUID information |
- | |
1372 | - | ||
1373 | cpu_vendor rd 3 |
- | |
1374 | cpu_sign rd 1 |
- | |
1375 | cpu_info rd 1 |
- | |
1376 | - | ||
1377 | ;;;;; cursors data |
- | |
1378 | - | ||
1379 | align 16 |
- | |
1380 | cur_saved_data rb 4096 |
- | |
1381 | - | ||
1382 | def_cursor rd 1 |
- | |
1383 | hw_cursor rd 1 |
- | |
1384 | - | ||
1385 | scr_width rd 1 |
- | |
1386 | scr_height rd 1 |
- | |
1387 | - | ||
1388 | cur_def_interl rd 1 |
- | |
1389 | cur_saved_base rd 1 |
- | |
1390 | cur_saved_interl rd 1 |
- | |
1391 | cur_saved_w rd 1 |
- | |
1392 | cur_saved_h rd 1 |
- | |
1393 | - | ||
1394 | endg |
- | |
1395 | - | ||
1396 | uglobal |
- | |
1397 | align 16 |
- | |
1398 | fpu_data: |
- | |
1399 | rb 512 |
- | |
1400 | - | ||
1401 | mst MEM_STATE |
- | |
1402 | - | ||
1403 | mem_block_map rb 512 |
- | |
1404 | event_map rb 64 |
- | |
1405 | mem_block_list rd 64 |
- | |
1406 | mem_block_mask rd 2 |
- | |
1407 | - | ||
1408 | srv.fd rd 1 |
- | |
1409 | srv.bk rd 1 |
- | |
1410 | - | ||
1411 | mem_used.fd rd 1 |
- | |
1412 | mem_used.bk rd 1 |
- | |
1413 | - | ||
1414 | mem_block_arr rd 1 |
- | |
1415 | mem_block_start rd 1 |
- | |
1416 | mem_block_end rd 1 |
- | |
1417 | - | ||
1418 | heap_mutex rd 1 |
- | |
1419 | heap_size rd 1 |
- | |
1420 | heap_free rd 1 |
- | |
1421 | heap_blocks rd 1 |
- | |
1422 | free_blocks rd 1 |
- | |
1423 | - | ||
1424 | page_start rd 1 |
- | |
1425 | page_end rd 1 |
- | |
1426 | events rd 1 |
- | |
1427 | event_start rd 1 |
- | |
1428 | event_end rd 1 |
- | |
1429 | event_uid rd 1 |
- | |
1430 | sys_page_map rd 1 |
- | |
1431 | os_stack rd 1 |
- | |
1432 | endg |
- | |
1433 | - | ||
1434 | if 0 |
- | |
1435 | push eax |
- | |
1436 | push edx |
- | |
1437 | mov edx, 0x400 ;bocsh |
- | |
1438 | mov al,0xff ;bocsh |
- | |
1439 | out dx, al ;bocsh |
- | |
1440 | pop edx |
- | |
1441 | pop eax |
- | |
1442 | end if |
- | |
1443 | 1122 | ||
1444 | align 4 |
1123 | align 4 |
1445 | k_strrchr: |
1124 | k_strrchr: |
1446 | push eax |
1125 | push eax |
1447 | xor eax,eax |
1126 | xor eax,eax |
1448 | or ecx,-1 |
1127 | or ecx,-1 |
1449 | repne scasb |
1128 | repne scasb |
1450 | add ecx,1 |
1129 | add ecx,1 |
1451 | neg ecx |
1130 | neg ecx |
1452 | sub edi,1 |
1131 | sub edi,1 |
1453 | pop eax |
1132 | pop eax |
1454 | std |
1133 | std |
1455 | repne scasb |
1134 | repne scasb |
1456 | cld |
1135 | cld |
1457 | add edi,1 |
1136 | add edi,1 |
1458 | 1137 | ||
1459 | cmp [edi],al |
1138 | cmp [edi],al |
1460 | jne @F |
1139 | jne @F |
1461 | mov eax,edi |
1140 | mov eax,edi |
1462 | ret |
1141 | ret |
1463 | @@: |
1142 | @@: |
1464 | xor eax,eax |
1143 | xor eax,eax |
1465 | ret |
1144 | ret |
1466 | 1145 | ||
1467 | align 4 |
1146 | align 4 |
1468 | proc k_strncpy stdcall, dest:dword, src:dword, maxlen:dword |
1147 | proc k_strncpy stdcall, dest:dword, src:dword, maxlen:dword |
1469 | mov eax, [dest] |
1148 | mov eax, [dest] |
1470 | mov esi, [src] |
1149 | mov esi, [src] |
1471 | mov ecx, [maxlen] |
1150 | mov ecx, [maxlen] |
1472 | test eax, eax |
1151 | test eax, eax |
1473 | jz .L9 |
1152 | jz .L9 |
1474 | test esi, esi |
1153 | test esi, esi |
1475 | jz .L9 |
1154 | jz .L9 |
1476 | test ecx, ecx |
1155 | test ecx, ecx |
1477 | jz .L9 |
1156 | jz .L9 |
1478 | 1157 | ||
1479 | sub esi, eax |
1158 | sub esi, eax |
1480 | jmp .L1 |
1159 | jmp .L1 |
1481 | 1160 | ||
1482 | align 4 |
1161 | align 4 |
1483 | .L2: |
1162 | .L2: |
1484 | mov edx, [esi+eax] |
1163 | mov edx, [esi+eax] |
1485 | mov [eax], dl |
1164 | mov [eax], dl |
1486 | test dl, dl |
1165 | test dl, dl |
1487 | jz .L7 |
1166 | jz .L7 |
1488 | 1167 | ||
1489 | mov [eax+1], dh |
1168 | mov [eax+1], dh |
1490 | test dh, dh |
1169 | test dh, dh |
1491 | jz .L6 |
1170 | jz .L6 |
1492 | 1171 | ||
1493 | shr edx, 16 |
1172 | shr edx, 16 |
1494 | mov [eax+2],dl |
1173 | mov [eax+2],dl |
1495 | test dl, dl |
1174 | test dl, dl |
1496 | jz .L5 |
1175 | jz .L5 |
1497 | 1176 | ||
1498 | mov [eax+3], dh |
1177 | mov [eax+3], dh |
1499 | test dh, dh |
1178 | test dh, dh |
1500 | jz .L4 |
1179 | jz .L4 |
1501 | add eax, 4 |
1180 | add eax, 4 |
1502 | .L1: |
1181 | .L1: |
1503 | sub ecx, 4 |
1182 | sub ecx, 4 |
1504 | jae .L2 |
1183 | jae .L2 |
1505 | 1184 | ||
1506 | add ecx, 4 |
1185 | add ecx, 4 |
1507 | jz .L9 |
1186 | jz .L9 |
1508 | 1187 | ||
1509 | mov dl, [eax+esi] |
1188 | mov dl, [eax+esi] |
1510 | mov [eax], dl |
1189 | mov [eax], dl |
1511 | test dl, dl |
1190 | test dl, dl |
1512 | jz .L3 |
1191 | jz .L3 |
1513 | 1192 | ||
1514 | inc eax |
1193 | inc eax |
1515 | dec ecx |
1194 | dec ecx |
1516 | jz .L9 |
1195 | jz .L9 |
1517 | 1196 | ||
1518 | mov dl, [eax+esi] |
1197 | mov dl, [eax+esi] |
1519 | mov [eax], dl |
1198 | mov [eax], dl |
1520 | test dl, dl |
1199 | test dl, dl |
1521 | jz .L3 |
1200 | jz .L3 |
1522 | 1201 | ||
1523 | inc eax |
1202 | inc eax |
1524 | dec ecx |
1203 | dec ecx |
1525 | jz .L9 |
1204 | jz .L9 |
1526 | 1205 | ||
1527 | mov dl, [eax+esi] |
1206 | mov dl, [eax+esi] |
1528 | mov [eax], dl |
1207 | mov [eax], dl |
1529 | test dl, dl |
1208 | test dl, dl |
1530 | jz .L3 |
1209 | jz .L3 |
1531 | 1210 | ||
1532 | inc eax |
1211 | inc eax |
1533 | jmp .L9 |
1212 | jmp .L9 |
1534 | 1213 | ||
1535 | .L4: dec ecx |
1214 | .L4: dec ecx |
1536 | inc eax |
1215 | inc eax |
1537 | 1216 | ||
1538 | .L5: dec ecx |
1217 | .L5: dec ecx |
1539 | inc eax |
1218 | inc eax |
1540 | 1219 | ||
1541 | .L6: dec ecx |
1220 | .L6: dec ecx |
1542 | inc eax |
1221 | inc eax |
1543 | .L7: |
1222 | .L7: |
1544 | add ecx,3 |
1223 | add ecx,3 |
1545 | jz .L9 |
1224 | jz .L9 |
1546 | .L8: |
1225 | .L8: |
1547 | mov byte [ecx+eax], 0 |
1226 | mov byte [ecx+eax], 0 |
1548 | .L3: |
1227 | .L3: |
1549 | dec ecx |
1228 | dec ecx |
1550 | jnz .L8 |
1229 | jnz .L8 |
1551 | .L9: |
1230 | .L9: |
1552 | ret |
1231 | ret |
1553 | endp |
1232 | endp |
1554 | 1233 | ||
1555 | if 0 |
1234 | if 0 |
1556 | 1235 | ||
1557 | magic equ 0xfefefeff |
1236 | magic equ 0xfefefeff |
1558 | 1237 | ||
1559 | k_strlen: |
1238 | k_strlen: |
1560 | mov eax,[esp+4] |
1239 | mov eax,[esp+4] |
1561 | mov edx, 3 |
1240 | mov edx, 3 |
1562 | 1241 | ||
1563 | and edx, eax |
1242 | and edx, eax |
1564 | jz .L1 |
1243 | jz .L1 |
1565 | jp .L0 |
1244 | jp .L0 |
1566 | 1245 | ||
1567 | cmp dh, byte [eax] |
1246 | cmp dh, byte [eax] |
1568 | je .L2 |
1247 | je .L2 |
1569 | 1248 | ||
1570 | inc eax |
1249 | inc eax |
1571 | cmp dh, byte [eax] |
1250 | cmp dh, byte [eax] |
1572 | 1251 | ||
1573 | je .L2 |
1252 | je .L2 |
1574 | 1253 | ||
1575 | inc eax |
1254 | inc eax |
1576 | xor edx, 2 |
1255 | xor edx, 2 |
1577 | 1256 | ||
1578 | jz .L1 |
1257 | jz .L1 |
1579 | .L0: |
1258 | .L0: |
1580 | cmp dh, [eax] |
1259 | cmp dh, [eax] |
1581 | je .L2 |
1260 | je .L2 |
1582 | 1261 | ||
1583 | inc eax |
1262 | inc eax |
1584 | xor edx, edx |
1263 | xor edx, edx |
1585 | 1264 | ||
1586 | .L1: |
1265 | .L1: |
1587 | mov ecx, [eax] |
1266 | mov ecx, [eax] |
1588 | add eax, 4 |
1267 | add eax, 4 |
1589 | 1268 | ||
1590 | sub edx, ecx |
1269 | sub edx, ecx |
1591 | add ecx, magic |
1270 | add ecx, magic |
1592 | 1271 | ||
1593 | dec edx |
1272 | dec edx |
1594 | jnc .L3 |
1273 | jnc .L3 |
1595 | 1274 | ||
1596 | xor edx, ecx |
1275 | xor edx, ecx |
1597 | and edx, not magic |
1276 | and edx, not magic |
1598 | jne .L3 |
1277 | jne .L3 |
1599 | 1278 | ||
1600 | mov ecx, [eax] |
1279 | mov ecx, [eax] |
1601 | add eax, 4 |
1280 | add eax, 4 |
1602 | 1281 | ||
1603 | sub edx, ecx |
1282 | sub edx, ecx |
1604 | add ecx, magic |
1283 | add ecx, magic |
1605 | dec edx |
1284 | dec edx |
1606 | jnc .L3 |
1285 | jnc .L3 |
1607 | 1286 | ||
1608 | xor edx, ecx |
1287 | xor edx, ecx |
1609 | and edx, not magic |
1288 | and edx, not magic |
1610 | jne .L3 |
1289 | jne .L3 |
1611 | 1290 | ||
1612 | mov ecx, [eax] |
1291 | mov ecx, [eax] |
1613 | add eax, 4 |
1292 | add eax, 4 |
1614 | 1293 | ||
1615 | sub edx, ecx |
1294 | sub edx, ecx |
1616 | add ecx, magic |
1295 | add ecx, magic |
1617 | 1296 | ||
1618 | dec edx |
1297 | dec edx |
1619 | jnc .L3 |
1298 | jnc .L3 |
1620 | 1299 | ||
1621 | xor edx, ecx |
1300 | xor edx, ecx |
1622 | 1301 | ||
1623 | and edx, not magic |
1302 | and edx, not magic |
1624 | jne .L3 |
1303 | jne .L3 |
1625 | 1304 | ||
1626 | mov ecx, [eax] |
1305 | mov ecx, [eax] |
1627 | add eax, 4 |
1306 | add eax, 4 |
1628 | 1307 | ||
1629 | sub edx, ecx |
1308 | sub edx, ecx |
1630 | add ecx, magic |
1309 | add ecx, magic |
1631 | 1310 | ||
1632 | dec edx |
1311 | dec edx |
1633 | jnc .L3 |
1312 | jnc .L3 |
1634 | 1313 | ||
1635 | xor edx, ecx |
1314 | xor edx, ecx |
1636 | 1315 | ||
1637 | and edx, not magic |
1316 | and edx, not magic |
1638 | je .L1 |
1317 | je .L1 |
1639 | 1318 | ||
1640 | .L3: sub eax ,4 |
1319 | .L3: sub eax ,4 |
1641 | sub ecx, magic |
1320 | sub ecx, magic |
1642 | 1321 | ||
1643 | cmp cl, 0 |
1322 | cmp cl, 0 |
1644 | jz .L2 |
1323 | jz .L2 |
1645 | 1324 | ||
1646 | inc eax |
1325 | inc eax |
1647 | test ch, ch |
1326 | test ch, ch |
1648 | jz .L2 |
1327 | jz .L2 |
1649 | 1328 | ||
1650 | shr ecx, 16 |
1329 | shr ecx, 16 |
1651 | inc eax |
1330 | inc eax |
1652 | 1331 | ||
1653 | cmp cl,0 |
1332 | cmp cl,0 |
1654 | jz .L2 |
1333 | jz .L2 |
1655 | 1334 | ||
1656 | inc eax |
1335 | inc eax |
1657 | 1336 | ||
1658 | .L2: |
1337 | .L2: |
1659 | sub eax, [esp+4] |
1338 | sub eax, [esp+4] |
1660 | ret |
1339 | ret |
1661 | 1340 | ||
1662 | end if0>> |
1341 | end if |
- | 1342 | ||
- | 1343 | if 0 |
|
- | 1344 | push eax |
|
- | 1345 | push edx |
|
- | 1346 | mov edx, 0x400 ;bochs |
|
- | 1347 | mov al,0xff ;bochs |
|
- | 1348 | out dx, al ;bochs |
|
- | 1349 | pop edx |
|
- | 1350 | pop eax |
|
- | 1351 | end if0>> |
|
- | 1352 | ||
- | 1353 |