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