Rev 363 | Rev 378 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 363 | Rev 365 | ||
---|---|---|---|
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+0x600], sys_pgdir+PG_SW |
108 | mov dword [sys_pgdir+0x600], 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 [pages_tab+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 [pages_tab+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, pages_tab |
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 [current_pgdir+ebx*4], eax |
367 | mov dword [current_pgdir+ebx*4], eax |
368 | mov eax, [lin_addr] |
368 | mov eax, [lin_addr] |
369 | shr eax, 10 |
369 | shr eax, 10 |
370 | add eax, pages_tab |
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 | cmp dword [LFBAddress], -1 |
378 | cmp dword [LFBAddress], -1 |
379 | jne @f |
379 | jne @f |
380 | mov [0x2f0000+0x901c],byte 2 |
380 | mov [0x2f0000+0x901c],byte 2 |
381 | stdcall kernel_alloc, 0x280000 |
381 | stdcall kernel_alloc, 0x280000 |
382 | mov [LFBAddress], eax |
382 | mov [LFBAddress], eax |
383 | ret |
383 | ret |
384 | @@: |
384 | @@: |
385 | test [SCR_MODE],word 0100000000000000b |
385 | test [SCR_MODE],word 0100000000000000b |
386 | jnz @f |
386 | jnz @f |
387 | mov [0x2f0000+0x901c],byte 2 |
387 | mov [0x2f0000+0x901c],byte 2 |
388 | ret |
388 | ret |
389 | @@: |
389 | @@: |
390 | call map_LFB |
390 | call map_LFB |
391 | ret |
391 | ret |
392 | endp |
392 | endp |
393 | 393 | ||
394 | align 4 |
394 | align 4 |
395 | proc map_LFB |
395 | proc map_LFB |
396 | locals |
396 | locals |
397 | pg_count dd ? |
397 | pg_count dd ? |
398 | endl |
398 | endl |
399 | 399 | ||
400 | mov edi, [LFBSize] |
400 | mov edi, [LFBSize] |
401 | mov esi, [LFBAddress] |
401 | mov esi, [LFBAddress] |
402 | mov dword [exp_lfb+4], esi |
402 | mov dword [exp_lfb+4], esi |
403 | 403 | ||
404 | shr edi, 12 |
404 | shr edi, 12 |
405 | mov [pg_count], edi |
405 | mov [pg_count], edi |
406 | shr edi, 10 |
406 | shr edi, 10 |
407 | 407 | ||
408 | bt [cpu_caps], CAPS_PSE |
408 | bt [cpu_caps], CAPS_PSE |
409 | jnc .map_page_tables |
409 | jnc .map_page_tables |
410 | mov ebx, esi |
410 | mov ebx, esi |
411 | or esi, PG_LARGE+PG_UW |
411 | or esi, PG_LARGE+PG_UW |
412 | shr ebx, 20 |
412 | shr ebx, 20 |
413 | mov ecx, ebx |
413 | mov ecx, ebx |
414 | @@: |
414 | @@: |
415 | mov [sys_pgdir+ebx], esi |
415 | mov [sys_pgdir+ebx], esi |
416 | add ebx, 4 |
416 | add ebx, 4 |
417 | add esi, 0x00400000 |
417 | add esi, 0x00400000 |
418 | dec edi |
418 | dec edi |
419 | jnz @B |
419 | jnz @B |
420 | 420 | ||
421 | bt [cpu_caps], CAPS_PGE |
421 | bt [cpu_caps], CAPS_PGE |
422 | jnc @F |
422 | jnc @F |
423 | or dword [sys_pgdir+ecx], PG_GLOBAL |
423 | or dword [sys_pgdir+ecx], PG_GLOBAL |
424 | @@: |
424 | @@: |
425 | mov eax, cr3 ;flush TLB |
425 | mov eax, cr3 ;flush TLB |
426 | mov cr3, eax |
426 | mov cr3, eax |
427 | ret |
427 | ret |
428 | 428 | ||
429 | .map_page_tables: |
429 | .map_page_tables: |
430 | 430 | ||
431 | @@: |
431 | @@: |
432 | call alloc_page |
432 | call alloc_page |
433 | stdcall map_page_table, esi, eax |
433 | stdcall map_page_table, esi, eax |
434 | add esi, 0x00400000 |
434 | add esi, 0x00400000 |
435 | dec edi |
435 | dec edi |
436 | jnz @B |
436 | jnz @B |
437 | 437 | ||
438 | mov eax, [LFBAddress] |
438 | mov eax, [LFBAddress] |
439 | mov esi, eax |
439 | mov esi, eax |
440 | shr esi, 10 |
440 | shr esi, 10 |
441 | add esi, pages_tab |
441 | add esi, page_tabs |
442 | or eax, PG_UW |
442 | or eax, PG_UW |
443 | mov ecx, [pg_count] |
443 | mov ecx, [pg_count] |
444 | shr ecx, 2 |
444 | shr ecx, 2 |
445 | .map: |
445 | .map: |
446 | mov [esi], eax |
446 | mov [esi], eax |
447 | add eax, 0x1000 |
447 | add eax, 0x1000 |
448 | mov [esi+4], eax |
448 | mov [esi+4], eax |
449 | add eax, 0x1000 |
449 | add eax, 0x1000 |
450 | mov [esi+8], eax |
450 | mov [esi+8], eax |
451 | add eax, 0x1000 |
451 | add eax, 0x1000 |
452 | mov [esi+12], eax |
452 | mov [esi+12], eax |
453 | add eax, 0x1000 |
453 | add eax, 0x1000 |
454 | add esi, 16 |
454 | add esi, 16 |
455 | sub ecx, 1 |
455 | sub ecx, 1 |
456 | jnz .map |
456 | jnz .map |
457 | 457 | ||
458 | mov eax, cr3 ;flush TLB |
458 | mov eax, cr3 ;flush TLB |
459 | mov cr3, eax |
459 | mov cr3, eax |
460 | 460 | ||
461 | ret |
461 | ret |
462 | endp |
462 | endp |
463 | 463 | ||
464 | align 4 |
464 | align 4 |
465 | proc new_mem_resize stdcall, new_size:dword |
465 | proc new_mem_resize stdcall, new_size:dword |
466 | 466 | ||
467 | mov ebx, pg_data.pg_mutex |
467 | mov ebx, pg_data.pg_mutex |
468 | call wait_mutex ;ebx |
468 | call wait_mutex ;ebx |
469 | 469 | ||
470 | mov edi, [new_size] |
470 | mov edi, [new_size] |
471 | add edi,4095 |
471 | add edi,4095 |
472 | and edi,not 4095 |
472 | and edi,not 4095 |
473 | mov [new_size], edi |
473 | mov [new_size], edi |
474 | 474 | ||
475 | mov edx,[CURRENT_TASK] |
475 | mov edx,[CURRENT_TASK] |
476 | shl edx,8 |
476 | shl edx,8 |
477 | cmp [PROC_BASE+APPDATA.heap_base+edx],0 |
477 | cmp [PROC_BASE+APPDATA.heap_base+edx],0 |
478 | jne .exit |
478 | jne .exit |
479 | 479 | ||
480 | mov esi, [PROC_BASE+APPDATA.mem_size+edx] |
480 | mov esi, [PROC_BASE+APPDATA.mem_size+edx] |
481 | add esi, 4095 |
481 | add esi, 4095 |
482 | and esi, not 4095 |
482 | and esi, not 4095 |
483 | 483 | ||
484 | cmp edi, esi |
484 | cmp edi, esi |
485 | jae .expand |
485 | jae .expand |
486 | 486 | ||
487 | shr edi, 12 |
487 | shr edi, 12 |
488 | shr esi, 12 |
488 | shr esi, 12 |
489 | @@: |
489 | @@: |
490 | mov eax, [pages_tab+0x00181000+edi*4] |
490 | mov eax, [page_tabs+0x00181000+edi*4] |
491 | test eax, 1 |
491 | test eax, 1 |
492 | jz .next |
492 | jz .next |
493 | mov dword [pages_tab+0x00181000+edi*4], 2 |
493 | mov dword [page_tabs+0x00181000+edi*4], 2 |
494 | mov ebx, edi |
494 | mov ebx, edi |
495 | shl ebx, 12 |
495 | shl ebx, 12 |
496 | invlpg [ebx+std_application_base_address] |
496 | invlpg [ebx+std_application_base_address] |
497 | call free_page |
497 | call free_page |
498 | 498 | ||
499 | .next: add edi, 1 |
499 | .next: add edi, 1 |
500 | cmp edi, esi |
500 | cmp edi, esi |
501 | jb @B |
501 | jb @B |
502 | 502 | ||
503 | .update_size: |
503 | .update_size: |
504 | mov ebx, [new_size] |
504 | mov ebx, [new_size] |
505 | call update_mem_size |
505 | call update_mem_size |
506 | 506 | ||
507 | xor eax, eax |
507 | xor eax, eax |
508 | dec [pg_data.pg_mutex] |
508 | dec [pg_data.pg_mutex] |
509 | ret |
509 | ret |
510 | 510 | ||
511 | .expand: |
511 | .expand: |
512 | add edi, new_app_base |
512 | add edi, new_app_base |
513 | add esi, new_app_base |
513 | add esi, new_app_base |
514 | 514 | ||
515 | push esi |
515 | push esi |
516 | push edi |
516 | push edi |
517 | 517 | ||
518 | add edi, 0x3FFFFF |
518 | add edi, 0x3FFFFF |
519 | and edi, not(0x3FFFFF) |
519 | and edi, not(0x3FFFFF) |
520 | add esi, 0x3FFFFF |
520 | add esi, 0x3FFFFF |
521 | and esi, not(0x3FFFFF) |
521 | and esi, not(0x3FFFFF) |
522 | 522 | ||
523 | cmp esi, edi |
523 | cmp esi, edi |
524 | jae .grow |
524 | jae .grow |
525 | 525 | ||
526 | xchg esi, edi |
526 | xchg esi, edi |
527 | 527 | ||
528 | @@: |
528 | @@: |
529 | call alloc_page |
529 | call alloc_page |
530 | test eax, eax |
530 | test eax, eax |
531 | jz .exit |
531 | jz .exit |
532 | 532 | ||
533 | stdcall map_page_table, edi, eax |
533 | stdcall map_page_table, edi, eax |
534 | 534 | ||
535 | push edi |
535 | push edi |
536 | shr edi, 10 |
536 | shr edi, 10 |
537 | add edi, pages_tab |
537 | add edi, page_tabs |
538 | mov ecx, 1024 |
538 | mov ecx, 1024 |
539 | xor eax, eax |
539 | xor eax, eax |
540 | cld |
540 | cld |
541 | rep stosd |
541 | rep stosd |
542 | pop edi |
542 | pop edi |
543 | 543 | ||
544 | add edi, 0x00400000 |
544 | add edi, 0x00400000 |
545 | cmp edi, esi |
545 | cmp edi, esi |
546 | jb @B |
546 | jb @B |
547 | .grow: |
547 | .grow: |
548 | pop edi |
548 | pop edi |
549 | pop esi |
549 | pop esi |
550 | @@: |
550 | @@: |
551 | call alloc_page |
551 | call alloc_page |
552 | test eax, eax |
552 | test eax, eax |
553 | jz .exit |
553 | jz .exit |
554 | stdcall map_page,esi,eax,dword PG_UW |
554 | stdcall map_page,esi,eax,dword PG_UW |
555 | 555 | ||
556 | push edi |
556 | push edi |
557 | mov edi, esi |
557 | mov edi, esi |
558 | xor eax, eax |
558 | xor eax, eax |
559 | mov ecx, 1024 |
559 | mov ecx, 1024 |
560 | cld |
560 | cld |
561 | rep stosd |
561 | rep stosd |
562 | pop edi |
562 | pop edi |
563 | 563 | ||
564 | add esi, 0x1000 |
564 | add esi, 0x1000 |
565 | cmp esi, edi |
565 | cmp esi, edi |
566 | jb @B |
566 | jb @B |
567 | 567 | ||
568 | jmp .update_size |
568 | jmp .update_size |
569 | .exit: |
569 | .exit: |
570 | xor eax, eax |
570 | xor eax, eax |
571 | inc eax |
571 | inc eax |
572 | dec [pg_data.pg_mutex] |
572 | dec [pg_data.pg_mutex] |
573 | ret |
573 | ret |
574 | endp |
574 | endp |
575 | 575 | ||
576 | update_mem_size: |
576 | update_mem_size: |
577 | ; in: edx = slot shl 8 |
577 | ; in: edx = slot shl 8 |
578 | ; ebx = new memory size |
578 | ; ebx = new memory size |
579 | ; destroys eax,ecx,edx |
579 | ; destroys eax,ecx,edx |
580 | 580 | ||
581 | mov [PROC_BASE+APPDATA.mem_size+edx],ebx |
581 | mov [PROC_BASE+APPDATA.mem_size+edx],ebx |
582 | ;search threads and update |
582 | ;search threads and update |
583 | ;application memory size infomation |
583 | ;application memory size infomation |
584 | mov ecx,[PROC_BASE+APPDATA.dir_table+edx] |
584 | mov ecx,[PROC_BASE+APPDATA.dir_table+edx] |
585 | mov eax,2 |
585 | mov eax,2 |
586 | 586 | ||
587 | .search_threads: |
587 | .search_threads: |
588 | ;eax = current slot |
588 | ;eax = current slot |
589 | ;ebx = new memory size |
589 | ;ebx = new memory size |
590 | ;ecx = page directory |
590 | ;ecx = page directory |
591 | cmp eax,[TASK_COUNT] |
591 | cmp eax,[TASK_COUNT] |
592 | jg .search_threads_end |
592 | jg .search_threads_end |
593 | mov edx,eax |
593 | mov edx,eax |
594 | shl edx,5 |
594 | shl edx,5 |
595 | cmp word [CURRENT_TASK+edx+TASKDATA.state],9 ;if slot empty? |
595 | cmp word [CURRENT_TASK+edx+TASKDATA.state],9 ;if slot empty? |
596 | jz .search_threads_next |
596 | jz .search_threads_next |
597 | shl edx,3 |
597 | shl edx,3 |
598 | cmp [PROC_BASE+edx+APPDATA.dir_table],ecx ;if it is our thread? |
598 | cmp [PROC_BASE+edx+APPDATA.dir_table],ecx ;if it is our thread? |
599 | jnz .search_threads_next |
599 | jnz .search_threads_next |
600 | mov [PROC_BASE+edx+APPDATA.mem_size],ebx ;update memory size |
600 | mov [PROC_BASE+edx+APPDATA.mem_size],ebx ;update memory size |
601 | .search_threads_next: |
601 | .search_threads_next: |
602 | inc eax |
602 | inc eax |
603 | jmp .search_threads |
603 | jmp .search_threads |
604 | .search_threads_end: |
604 | .search_threads_end: |
605 | ret |
605 | ret |
606 | 606 | ||
607 | ; param |
607 | ; param |
608 | ; eax= linear address |
608 | ; eax= linear address |
609 | ; |
609 | ; |
610 | ; retval |
610 | ; retval |
611 | ; eax= phisical page address |
611 | ; eax= phisical page address |
612 | 612 | ||
613 | align 4 |
613 | align 4 |
614 | get_pg_addr: |
614 | get_pg_addr: |
615 | shr eax, 12 |
615 | shr eax, 12 |
616 | mov eax, [pages_tab+eax*4] |
616 | mov eax, [page_tabs+eax*4] |
617 | and eax, 0xFFFFF000 |
617 | and eax, 0xFFFFF000 |
618 | ret |
618 | ret |
619 | 619 | ||
620 | align 4 |
620 | align 4 |
621 | proc page_fault_handler |
621 | proc page_fault_handler |
622 | pushad |
622 | pushad |
623 | 623 | ||
624 | mov ebp, esp |
624 | mov ebp, esp |
625 | mov eax, cr2 |
625 | mov eax, cr2 |
626 | push eax |
626 | push eax |
627 | push ds |
627 | push ds |
628 | push es |
628 | push es |
629 | 629 | ||
630 | mov ax, 0x10 |
630 | mov ax, 0x10 |
631 | mov ds, ax |
631 | mov ds, ax |
632 | mov es, ax |
632 | mov es, ax |
633 | 633 | ||
634 | inc [pg_data.pages_faults] |
634 | inc [pg_data.pages_faults] |
635 | 635 | ||
636 | mov ebx, [ebp-4] |
636 | mov ebx, [ebp-4] |
637 | 637 | ||
638 | cmp ebx, 0xe0000000 |
638 | cmp ebx, 0xe0000000 |
639 | jae .lfb_addr |
639 | jae .lfb_addr |
640 | 640 | ||
641 | cmp ebx, 0x60400000 |
641 | cmp ebx, 0x60400000 |
642 | jae .user_space |
642 | jae .user_space |
643 | 643 | ||
644 | cmp ebx, master_tab+0x1000 |
644 | cmp ebx, master_tab+0x1000 |
645 | jae .alloc |
645 | jae .alloc |
646 | 646 | ||
647 | cmp ebx, 0x60000000 |
647 | cmp ebx, 0x60000000 |
648 | jae .tab_space |
648 | jae .tab_space |
649 | 649 | ||
650 | jmp .kernel_space |
650 | jmp .kernel_space |
651 | 651 | ||
652 | .user_space: |
652 | .user_space: |
653 | shr ebx, 12 |
653 | shr ebx, 12 |
654 | mov ecx, ebx |
654 | mov ecx, ebx |
655 | shr ecx, 10 |
655 | shr ecx, 10 |
656 | mov edx, [master_tab+ecx*4] |
656 | mov edx, [master_tab+ecx*4] |
657 | test edx, 1 |
657 | test edx, 1 |
658 | jz .fail |
658 | jz .fail |
659 | 659 | ||
660 | mov eax, [pages_tab+ebx*4] |
660 | mov eax, [page_tabs+ebx*4] |
661 | test eax, 2 |
661 | test eax, 2 |
662 | jz .fail |
662 | jz .fail |
663 | .alloc: |
663 | .alloc: |
664 | call alloc_page |
664 | call alloc_page |
665 | and eax, eax |
665 | and eax, eax |
666 | jz .exit |
666 | jz .exit |
667 | 667 | ||
668 | stdcall map_page,[ebp-4],eax,dword PG_UW |
668 | stdcall map_page,[ebp-4],eax,dword PG_UW |
669 | 669 | ||
670 | mov edi, [ebp-4] |
670 | mov edi, [ebp-4] |
671 | and edi, 0xFFFFF000 |
671 | and edi, 0xFFFFF000 |
672 | mov ecx, 1024 |
672 | mov ecx, 1024 |
673 | xor eax, eax |
673 | xor eax, eax |
674 | cld |
674 | cld |
675 | rep stosd |
675 | rep stosd |
676 | .exit: |
676 | .exit: |
677 | pop es |
677 | pop es |
678 | pop ds |
678 | pop ds |
679 | mov esp, ebp |
679 | mov esp, ebp |
680 | popad |
680 | popad |
681 | add esp, 4 |
681 | add esp, 4 |
682 | iretd |
682 | iretd |
683 | .fail: |
683 | .fail: |
684 | pop es |
684 | pop es |
685 | pop ds |
685 | pop ds |
686 | mov esp, ebp |
686 | mov esp, ebp |
687 | popad |
687 | popad |
688 | add esp, 4 |
688 | add esp, 4 |
689 | 689 | ||
690 | save_ring3_context ;debugger support |
690 | save_ring3_context ;debugger support |
691 | 691 | ||
692 | mov bl, 14 |
692 | mov bl, 14 |
693 | jmp exc_c |
693 | jmp exc_c |
694 | iretd |
694 | iretd |
695 | 695 | ||
696 | .kernel_space: |
696 | .kernel_space: |
697 | ; shr ebx, 12 |
697 | ; shr ebx, 12 |
698 | ; mov eax, [pages_tab+ebx*4] |
698 | ; mov eax, [page_tabs+ebx*4] |
699 | ; shr ebx, 10 |
699 | ; shr ebx, 10 |
700 | ; mov eax, [master_tab+ebx*4] |
700 | ; mov eax, [master_tab+ebx*4] |
701 | jmp .exit |
701 | jmp .exit |
702 | .old_addr: |
702 | .old_addr: |
703 | ; shr ebx, 12 |
703 | ; shr ebx, 12 |
704 | ; mov eax, [pages_tab+ebx*4] |
704 | ; mov eax, [page_tabs+ebx*4] |
705 | ; shr ebx, 10 |
705 | ; shr ebx, 10 |
706 | ; mov eax, [master_tab+ebx*4] |
706 | ; mov eax, [master_tab+ebx*4] |
707 | jmp .exit |
707 | jmp .exit |
708 | .lfb_addr: |
708 | .lfb_addr: |
709 | ; shr ebx, 22 |
709 | ; shr ebx, 22 |
710 | ; ;mov ecx, [sys_page_dir] |
710 | ; ;mov ecx, [sys_page_dir] |
711 | ; mov eax, [master_tab+ebx*4] |
711 | ; mov eax, [master_tab+ebx*4] |
712 | jmp .exit |
712 | jmp .exit |
713 | .tab_space: |
713 | .tab_space: |
714 | ; shr ebx, 12 |
714 | ; shr ebx, 12 |
715 | ; mov eax, [pages_tab+ebx*4] |
715 | ; mov eax, [page_tabs+ebx*4] |
716 | ; shr ebx, 10 |
716 | ; shr ebx, 10 |
717 | ; ;mov ecx, [sys_page_dir] |
717 | ; ;mov ecx, [sys_page_dir] |
718 | ; mov eax, [master_tab+ebx*4] |
718 | ; mov eax, [master_tab+ebx*4] |
719 | jmp .exit |
719 | jmp .exit |
720 | endp |
720 | endp |
721 | 721 | ||
722 | align 4 |
722 | align 4 |
723 | proc map_mem stdcall, lin_addr:dword,pdir:dword,\ |
723 | proc map_mem stdcall, lin_addr:dword,pdir:dword,\ |
724 | ofs:dword,buf_size:dword |
724 | ofs:dword,buf_size:dword |
725 | mov eax, [buf_size] |
725 | mov eax, [buf_size] |
726 | test eax, eax |
726 | test eax, eax |
727 | jz .exit |
727 | jz .exit |
728 | 728 | ||
729 | mov eax, [pdir] |
729 | mov eax, [pdir] |
730 | and eax, 0xFFFFF000 |
730 | and eax, 0xFFFFF000 |
731 | 731 | ||
732 | stdcall map_page,[ipc_pdir],eax,dword PG_UW |
732 | stdcall map_page,[ipc_pdir],eax,dword PG_UW |
733 | mov ebx, [ofs] |
733 | mov ebx, [ofs] |
734 | shr ebx, 22 |
734 | shr ebx, 22 |
735 | mov esi, [ipc_pdir] |
735 | mov esi, [ipc_pdir] |
736 | mov edi, [ipc_ptab] |
736 | mov edi, [ipc_ptab] |
737 | mov eax, [esi+ebx*4] |
737 | mov eax, [esi+ebx*4] |
738 | and eax, 0xFFFFF000 |
738 | and eax, 0xFFFFF000 |
739 | test eax, eax |
739 | test eax, eax |
740 | jz .exit |
740 | jz .exit |
741 | stdcall map_page,edi,eax,dword PG_UW |
741 | stdcall map_page,edi,eax,dword PG_UW |
742 | ; inc ebx |
742 | ; inc ebx |
743 | ; add edi, 0x1000 |
743 | ; add edi, 0x1000 |
744 | ; mov eax, [esi+ebx*4] |
744 | ; mov eax, [esi+ebx*4] |
745 | ; test eax, eax |
745 | ; test eax, eax |
746 | ; jz @f |
746 | ; jz @f |
747 | ; and eax, 0xFFFFF000 |
747 | ; and eax, 0xFFFFF000 |
748 | ; stdcall map_page, edi, eax |
748 | ; stdcall map_page, edi, eax |
749 | 749 | ||
750 | @@: mov edi, [lin_addr] |
750 | @@: mov edi, [lin_addr] |
751 | and edi, 0xFFFFF000 |
751 | and edi, 0xFFFFF000 |
752 | mov ecx, [buf_size] |
752 | mov ecx, [buf_size] |
753 | add ecx, 4095 |
753 | add ecx, 4095 |
754 | shr ecx, 12 |
754 | shr ecx, 12 |
755 | inc ecx |
755 | inc ecx |
756 | 756 | ||
757 | mov edx, [ofs] |
757 | mov edx, [ofs] |
758 | shr edx, 12 |
758 | shr edx, 12 |
759 | and edx, 0x3FF |
759 | and edx, 0x3FF |
760 | mov esi, [ipc_ptab] |
760 | mov esi, [ipc_ptab] |
761 | 761 | ||
762 | .map: mov eax, [esi+edx*4] |
762 | .map: mov eax, [esi+edx*4] |
763 | and eax, 0xFFFFF000 |
763 | and eax, 0xFFFFF000 |
764 | test eax, eax |
764 | test eax, eax |
765 | jz .exit |
765 | jz .exit |
766 | stdcall map_page,edi,eax,dword PG_UW |
766 | stdcall map_page,edi,eax,dword PG_UW |
767 | add edi, 0x1000 |
767 | add edi, 0x1000 |
768 | inc edx |
768 | inc edx |
769 | dec ecx |
769 | dec ecx |
770 | jnz .map |
770 | jnz .map |
771 | 771 | ||
772 | .exit: |
772 | .exit: |
773 | ret |
773 | ret |
774 | endp |
774 | endp |
775 | 775 | ||
776 | align 4 |
776 | align 4 |
777 | proc map_memEx stdcall, lin_addr:dword,pdir:dword,\ |
777 | proc map_memEx stdcall, lin_addr:dword,pdir:dword,\ |
778 | ofs:dword,buf_size:dword |
778 | ofs:dword,buf_size:dword |
779 | mov eax, [buf_size] |
779 | mov eax, [buf_size] |
780 | test eax, eax |
780 | test eax, eax |
781 | jz .exit |
781 | jz .exit |
782 | 782 | ||
783 | mov eax, [pdir] |
783 | mov eax, [pdir] |
784 | and eax, 0xFFFFF000 |
784 | and eax, 0xFFFFF000 |
785 | 785 | ||
786 | stdcall map_page,[proc_mem_pdir],eax,dword PG_UW |
786 | stdcall map_page,[proc_mem_pdir],eax,dword PG_UW |
787 | mov ebx, [ofs] |
787 | mov ebx, [ofs] |
788 | shr ebx, 22 |
788 | shr ebx, 22 |
789 | mov esi, [proc_mem_pdir] |
789 | mov esi, [proc_mem_pdir] |
790 | mov edi, [proc_mem_tab] |
790 | mov edi, [proc_mem_tab] |
791 | mov eax, [esi+ebx*4] |
791 | mov eax, [esi+ebx*4] |
792 | and eax, 0xFFFFF000 |
792 | and eax, 0xFFFFF000 |
793 | test eax, eax |
793 | test eax, eax |
794 | jz .exit |
794 | jz .exit |
795 | stdcall map_page,edi,eax,dword PG_UW |
795 | stdcall map_page,edi,eax,dword PG_UW |
796 | 796 | ||
797 | @@: mov edi, [lin_addr] |
797 | @@: mov edi, [lin_addr] |
798 | and edi, 0xFFFFF000 |
798 | and edi, 0xFFFFF000 |
799 | mov ecx, [buf_size] |
799 | mov ecx, [buf_size] |
800 | add ecx, 4095 |
800 | add ecx, 4095 |
801 | shr ecx, 12 |
801 | shr ecx, 12 |
802 | inc ecx |
802 | inc ecx |
803 | 803 | ||
804 | mov edx, [ofs] |
804 | mov edx, [ofs] |
805 | shr edx, 12 |
805 | shr edx, 12 |
806 | and edx, 0x3FF |
806 | and edx, 0x3FF |
807 | mov esi, [proc_mem_tab] |
807 | mov esi, [proc_mem_tab] |
808 | 808 | ||
809 | .map: mov eax, [esi+edx*4] |
809 | .map: mov eax, [esi+edx*4] |
810 | ; and eax, 0xFFFFF000 |
810 | ; and eax, 0xFFFFF000 |
811 | ; test eax, eax |
811 | ; test eax, eax |
812 | ; jz .exit |
812 | ; jz .exit |
813 | stdcall map_page,edi,eax,dword PG_UW |
813 | stdcall map_page,edi,eax,dword PG_UW |
814 | add edi, 0x1000 |
814 | add edi, 0x1000 |
815 | inc edx |
815 | inc edx |
816 | dec ecx |
816 | dec ecx |
817 | jnz .map |
817 | jnz .map |
818 | .exit: |
818 | .exit: |
819 | ret |
819 | ret |
820 | endp |
820 | endp |
821 | 821 | ||
822 | 822 | ||
823 | 823 | ||
824 | 824 | ||
825 | sys_IPC: |
825 | sys_IPC: |
826 | ;input: |
826 | ;input: |
827 | ; eax=1 - set ipc buffer area |
827 | ; eax=1 - set ipc buffer area |
828 | ; ebx=address of buffer |
828 | ; ebx=address of buffer |
829 | ; ecx=size of buffer |
829 | ; ecx=size of buffer |
830 | ; eax=2 - send message |
830 | ; eax=2 - send message |
831 | ; ebx=PID |
831 | ; ebx=PID |
832 | ; ecx=address of message |
832 | ; ecx=address of message |
833 | ; edx=size of message |
833 | ; edx=size of message |
834 | 834 | ||
835 | cmp eax,1 |
835 | cmp eax,1 |
836 | jne @f |
836 | jne @f |
837 | call set_ipc_buff |
837 | call set_ipc_buff |
838 | mov [esp+36], eax |
838 | mov [esp+36], eax |
839 | ret |
839 | ret |
840 | @@: |
840 | @@: |
841 | cmp eax, 2 |
841 | cmp eax, 2 |
842 | jne @f |
842 | jne @f |
843 | stdcall sys_ipc_send, ebx, ecx, edx |
843 | stdcall sys_ipc_send, ebx, ecx, edx |
844 | mov [esp+36], eax |
844 | mov [esp+36], eax |
845 | ret |
845 | ret |
846 | @@: |
846 | @@: |
847 | xor eax, eax |
847 | xor eax, eax |
848 | not eax |
848 | not eax |
849 | mov [esp+36], eax |
849 | mov [esp+36], eax |
850 | ret |
850 | ret |
851 | 851 | ||
852 | align 4 |
852 | align 4 |
853 | proc set_ipc_buff |
853 | proc set_ipc_buff |
854 | 854 | ||
855 | mov eax,[CURRENT_TASK] |
855 | mov eax,[CURRENT_TASK] |
856 | shl eax,8 |
856 | shl eax,8 |
857 | add eax, PROC_BASE |
857 | add eax, PROC_BASE |
858 | pushf |
858 | pushf |
859 | cli |
859 | cli |
860 | mov [eax+0xA0],ebx ;set fields in extended information area |
860 | mov [eax+0xA0],ebx ;set fields in extended information area |
861 | mov [eax+0xA4],ecx |
861 | mov [eax+0xA4],ecx |
862 | 862 | ||
863 | add ebx, new_app_base |
863 | add ebx, new_app_base |
864 | add ecx, ebx |
864 | add ecx, ebx |
865 | add ecx, 4095 |
865 | add ecx, 4095 |
866 | and ecx, not 4095 |
866 | and ecx, not 4095 |
867 | 867 | ||
868 | .touch: mov eax, [ebx] |
868 | .touch: mov eax, [ebx] |
869 | add ebx, 0x1000 |
869 | add ebx, 0x1000 |
870 | cmp ebx, ecx |
870 | cmp ebx, ecx |
871 | jna .touch |
871 | jna .touch |
872 | 872 | ||
873 | popf |
873 | popf |
874 | xor eax, eax |
874 | xor eax, eax |
875 | ret |
875 | ret |
876 | endp |
876 | endp |
877 | 877 | ||
878 | proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword |
878 | proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword |
879 | locals |
879 | locals |
880 | dst_slot dd ? |
880 | dst_slot dd ? |
881 | dst_offset dd ? |
881 | dst_offset dd ? |
882 | buf_size dd ? |
882 | buf_size dd ? |
883 | endl |
883 | endl |
884 | 884 | ||
885 | pushf |
885 | pushf |
886 | cli |
886 | cli |
887 | 887 | ||
888 | mov eax, [PID] |
888 | mov eax, [PID] |
889 | call pid_to_slot |
889 | call pid_to_slot |
890 | test eax,eax |
890 | test eax,eax |
891 | jz .no_pid |
891 | jz .no_pid |
892 | 892 | ||
893 | mov [dst_slot], eax |
893 | mov [dst_slot], eax |
894 | shl eax,8 |
894 | shl eax,8 |
895 | mov edi,[eax+PROC_BASE+0xa0] ;is ipc area defined? |
895 | mov edi,[eax+PROC_BASE+0xa0] ;is ipc area defined? |
896 | test edi,edi |
896 | test edi,edi |
897 | jz .no_ipc_area |
897 | jz .no_ipc_area |
898 | 898 | ||
899 | mov ebx, edi |
899 | mov ebx, edi |
900 | add edi, new_app_base |
900 | add edi, new_app_base |
901 | and ebx, 0xFFF |
901 | and ebx, 0xFFF |
902 | mov [dst_offset], ebx |
902 | mov [dst_offset], ebx |
903 | 903 | ||
904 | mov esi, [eax+PROC_BASE+0xa4] |
904 | mov esi, [eax+PROC_BASE+0xa4] |
905 | mov [buf_size], esi |
905 | mov [buf_size], esi |
906 | 906 | ||
907 | stdcall map_mem, [ipc_tmp], [PROC_BASE+eax+0xB8],\ |
907 | stdcall map_mem, [ipc_tmp], [PROC_BASE+eax+0xB8],\ |
908 | edi, esi |
908 | edi, esi |
909 | 909 | ||
910 | mov edi, [dst_offset] |
910 | mov edi, [dst_offset] |
911 | add edi, [ipc_tmp] |
911 | add edi, [ipc_tmp] |
912 | cmp dword [edi], 0 |
912 | cmp dword [edi], 0 |
913 | jnz .ipc_blocked ;if dword [buffer]<>0 - ipc blocked now |
913 | jnz .ipc_blocked ;if dword [buffer]<>0 - ipc blocked now |
914 | 914 | ||
915 | mov ebx, dword [edi+4] |
915 | mov ebx, dword [edi+4] |
916 | mov edx, ebx |
916 | mov edx, ebx |
917 | add ebx, 8 |
917 | add ebx, 8 |
918 | add ebx, [msg_size] |
918 | add ebx, [msg_size] |
919 | cmp ebx, [buf_size] |
919 | cmp ebx, [buf_size] |
920 | ja .buffer_overflow ;esi<0 - not enough memory in buffer |
920 | ja .buffer_overflow ;esi<0 - not enough memory in buffer |
921 | 921 | ||
922 | mov dword [edi+4], ebx |
922 | mov dword [edi+4], ebx |
923 | mov eax,[TASK_BASE] |
923 | mov eax,[TASK_BASE] |
924 | mov eax, [eax+0x04] ;eax - our PID |
924 | mov eax, [eax+0x04] ;eax - our PID |
925 | mov edi, [dst_offset] |
925 | mov edi, [dst_offset] |
926 | add edi, [ipc_tmp] |
926 | add edi, [ipc_tmp] |
927 | add edi, edx |
927 | add edi, edx |
928 | mov [edi], eax |
928 | mov [edi], eax |
929 | mov ecx, [msg_size] |
929 | mov ecx, [msg_size] |
930 | 930 | ||
931 | mov [edi+4], ecx |
931 | mov [edi+4], ecx |
932 | add edi, 8 |
932 | add edi, 8 |
933 | mov esi, [msg_addr] |
933 | mov esi, [msg_addr] |
934 | add esi, new_app_base |
934 | add esi, new_app_base |
935 | cld |
935 | cld |
936 | rep movsb |
936 | rep movsb |
937 | 937 | ||
938 | mov ebx, [ipc_tmp] |
938 | mov ebx, [ipc_tmp] |
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 [pages_tab+ebx*4], eax |
942 | mov [page_tabs+ebx*4], eax |
943 | invlpg [edx] |
943 | invlpg [edx] |
944 | 944 | ||
945 | mov ebx, [ipc_pdir] |
945 | mov ebx, [ipc_pdir] |
946 | mov edx, ebx |
946 | mov edx, ebx |
947 | shr ebx, 12 |
947 | shr ebx, 12 |
948 | xor eax, eax |
948 | xor eax, eax |
949 | mov [pages_tab+ebx*4], eax |
949 | mov [page_tabs+ebx*4], eax |
950 | invlpg [edx] |
950 | invlpg [edx] |
951 | 951 | ||
952 | mov ebx, [ipc_ptab] |
952 | mov ebx, [ipc_ptab] |
953 | mov edx, ebx |
953 | mov edx, ebx |
954 | shr ebx, 12 |
954 | shr ebx, 12 |
955 | xor eax, eax |
955 | xor eax, eax |
956 | mov [pages_tab+ebx*4], eax |
956 | mov [page_tabs+ebx*4], eax |
957 | invlpg [edx] |
957 | invlpg [edx] |
958 | 958 | ||
959 | mov eax, [dst_slot] |
959 | mov eax, [dst_slot] |
960 | shl eax, 8 |
960 | shl eax, 8 |
961 | or [eax+PROC_BASE+0xA8],dword 0x40 |
961 | or [eax+PROC_BASE+0xA8],dword 0x40 |
962 | cmp dword [check_idle_semaphore],20 |
962 | cmp dword [check_idle_semaphore],20 |
963 | jge .ipc_no_cis |
963 | jge .ipc_no_cis |
964 | 964 | ||
965 | mov dword [check_idle_semaphore],5 |
965 | mov dword [check_idle_semaphore],5 |
966 | .ipc_no_cis: |
966 | .ipc_no_cis: |
967 | popf |
967 | popf |
968 | xor eax, eax |
968 | xor eax, eax |
969 | ret |
969 | ret |
970 | .no_pid: |
970 | .no_pid: |
971 | popf |
971 | popf |
972 | mov eax, 4 |
972 | mov eax, 4 |
973 | ret |
973 | ret |
974 | .no_ipc_area: |
974 | .no_ipc_area: |
975 | popf |
975 | popf |
976 | xor eax, eax |
976 | xor eax, eax |
977 | inc eax |
977 | inc eax |
978 | ret |
978 | ret |
979 | .ipc_blocked: |
979 | .ipc_blocked: |
980 | popf |
980 | popf |
981 | mov eax, 2 |
981 | mov eax, 2 |
982 | ret |
982 | ret |
983 | .buffer_overflow: |
983 | .buffer_overflow: |
984 | popf |
984 | popf |
985 | mov eax, 3 |
985 | mov eax, 3 |
986 | ret |
986 | ret |
987 | endp |
987 | endp |
988 | 988 | ||
989 | align 4 |
989 | align 4 |
990 | sysfn_meminfo: |
990 | sysfn_meminfo: |
991 | 991 | ||
992 | add ebx, new_app_base |
992 | add ebx, new_app_base |
993 | cmp ebx, new_app_base |
993 | cmp ebx, new_app_base |
994 | jb .fail |
994 | jb .fail |
995 | 995 | ||
996 | mov eax, [pg_data.pages_count] |
996 | mov eax, [pg_data.pages_count] |
997 | mov [ebx], eax |
997 | mov [ebx], eax |
998 | shl eax, 12 |
998 | shl eax, 12 |
999 | mov [esp+36], eax |
999 | mov [esp+36], eax |
1000 | mov ecx, [pg_data.pages_free] |
1000 | mov ecx, [pg_data.pages_free] |
1001 | mov [ebx+4], ecx |
1001 | mov [ebx+4], ecx |
1002 | mov edx, [pg_data.pages_faults] |
1002 | mov edx, [pg_data.pages_faults] |
1003 | mov [ebx+8], edx |
1003 | mov [ebx+8], edx |
1004 | mov esi, [heap_size] |
1004 | mov esi, [heap_size] |
1005 | mov [ebx+12], esi |
1005 | mov [ebx+12], esi |
1006 | mov edi, [heap_free] |
1006 | mov edi, [heap_free] |
1007 | mov [ebx+16], edi |
1007 | mov [ebx+16], edi |
1008 | mov eax, [heap_blocks] |
1008 | mov eax, [heap_blocks] |
1009 | mov [ebx+20], eax |
1009 | mov [ebx+20], eax |
1010 | mov ecx, [free_blocks] |
1010 | mov ecx, [free_blocks] |
1011 | mov [ebx+24], ecx |
1011 | mov [ebx+24], ecx |
1012 | ret |
1012 | ret |
1013 | .fail: |
1013 | .fail: |
1014 | mov dword [esp+36], -1 |
1014 | mov dword [esp+36], -1 |
1015 | ret |
1015 | ret |
1016 | 1016 | ||
1017 | align 4 |
1017 | align 4 |
1018 | new_services: |
1018 | new_services: |
1019 | 1019 | ||
1020 | cmp eax,4 |
1020 | cmp eax,4 |
1021 | jle sys_sheduler |
1021 | jle sys_sheduler |
1022 | 1022 | ||
1023 | cmp eax, 11 |
1023 | cmp eax, 11 |
1024 | jb .fail |
1024 | jb .fail |
1025 | ja @f |
1025 | ja @f |
1026 | 1026 | ||
1027 | call init_heap |
1027 | call init_heap |
1028 | mov [esp+36], eax |
1028 | mov [esp+36], eax |
1029 | ret |
1029 | ret |
1030 | @@: |
1030 | @@: |
1031 | cmp eax, 12 |
1031 | cmp eax, 12 |
1032 | ja @f |
1032 | ja @f |
1033 | 1033 | ||
1034 | stdcall user_alloc, ebx |
1034 | stdcall user_alloc, ebx |
1035 | mov [esp+36], eax |
1035 | mov [esp+36], eax |
1036 | ret |
1036 | ret |
1037 | @@: |
1037 | @@: |
1038 | cmp eax, 13 |
1038 | cmp eax, 13 |
1039 | ja @f |
1039 | ja @f |
1040 | add ebx, new_app_base |
1040 | add ebx, new_app_base |
1041 | stdcall user_free, ebx |
1041 | stdcall user_free, ebx |
1042 | mov [esp+36], eax |
1042 | mov [esp+36], eax |
1043 | ret |
1043 | ret |
1044 | @@: |
1044 | @@: |
1045 | cmp eax, 14 |
1045 | cmp eax, 14 |
1046 | ja @f |
1046 | ja @f |
1047 | add ebx, new_app_base |
1047 | add ebx, new_app_base |
1048 | cmp ebx, new_app_base |
1048 | cmp ebx, new_app_base |
1049 | jb .fail |
1049 | jb .fail |
1050 | stdcall get_event_ex, ebx, ecx |
1050 | stdcall get_event_ex, ebx, ecx |
1051 | mov [esp+36], eax |
1051 | mov [esp+36], eax |
1052 | ret |
1052 | ret |
1053 | @@: |
1053 | @@: |
1054 | cmp eax, 15 |
1054 | cmp eax, 15 |
1055 | ja @f |
1055 | ja @f |
1056 | mov ecx, [CURRENT_TASK] |
1056 | mov ecx, [CURRENT_TASK] |
1057 | shl ecx, 8 |
1057 | shl ecx, 8 |
1058 | mov eax, [ecx+PROC_BASE+APPDATA.fpu_handler] |
1058 | mov eax, [ecx+PROC_BASE+APPDATA.fpu_handler] |
1059 | mov [ecx+PROC_BASE+APPDATA.fpu_handler], ebx |
1059 | mov [ecx+PROC_BASE+APPDATA.fpu_handler], ebx |
1060 | mov [esp+36], eax |
1060 | mov [esp+36], eax |
1061 | ret |
1061 | ret |
1062 | @@: |
1062 | @@: |
1063 | cmp eax, 16 |
1063 | cmp eax, 16 |
1064 | ja @f |
1064 | ja @f |
1065 | 1065 | ||
1066 | test ebx, ebx |
1066 | test ebx, ebx |
1067 | jz .fail |
1067 | jz .fail |
1068 | add ebx, new_app_base |
1068 | add ebx, new_app_base |
1069 | cmp ebx, new_app_base |
1069 | cmp ebx, new_app_base |
1070 | jb .fail |
1070 | jb .fail |
1071 | stdcall get_service, ebx |
1071 | stdcall get_service, ebx |
1072 | mov [esp+36], eax |
1072 | mov [esp+36], eax |
1073 | ret |
1073 | ret |
1074 | @@: |
1074 | @@: |
1075 | cmp eax, 17 |
1075 | cmp eax, 17 |
1076 | ja @f |
1076 | ja @f |
1077 | stdcall srv_handlerEx, ebx |
1077 | stdcall srv_handlerEx, ebx |
1078 | mov [esp+36], eax |
1078 | mov [esp+36], eax |
1079 | ret |
1079 | ret |
1080 | @@: |
1080 | @@: |
1081 | cmp eax, 18 |
1081 | cmp eax, 18 |
1082 | ja @f |
1082 | ja @f |
1083 | mov ecx, [CURRENT_TASK] |
1083 | mov ecx, [CURRENT_TASK] |
1084 | shl ecx, 8 |
1084 | shl ecx, 8 |
1085 | mov eax, [ecx+PROC_BASE+APPDATA.sse_handler] |
1085 | mov eax, [ecx+PROC_BASE+APPDATA.sse_handler] |
1086 | mov [ecx+PROC_BASE+APPDATA.sse_handler], ebx |
1086 | mov [ecx+PROC_BASE+APPDATA.sse_handler], ebx |
1087 | mov [esp+36], eax |
1087 | mov [esp+36], eax |
1088 | ret |
1088 | ret |
1089 | @@: |
1089 | @@: |
1090 | cmp eax, 19 |
1090 | cmp eax, 19 |
1091 | ja .fail |
1091 | ja .fail |
1092 | add ebx, new_app_base |
1092 | add ebx, new_app_base |
1093 | cmp ebx, new_app_base |
1093 | cmp ebx, new_app_base |
1094 | jb .fail |
1094 | jb .fail |
1095 | stdcall load_library, ebx |
1095 | stdcall load_library, ebx |
1096 | mov [esp+36], eax |
1096 | mov [esp+36], eax |
1097 | ret |
1097 | ret |
1098 | 1098 | ||
1099 | .fail: |
1099 | .fail: |
1100 | xor eax, eax |
1100 | xor eax, eax |
1101 | mov [esp+36], eax |
1101 | mov [esp+36], eax |
1102 | ret |
1102 | ret |
1103 | 1103 | ||
1104 | align 4 |
1104 | align 4 |
1105 | proc strncmp stdcall, str1:dword, str2:dword, count:dword |
1105 | proc strncmp stdcall, str1:dword, str2:dword, count:dword |
1106 | 1106 | ||
1107 | mov ecx,[count] |
1107 | mov ecx,[count] |
1108 | jecxz .end |
1108 | jecxz .end |
1109 | 1109 | ||
1110 | mov ebx,ecx |
1110 | mov ebx,ecx |
1111 | 1111 | ||
1112 | mov edi,[str1] |
1112 | mov edi,[str1] |
1113 | mov esi,edi |
1113 | mov esi,edi |
1114 | xor eax,eax |
1114 | xor eax,eax |
1115 | repne scasb |
1115 | repne scasb |
1116 | neg ecx ; cx = count - strlen |
1116 | neg ecx ; cx = count - strlen |
1117 | add ecx,ebx ; strlen + count - strlen |
1117 | add ecx,ebx ; strlen + count - strlen |
1118 | 1118 | ||
1119 | .okay: |
1119 | .okay: |
1120 | mov edi,esi |
1120 | mov edi,esi |
1121 | mov esi,[str2] |
1121 | mov esi,[str2] |
1122 | repe cmpsb |
1122 | repe cmpsb |
1123 | mov al,[esi-1] |
1123 | mov al,[esi-1] |
1124 | xor ecx,ecx |
1124 | xor ecx,ecx |
1125 | 1125 | ||
1126 | cmp al,[edi-1] |
1126 | cmp al,[edi-1] |
1127 | ja .str2_big |
1127 | ja .str2_big |
1128 | je .end |
1128 | je .end |
1129 | 1129 | ||
1130 | .str1_big: |
1130 | .str1_big: |
1131 | sub ecx,2 |
1131 | sub ecx,2 |
1132 | 1132 | ||
1133 | .str2_big: |
1133 | .str2_big: |
1134 | not ecx |
1134 | not ecx |
1135 | .end: |
1135 | .end: |
1136 | mov eax,ecx |
1136 | mov eax,ecx |
1137 | ret |
1137 | ret |
1138 | endp |
1138 | endp |
1139 | 1139 | ||
1140 | align 4 |
1140 | align 4 |
1141 | proc test_cpu |
1141 | proc test_cpu |
1142 | locals |
1142 | locals |
1143 | cpu_type dd ? |
1143 | cpu_type dd ? |
1144 | cpu_id dd ? |
1144 | cpu_id dd ? |
1145 | cpu_Intel dd ? |
1145 | cpu_Intel dd ? |
1146 | cpu_AMD dd ? |
1146 | cpu_AMD dd ? |
1147 | endl |
1147 | endl |
1148 | 1148 | ||
1149 | mov [cpu_type], 0 |
1149 | mov [cpu_type], 0 |
1150 | xor eax, eax |
1150 | xor eax, eax |
1151 | mov [cpu_caps], eax |
1151 | mov [cpu_caps], eax |
1152 | mov [cpu_caps+4], eax |
1152 | mov [cpu_caps+4], eax |
1153 | 1153 | ||
1154 | pushfd |
1154 | pushfd |
1155 | pop eax |
1155 | pop eax |
1156 | mov ecx, eax |
1156 | mov ecx, eax |
1157 | xor eax, 0x40000 |
1157 | xor eax, 0x40000 |
1158 | push eax |
1158 | push eax |
1159 | popfd |
1159 | popfd |
1160 | pushfd |
1160 | pushfd |
1161 | pop eax |
1161 | pop eax |
1162 | xor eax, ecx |
1162 | xor eax, ecx |
1163 | mov [cpu_type], CPU_386 |
1163 | mov [cpu_type], CPU_386 |
1164 | jz .end_cpuid |
1164 | jz .end_cpuid |
1165 | push ecx |
1165 | push ecx |
1166 | popfd |
1166 | popfd |
1167 | 1167 | ||
1168 | mov [cpu_type], CPU_486 |
1168 | mov [cpu_type], CPU_486 |
1169 | mov eax, ecx |
1169 | mov eax, ecx |
1170 | xor eax, 0x200000 |
1170 | xor eax, 0x200000 |
1171 | push eax |
1171 | push eax |
1172 | popfd |
1172 | popfd |
1173 | pushfd |
1173 | pushfd |
1174 | pop eax |
1174 | pop eax |
1175 | xor eax, ecx |
1175 | xor eax, ecx |
1176 | je .end_cpuid |
1176 | je .end_cpuid |
1177 | mov [cpu_id], 1 |
1177 | mov [cpu_id], 1 |
1178 | 1178 | ||
1179 | xor eax, eax |
1179 | xor eax, eax |
1180 | cpuid |
1180 | cpuid |
1181 | mov [cpu_vendor], ebx |
1181 | mov [cpu_vendor], ebx |
1182 | mov [cpu_vendor+4], edx |
1182 | mov [cpu_vendor+4], edx |
1183 | mov [cpu_vendor+8], ecx |
1183 | mov [cpu_vendor+8], ecx |
1184 | cmp ebx, dword [intel_str] |
1184 | cmp ebx, dword [intel_str] |
1185 | jne .check_AMD |
1185 | jne .check_AMD |
1186 | cmp edx, dword [intel_str+4] |
1186 | cmp edx, dword [intel_str+4] |
1187 | jne .check_AMD |
1187 | jne .check_AMD |
1188 | cmp ecx, dword [intel_str+8] |
1188 | cmp ecx, dword [intel_str+8] |
1189 | jne .check_AMD |
1189 | jne .check_AMD |
1190 | mov [cpu_Intel], 1 |
1190 | mov [cpu_Intel], 1 |
1191 | cmp eax, 1 |
1191 | cmp eax, 1 |
1192 | jl .end_cpuid |
1192 | jl .end_cpuid |
1193 | mov eax, 1 |
1193 | mov eax, 1 |
1194 | cpuid |
1194 | cpuid |
1195 | mov [cpu_sign], eax |
1195 | mov [cpu_sign], eax |
1196 | mov [cpu_info], ebx |
1196 | mov [cpu_info], ebx |
1197 | mov [cpu_caps], edx |
1197 | mov [cpu_caps], edx |
1198 | mov [cpu_caps+4],ecx |
1198 | mov [cpu_caps+4],ecx |
1199 | 1199 | ||
1200 | shr eax, 8 |
1200 | shr eax, 8 |
1201 | and eax, 0x0f |
1201 | and eax, 0x0f |
1202 | ret |
1202 | ret |
1203 | .end_cpuid: |
1203 | .end_cpuid: |
1204 | mov eax, [cpu_type] |
1204 | mov eax, [cpu_type] |
1205 | ret |
1205 | ret |
1206 | 1206 | ||
1207 | .check_AMD: |
1207 | .check_AMD: |
1208 | cmp ebx, dword [AMD_str] |
1208 | cmp ebx, dword [AMD_str] |
1209 | jne .unknown |
1209 | jne .unknown |
1210 | cmp edx, dword [AMD_str+4] |
1210 | cmp edx, dword [AMD_str+4] |
1211 | jne .unknown |
1211 | jne .unknown |
1212 | cmp ecx, dword [AMD_str+8] |
1212 | cmp ecx, dword [AMD_str+8] |
1213 | jne .unknown |
1213 | jne .unknown |
1214 | mov [cpu_AMD], 1 |
1214 | mov [cpu_AMD], 1 |
1215 | cmp eax, 1 |
1215 | cmp eax, 1 |
1216 | jl .unknown |
1216 | jl .unknown |
1217 | mov eax, 1 |
1217 | mov eax, 1 |
1218 | cpuid |
1218 | cpuid |
1219 | mov [cpu_sign], eax |
1219 | mov [cpu_sign], eax |
1220 | mov [cpu_info], ebx |
1220 | mov [cpu_info], ebx |
1221 | mov [cpu_caps], edx |
1221 | mov [cpu_caps], edx |
1222 | mov [cpu_caps+4],ecx |
1222 | mov [cpu_caps+4],ecx |
1223 | shr eax, 8 |
1223 | shr eax, 8 |
1224 | and eax, 0x0f |
1224 | and eax, 0x0f |
1225 | ret |
1225 | ret |
1226 | .unknown: |
1226 | .unknown: |
1227 | mov eax, 1 |
1227 | mov eax, 1 |
1228 | cpuid |
1228 | cpuid |
1229 | mov [cpu_sign], eax |
1229 | mov [cpu_sign], eax |
1230 | mov [cpu_info], ebx |
1230 | mov [cpu_info], ebx |
1231 | mov [cpu_caps], edx |
1231 | mov [cpu_caps], edx |
1232 | mov [cpu_caps+4],ecx |
1232 | mov [cpu_caps+4],ecx |
1233 | shr eax, 8 |
1233 | shr eax, 8 |
1234 | and eax, 0x0f |
1234 | and eax, 0x0f |
1235 | ret |
1235 | ret |
1236 | endp |
1236 | endp |
1237 | 1237 | ||
1238 | MEM_WB equ 6 ;write-back memory |
1238 | MEM_WB equ 6 ;write-back memory |
1239 | MEM_WC equ 1 ;write combined memory |
1239 | MEM_WC equ 1 ;write combined memory |
1240 | MEM_UC equ 0 ;uncached memory |
1240 | MEM_UC equ 0 ;uncached memory |
1241 | 1241 | ||
1242 | align 4 |
1242 | align 4 |
1243 | proc init_mtrr |
1243 | proc init_mtrr |
1244 | 1244 | ||
1245 | cmp [0x2f0000+0x901c],byte 2 |
1245 | cmp [0x2f0000+0x901c],byte 2 |
1246 | je .exit |
1246 | je .exit |
1247 | 1247 | ||
1248 | bt [cpu_caps], CAPS_MTRR |
1248 | bt [cpu_caps], CAPS_MTRR |
1249 | jnc .exit |
1249 | jnc .exit |
1250 | 1250 | ||
1251 | mov eax, cr0 |
1251 | mov eax, cr0 |
1252 | or eax, 0x60000000 ;disable caching |
1252 | or eax, 0x60000000 ;disable caching |
1253 | mov cr0, eax |
1253 | mov cr0, eax |
1254 | wbinvd ;invalidate cache |
1254 | wbinvd ;invalidate cache |
1255 | 1255 | ||
1256 | mov ecx, 0x2FF |
1256 | mov ecx, 0x2FF |
1257 | rdmsr ; |
1257 | rdmsr ; |
1258 | push eax |
1258 | push eax |
1259 | 1259 | ||
1260 | xor edx, edx |
1260 | xor edx, edx |
1261 | xor eax, eax |
1261 | xor eax, eax |
1262 | mov ecx, 0x2FF |
1262 | mov ecx, 0x2FF |
1263 | wrmsr ;disable all MTRR |
1263 | wrmsr ;disable all MTRR |
1264 | 1264 | ||
1265 | stdcall set_mtrr, dword 0,dword 0,[MEM_AMOUNT],MEM_WB |
1265 | stdcall set_mtrr, dword 0,dword 0,[MEM_AMOUNT],MEM_WB |
1266 | stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC |
1266 | stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC |
1267 | xor edx, edx |
1267 | xor edx, edx |
1268 | xor eax, eax |
1268 | xor eax, eax |
1269 | mov ecx, 0x204 |
1269 | mov ecx, 0x204 |
1270 | mov ebx, 6 |
1270 | mov ebx, 6 |
1271 | @@: |
1271 | @@: |
1272 | wrmsr ;disable unused MTRR |
1272 | wrmsr ;disable unused MTRR |
1273 | inc ecx |
1273 | inc ecx |
1274 | wrmsr |
1274 | wrmsr |
1275 | inc ecx |
1275 | inc ecx |
1276 | dec ebx |
1276 | dec ebx |
1277 | jnz @b |
1277 | jnz @b |
1278 | 1278 | ||
1279 | wbinvd ;again invalidate |
1279 | wbinvd ;again invalidate |
1280 | 1280 | ||
1281 | pop eax |
1281 | pop eax |
1282 | or eax, 0x800 ;set default memtype to UC |
1282 | or eax, 0x800 ;set default memtype to UC |
1283 | and al, 0xF0 |
1283 | and al, 0xF0 |
1284 | mov ecx, 0x2FF |
1284 | mov ecx, 0x2FF |
1285 | wrmsr ;and enable MTRR |
1285 | wrmsr ;and enable MTRR |
1286 | 1286 | ||
1287 | mov eax, cr0 |
1287 | mov eax, cr0 |
1288 | and eax, not 0x60000000 |
1288 | and eax, not 0x60000000 |
1289 | mov cr0, eax ; enable caching |
1289 | mov cr0, eax ; enable caching |
1290 | .exit: |
1290 | .exit: |
1291 | ret |
1291 | ret |
1292 | endp |
1292 | endp |
1293 | 1293 | ||
1294 | align 4 |
1294 | align 4 |
1295 | proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword |
1295 | proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword |
1296 | 1296 | ||
1297 | xor edx, edx |
1297 | xor edx, edx |
1298 | mov eax, [base] |
1298 | mov eax, [base] |
1299 | or eax, [mem_type] |
1299 | or eax, [mem_type] |
1300 | mov ecx, [reg] |
1300 | mov ecx, [reg] |
1301 | lea ecx, [0x200+ecx*2] |
1301 | lea ecx, [0x200+ecx*2] |
1302 | wrmsr |
1302 | wrmsr |
1303 | 1303 | ||
1304 | mov ebx, [size] |
1304 | mov ebx, [size] |
1305 | dec ebx |
1305 | dec ebx |
1306 | mov eax, 0xFFFFFFFF |
1306 | mov eax, 0xFFFFFFFF |
1307 | mov edx, 0x0000000F |
1307 | mov edx, 0x0000000F |
1308 | sub eax, ebx |
1308 | sub eax, ebx |
1309 | sbb edx, 0 |
1309 | sbb edx, 0 |
1310 | or eax, 0x800 |
1310 | or eax, 0x800 |
1311 | inc ecx |
1311 | inc ecx |
1312 | wrmsr |
1312 | wrmsr |
1313 | ret |
1313 | ret |
1314 | endp |
1314 | endp |
1315 | 1315 | ||
1316 | align 4 |
1316 | align 4 |
1317 | proc stall stdcall, delay:dword |
1317 | proc stall stdcall, delay:dword |
1318 | push ecx |
1318 | push ecx |
1319 | push edx |
1319 | push edx |
1320 | push ebx |
1320 | push ebx |
1321 | push eax |
1321 | push eax |
1322 | 1322 | ||
1323 | mov eax, [delay] |
1323 | mov eax, [delay] |
1324 | mul [stall_mcs] |
1324 | mul [stall_mcs] |
1325 | mov ebx, eax ;low |
1325 | mov ebx, eax ;low |
1326 | mov ecx, edx ;high |
1326 | mov ecx, edx ;high |
1327 | rdtsc |
1327 | rdtsc |
1328 | add ebx, eax |
1328 | add ebx, eax |
1329 | adc ecx,edx |
1329 | adc ecx,edx |
1330 | @@: |
1330 | @@: |
1331 | rdtsc |
1331 | rdtsc |
1332 | sub eax, ebx |
1332 | sub eax, ebx |
1333 | sbb edx, ecx |
1333 | sbb edx, ecx |
1334 | jb @B |
1334 | jb @B |
1335 | 1335 | ||
1336 | pop eax |
1336 | pop eax |
1337 | pop ebx |
1337 | pop ebx |
1338 | pop edx |
1338 | pop edx |
1339 | pop ecx |
1339 | pop ecx |
1340 | ret |
1340 | ret |
1341 | endp |
1341 | endp |
1342 | 1342 | ||
1343 | iglobal |
1343 | iglobal |
1344 | align 4 |
1344 | align 4 |
1345 | intel_str db "GenuineIntel",0 |
1345 | intel_str db "GenuineIntel",0 |
1346 | AMD_str db "AuthenticAMD",0 |
1346 | AMD_str db "AuthenticAMD",0 |
1347 | endg |
1347 | endg |
1348 | 1348 | ||
1349 | uglobal |
1349 | uglobal |
1350 | align 16 |
1350 | align 16 |
1351 | irq_tab rd 16 |
1351 | irq_tab rd 16 |
1352 | 1352 | ||
1353 | MEM_FreeSpace rd 1 |
1353 | MEM_FreeSpace rd 1 |
1354 | 1354 | ||
1355 | ipc_tmp rd 1 |
1355 | ipc_tmp rd 1 |
1356 | ipc_pdir rd 1 |
1356 | ipc_pdir rd 1 |
1357 | ipc_ptab rd 1 |
1357 | ipc_ptab rd 1 |
1358 | 1358 | ||
1359 | proc_mem_map rd 1 |
1359 | proc_mem_map rd 1 |
1360 | proc_mem_pdir rd 1 |
1360 | proc_mem_pdir rd 1 |
1361 | proc_mem_tab rd 1 |
1361 | proc_mem_tab rd 1 |
1362 | 1362 | ||
1363 | tmp_task_pdir rd 1 |
1363 | tmp_task_pdir rd 1 |
1364 | tmp_task_ptab rd 1 |
1364 | tmp_task_ptab rd 1 |
1365 | 1365 | ||
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 | def_cursor rd 1 |
1381 | def_cursor rd 1 |
1382 | hw_cursor rd 1 |
1382 | hw_cursor rd 1 |
1383 | 1383 | ||
1384 | scr_width rd 1 |
1384 | scr_width rd 1 |
1385 | scr_height rd 1 |
1385 | scr_height rd 1 |
1386 | 1386 | ||
1387 | cur_def_interl rd 1 |
1387 | cur_def_interl rd 1 |
1388 | cur_saved_base rd 1 |
1388 | cur_saved_base rd 1 |
1389 | cur_saved_interl rd 1 |
1389 | cur_saved_interl rd 1 |
1390 | cur_saved_w rd 1 |
1390 | cur_saved_w rd 1 |
1391 | cur_saved_h rd 1 |
1391 | cur_saved_h rd 1 |
1392 | 1392 | ||
1393 | endg |
1393 | endg |
1394 | 1394 | ||
1395 | uglobal |
1395 | uglobal |
1396 | align 16 |
1396 | align 16 |
1397 | fpu_data: |
1397 | fpu_data: |
1398 | rb 512 |
1398 | rb 512 |
1399 | 1399 | ||
1400 | mst MEM_STATE |
1400 | mst MEM_STATE |
1401 | 1401 | ||
1402 | mem_block_map rb 512 |
1402 | mem_block_map rb 512 |
1403 | event_map rb 64 |
1403 | event_map rb 64 |
1404 | mem_block_list rd 64 |
1404 | mem_block_list rd 64 |
1405 | mem_block_mask rd 2 |
1405 | mem_block_mask rd 2 |
1406 | 1406 | ||
1407 | srv.fd rd 1 |
1407 | srv.fd rd 1 |
1408 | srv.bk rd 1 |
1408 | srv.bk rd 1 |
1409 | 1409 | ||
1410 | mem_used.fd rd 1 |
1410 | mem_used.fd rd 1 |
1411 | mem_used.bk rd 1 |
1411 | mem_used.bk rd 1 |
1412 | 1412 | ||
1413 | mem_block_arr rd 1 |
1413 | mem_block_arr rd 1 |
1414 | mem_block_start rd 1 |
1414 | mem_block_start rd 1 |
1415 | mem_block_end rd 1 |
1415 | mem_block_end rd 1 |
1416 | 1416 | ||
1417 | heap_mutex rd 1 |
1417 | heap_mutex rd 1 |
1418 | heap_size rd 1 |
1418 | heap_size rd 1 |
1419 | heap_free rd 1 |
1419 | heap_free rd 1 |
1420 | heap_blocks rd 1 |
1420 | heap_blocks rd 1 |
1421 | free_blocks rd 1 |
1421 | free_blocks rd 1 |
1422 | 1422 | ||
1423 | page_start rd 1 |
1423 | page_start rd 1 |
1424 | page_end rd 1 |
1424 | page_end rd 1 |
1425 | events rd 1 |
1425 | events rd 1 |
1426 | event_start rd 1 |
1426 | event_start rd 1 |
1427 | event_end rd 1 |
1427 | event_end rd 1 |
1428 | event_uid rd 1 |
1428 | event_uid rd 1 |
1429 | sys_page_map rd 1 |
1429 | sys_page_map rd 1 |
1430 | os_stack rd 1 |
1430 | os_stack rd 1 |
1431 | endg |
1431 | endg |
1432 | 1432 | ||
1433 | if 0 |
1433 | if 0 |
1434 | push eax |
1434 | push eax |
1435 | push edx |
1435 | push edx |
1436 | mov edx, 0x400 ;bocsh |
1436 | mov edx, 0x400 ;bocsh |
1437 | mov al,0xff ;bocsh |
1437 | mov al,0xff ;bocsh |
1438 | out dx, al ;bocsh |
1438 | out dx, al ;bocsh |
1439 | pop edx |
1439 | pop edx |
1440 | pop eax |
1440 | pop eax |
1441 | end if |
1441 | end if |
1442 | 1442 | ||
1443 | align 4 |
1443 | align 4 |
1444 | k_strrchr: |
1444 | k_strrchr: |
1445 | push eax |
1445 | push eax |
1446 | xor eax,eax |
1446 | xor eax,eax |
1447 | or ecx,-1 |
1447 | or ecx,-1 |
1448 | repne scasb |
1448 | repne scasb |
1449 | add ecx,1 |
1449 | add ecx,1 |
1450 | neg ecx |
1450 | neg ecx |
1451 | sub edi,1 |
1451 | sub edi,1 |
1452 | pop eax |
1452 | pop eax |
1453 | std |
1453 | std |
1454 | repne scasb |
1454 | repne scasb |
1455 | cld |
1455 | cld |
1456 | add edi,1 |
1456 | add edi,1 |
1457 | 1457 | ||
1458 | cmp [edi],al |
1458 | cmp [edi],al |
1459 | jne @F |
1459 | jne @F |
1460 | mov eax,edi |
1460 | mov eax,edi |
1461 | ret |
1461 | ret |
1462 | @@: |
1462 | @@: |
1463 | xor eax,eax |
1463 | xor eax,eax |
1464 | ret |
1464 | ret |
1465 | 1465 | ||
1466 | align 4 |
1466 | align 4 |
1467 | proc k_strncpy stdcall, dest:dword, src:dword, maxlen:dword |
1467 | proc k_strncpy stdcall, dest:dword, src:dword, maxlen:dword |
1468 | mov eax, [dest] |
1468 | mov eax, [dest] |
1469 | mov esi, [src] |
1469 | mov esi, [src] |
1470 | mov ecx, [maxlen] |
1470 | mov ecx, [maxlen] |
1471 | test eax, eax |
1471 | test eax, eax |
1472 | jz .L9 |
1472 | jz .L9 |
1473 | test esi, esi |
1473 | test esi, esi |
1474 | jz .L9 |
1474 | jz .L9 |
1475 | test ecx, ecx |
1475 | test ecx, ecx |
1476 | jz .L9 |
1476 | jz .L9 |
1477 | 1477 | ||
1478 | sub esi, eax |
1478 | sub esi, eax |
1479 | jmp .L1 |
1479 | jmp .L1 |
1480 | 1480 | ||
1481 | align 4 |
1481 | align 4 |
1482 | .L2: |
1482 | .L2: |
1483 | mov edx, [esi+eax] |
1483 | mov edx, [esi+eax] |
1484 | mov [eax], dl |
1484 | mov [eax], dl |
1485 | test dl, dl |
1485 | test dl, dl |
1486 | jz .L7 |
1486 | jz .L7 |
1487 | 1487 | ||
1488 | mov [eax+1], dh |
1488 | mov [eax+1], dh |
1489 | test dh, dh |
1489 | test dh, dh |
1490 | jz .L6 |
1490 | jz .L6 |
1491 | 1491 | ||
1492 | shr edx, 16 |
1492 | shr edx, 16 |
1493 | mov [eax+2],dl |
1493 | mov [eax+2],dl |
1494 | test dl, dl |
1494 | test dl, dl |
1495 | jz .L5 |
1495 | jz .L5 |
1496 | 1496 | ||
1497 | mov [eax+3], dh |
1497 | mov [eax+3], dh |
1498 | test dh, dh |
1498 | test dh, dh |
1499 | jz .L4 |
1499 | jz .L4 |
1500 | add eax, 4 |
1500 | add eax, 4 |
1501 | .L1: |
1501 | .L1: |
1502 | sub ecx, 4 |
1502 | sub ecx, 4 |
1503 | jae .L2 |
1503 | jae .L2 |
1504 | 1504 | ||
1505 | add ecx, 4 |
1505 | add ecx, 4 |
1506 | jz .L9 |
1506 | jz .L9 |
1507 | 1507 | ||
1508 | mov dl, [eax+esi] |
1508 | mov dl, [eax+esi] |
1509 | mov [eax], dl |
1509 | mov [eax], dl |
1510 | test dl, dl |
1510 | test dl, dl |
1511 | jz .L3 |
1511 | jz .L3 |
1512 | 1512 | ||
1513 | inc eax |
1513 | inc eax |
1514 | dec ecx |
1514 | dec ecx |
1515 | jz .L9 |
1515 | jz .L9 |
1516 | 1516 | ||
1517 | mov dl, [eax+esi] |
1517 | mov dl, [eax+esi] |
1518 | mov [eax], dl |
1518 | mov [eax], dl |
1519 | test dl, dl |
1519 | test dl, dl |
1520 | jz .L3 |
1520 | jz .L3 |
1521 | 1521 | ||
1522 | inc eax |
1522 | inc eax |
1523 | dec ecx |
1523 | dec ecx |
1524 | jz .L9 |
1524 | jz .L9 |
1525 | 1525 | ||
1526 | mov dl, [eax+esi] |
1526 | mov dl, [eax+esi] |
1527 | mov [eax], dl |
1527 | mov [eax], dl |
1528 | test dl, dl |
1528 | test dl, dl |
1529 | jz .L3 |
1529 | jz .L3 |
1530 | 1530 | ||
1531 | inc eax |
1531 | inc eax |
1532 | jmp .L9 |
1532 | jmp .L9 |
1533 | 1533 | ||
1534 | .L4: dec ecx |
1534 | .L4: dec ecx |
1535 | inc eax |
1535 | inc eax |
1536 | 1536 | ||
1537 | .L5: dec ecx |
1537 | .L5: dec ecx |
1538 | inc eax |
1538 | inc eax |
1539 | 1539 | ||
1540 | .L6: dec ecx |
1540 | .L6: dec ecx |
1541 | inc eax |
1541 | inc eax |
1542 | .L7: |
1542 | .L7: |
1543 | add ecx,3 |
1543 | add ecx,3 |
1544 | jz .L9 |
1544 | jz .L9 |
1545 | .L8: |
1545 | .L8: |
1546 | mov byte [ecx+eax], 0 |
1546 | mov byte [ecx+eax], 0 |
1547 | .L3: |
1547 | .L3: |
1548 | dec ecx |
1548 | dec ecx |
1549 | jnz .L8 |
1549 | jnz .L8 |
1550 | .L9: |
1550 | .L9: |
1551 | ret |
1551 | ret |
1552 | endp |
1552 | endp |
1553 | 1553 | ||
1554 | if 0 |
1554 | if 0 |
1555 | 1555 | ||
1556 | magic equ 0xfefefeff |
1556 | magic equ 0xfefefeff |
1557 | 1557 | ||
1558 | k_strlen: |
1558 | k_strlen: |
1559 | mov eax,[esp+4] |
1559 | mov eax,[esp+4] |
1560 | mov edx, 3 |
1560 | mov edx, 3 |
1561 | 1561 | ||
1562 | and edx, eax |
1562 | and edx, eax |
1563 | jz .L1 |
1563 | jz .L1 |
1564 | jp .L0 |
1564 | jp .L0 |
1565 | 1565 | ||
1566 | cmp dh, byte [eax] |
1566 | cmp dh, byte [eax] |
1567 | je .L2 |
1567 | je .L2 |
1568 | 1568 | ||
1569 | inc eax |
1569 | inc eax |
1570 | cmp dh, byte [eax] |
1570 | cmp dh, byte [eax] |
1571 | 1571 | ||
1572 | je .L2 |
1572 | je .L2 |
1573 | 1573 | ||
1574 | inc eax |
1574 | inc eax |
1575 | xor edx, 2 |
1575 | xor edx, 2 |
1576 | 1576 | ||
1577 | jz .L1 |
1577 | jz .L1 |
1578 | .L0: |
1578 | .L0: |
1579 | cmp dh, [eax] |
1579 | cmp dh, [eax] |
1580 | je .L2 |
1580 | je .L2 |
1581 | 1581 | ||
1582 | inc eax |
1582 | inc eax |
1583 | xor edx, edx |
1583 | xor edx, edx |
1584 | 1584 | ||
1585 | .L1: |
1585 | .L1: |
1586 | mov ecx, [eax] |
1586 | mov ecx, [eax] |
1587 | add eax, 4 |
1587 | add eax, 4 |
1588 | 1588 | ||
1589 | sub edx, ecx |
1589 | sub edx, ecx |
1590 | add ecx, magic |
1590 | add ecx, magic |
1591 | 1591 | ||
1592 | dec edx |
1592 | dec edx |
1593 | jnc .L3 |
1593 | jnc .L3 |
1594 | 1594 | ||
1595 | xor edx, ecx |
1595 | xor edx, ecx |
1596 | and edx, not magic |
1596 | and edx, not magic |
1597 | jne .L3 |
1597 | jne .L3 |
1598 | 1598 | ||
1599 | mov ecx, [eax] |
1599 | mov ecx, [eax] |
1600 | add eax, 4 |
1600 | add eax, 4 |
1601 | 1601 | ||
1602 | sub edx, ecx |
1602 | sub edx, ecx |
1603 | add ecx, magic |
1603 | add ecx, magic |
1604 | dec edx |
1604 | dec edx |
1605 | jnc .L3 |
1605 | jnc .L3 |
1606 | 1606 | ||
1607 | xor edx, ecx |
1607 | xor edx, ecx |
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 | jne .L3 |
1623 | jne .L3 |
1624 | 1624 | ||
1625 | mov ecx, [eax] |
1625 | mov ecx, [eax] |
1626 | add eax, 4 |
1626 | add eax, 4 |
1627 | 1627 | ||
1628 | sub edx, ecx |
1628 | sub edx, ecx |
1629 | add ecx, magic |
1629 | add ecx, magic |
1630 | 1630 | ||
1631 | dec edx |
1631 | dec edx |
1632 | jnc .L3 |
1632 | jnc .L3 |
1633 | 1633 | ||
1634 | xor edx, ecx |
1634 | xor edx, ecx |
1635 | 1635 | ||
1636 | and edx, not magic |
1636 | and edx, not magic |
1637 | je .L1 |
1637 | je .L1 |
1638 | 1638 | ||
1639 | .L3: sub eax ,4 |
1639 | .L3: sub eax ,4 |
1640 | sub ecx, magic |
1640 | sub ecx, magic |
1641 | 1641 | ||
1642 | cmp cl, 0 |
1642 | cmp cl, 0 |
1643 | jz .L2 |
1643 | jz .L2 |
1644 | 1644 | ||
1645 | inc eax |
1645 | inc eax |
1646 | test ch, ch |
1646 | test ch, ch |
1647 | jz .L2 |
1647 | jz .L2 |
1648 | 1648 | ||
1649 | shr ecx, 16 |
1649 | shr ecx, 16 |
1650 | inc eax |
1650 | inc eax |
1651 | 1651 | ||
1652 | cmp cl,0 |
1652 | cmp cl,0 |
1653 | jz .L2 |
1653 | jz .L2 |
1654 | 1654 | ||
1655 | inc eax |
1655 | inc eax |
1656 | 1656 | ||
1657 | .L2: |
1657 | .L2: |
1658 | sub eax, [esp+4] |
1658 | sub eax, [esp+4] |
1659 | ret |
1659 | ret |
1660 | 1660 | ||
1661 | end if0>> |
1661 | end if0>> |