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