Rev 854 | Rev 864 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 854 | Rev 859 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | $Revision: 854 $ |
8 | $Revision: 859 $ |
9 | 9 | ||
10 | 10 | ||
Line 36... | Line 36... | ||
36 | list_bk equ MEM_BLOCK.list_bk |
36 | list_bk equ MEM_BLOCK.list_bk |
37 | block_base equ MEM_BLOCK.base |
37 | block_base equ MEM_BLOCK.base |
38 | block_size equ MEM_BLOCK.size |
38 | block_size equ MEM_BLOCK.size |
39 | block_flags equ MEM_BLOCK.flags |
39 | block_flags equ MEM_BLOCK.flags |
Line 40... | Line -... | ||
40 | - | ||
41 | macro calc_index op |
- | |
42 | { shr op, 12 |
- | |
43 | dec op |
- | |
44 | cmp op, 63 |
- | |
45 | jna @f |
- | |
46 | mov op, 63 |
- | |
47 | @@: |
- | |
48 | } |
- | |
49 | - | ||
50 | macro remove_from_list op |
- | |
51 | { mov edx, [op+list_fd] |
- | |
52 | mov ecx, [op+list_bk] |
- | |
53 | test edx, edx |
- | |
54 | jz @f |
- | |
55 | mov [edx+list_bk], ecx |
- | |
56 | @@: |
- | |
57 | test ecx, ecx |
- | |
58 | jz @f |
- | |
59 | mov [ecx+list_fd], edx |
- | |
60 | @@: |
- | |
61 | mov [op+list_fd],0 |
- | |
62 | mov [op+list_bk],0 |
- | |
63 | } |
- | |
64 | - | ||
65 | macro remove_from_free op |
- | |
66 | { |
- | |
67 | remove_from_list op |
- | |
68 | - | ||
69 | mov eax, [op+block_size] |
- | |
70 | calc_index eax |
- | |
71 | cmp [mem_block_list+eax*4], op |
- | |
72 | jne @f |
- | |
73 | mov [mem_block_list+eax*4], edx |
- | |
74 | @@: |
- | |
75 | cmp [mem_block_list+eax*4], 0 |
- | |
76 | jne @f |
- | |
77 | btr [mem_block_mask], eax |
- | |
78 | @@: |
- | |
79 | } |
- | |
80 | - | ||
81 | macro remove_from_used op |
- | |
82 | { |
- | |
83 | mov edx, [op+list_fd] |
- | |
84 | mov ecx, [op+list_bk] |
- | |
85 | mov [edx+list_bk], ecx |
- | |
86 | mov [ecx+list_fd], edx |
- | |
87 | mov [op+list_fd], 0 |
- | |
88 | mov [op+list_bk], 0 |
- | |
89 | } |
- | |
90 | - | ||
91 | align 4 |
- | |
92 | init_kernel_heap: |
- | |
93 | - | ||
94 | mov ecx, 64/4 |
- | |
95 | mov edi, mem_block_list |
- | |
96 | xor eax, eax |
- | |
97 | cld |
- | |
98 | rep stosd |
- | |
99 | - | ||
100 | mov ecx, 512/4 |
- | |
101 | mov edi, mem_block_map |
- | |
102 | not eax |
- | |
103 | rep stosd |
- | |
104 | - | ||
105 | mov ecx, 128*1024 |
- | |
106 | fastcall _balloc |
- | |
107 | - | ||
108 | mov [mem_block_start], mem_block_map |
- | |
109 | mov [mem_block_end], mem_block_map+512 |
- | |
110 | mov [mem_block_arr], eax |
- | |
111 | - | ||
112 | mov ebx, mem_used.fd-MEM_LIST_OFFSET |
- | |
113 | mov [mem_used.fd], ebx |
- | |
114 | mov [mem_used.bk], ebx |
- | |
115 | - | ||
116 | xor edx, edx |
- | |
117 | - | ||
118 | mov [eax+block_next], edx |
- | |
119 | mov [eax+block_prev], edx |
- | |
120 | mov [eax+list_fd], edx |
- | |
121 | mov [eax+list_bk], edx |
- | |
122 | mov [eax+block_base], HEAP_BASE |
- | |
123 | mov [eax+block_size], page_tabs-HEAP_BASE |
- | |
124 | mov [eax+block_flags], FREE_BLOCK |
- | |
125 | - | ||
126 | mov [heap_size], page_tabs-HEAP_BASE |
- | |
127 | mov [heap_free], page_tabs-HEAP_BASE |
- | |
128 | - | ||
129 | mov [mem_block_mask], edx |
- | |
130 | mov [mem_block_mask+4],0x80000000 |
- | |
131 | - | ||
132 | mov [mem_block_list+63*4], eax |
- | |
133 | mov byte [mem_block_map], 0xFE |
- | |
134 | and [heap_mutex], 0 |
- | |
135 | mov [heap_blocks], 4096 |
- | |
136 | mov [free_blocks], 4096 |
- | |
137 | ret |
- | |
138 | - | ||
139 | ; param |
- | |
140 | ; eax= required size |
- | |
141 | ; |
- | |
142 | ; retval |
- | |
143 | ; edi= memory block descriptor |
- | |
144 | ; ebx= descriptor index |
- | |
145 | - | ||
146 | align 4 |
- | |
147 | get_small_block: |
- | |
148 | mov ecx, eax |
- | |
149 | shr ecx, 12 |
- | |
150 | dec ecx |
- | |
151 | cmp ecx, 63 |
- | |
152 | jle .get_index |
- | |
153 | mov ecx, 63 |
- | |
154 | .get_index: |
- | |
155 | lea esi, [mem_block_mask] |
- | |
156 | xor ebx, ebx |
- | |
157 | or edx, -1 |
- | |
158 | - | ||
159 | cmp ecx, 32 |
- | |
160 | jb .bit_test |
- | |
161 | - | ||
162 | sub ecx, 32 |
- | |
163 | add ebx, 32 |
- | |
164 | add esi, 4 |
- | |
165 | .bit_test: |
- | |
166 | shl edx, cl |
- | |
167 | and edx, [esi] |
- | |
168 | .find: |
- | |
169 | bsf edi, edx |
- | |
170 | jz .high_mask |
- | |
171 | add ebx, edi |
- | |
172 | mov edi, [mem_block_list+ebx*4] |
- | |
173 | .check_size: |
- | |
174 | cmp eax, [edi+block_size] |
- | |
175 | ja .next |
- | |
176 | ret |
- | |
177 | - | ||
178 | .high_mask: |
- | |
179 | add esi, 4 |
- | |
180 | cmp esi, mem_block_mask+8 |
- | |
181 | jae .err |
- | |
182 | add ebx, 32 |
- | |
183 | mov edx, [esi] |
- | |
184 | jmp .find |
- | |
185 | .next: |
- | |
186 | mov edi, [edi+list_fd] |
- | |
187 | test edi, edi |
- | |
188 | jnz .check_size |
- | |
189 | .err: |
- | |
190 | xor edi, edi |
- | |
191 | ret |
- | |
192 | ; param |
- | |
193 | ; eax= required size |
- | |
194 | ; |
- | |
195 | ; retval |
- | |
196 | ; edi= memory block descriptor |
- | |
197 | ; ebx= descriptor index |
- | |
198 | align 4 |
- | |
199 | get_large_block: |
- | |
200 | mov edx, -1 |
- | |
201 | mov ecx, eax |
- | |
202 | shr ecx, 22 |
- | |
203 | dec ecx |
- | |
204 | cmp ecx, 31 |
- | |
205 | jle .get_index |
- | |
206 | mov ecx, 31 |
- | |
207 | .get_index: |
- | |
208 | shl edx, cl |
- | |
209 | and edx, [large_block_mask] |
- | |
210 | .find: |
- | |
211 | bsf edi, edx |
- | |
212 | mov ebx, edi |
- | |
213 | mov edi, [large_block_list+edi*4] |
- | |
214 | .check_size: |
- | |
215 | cmp eax, [edi+block_size] |
- | |
216 | ja .next |
- | |
217 | ret |
- | |
218 | .next: |
- | |
219 | mov edi, [edi+list_fd] |
- | |
220 | test edi, edi |
- | |
221 | jnz .check_size |
- | |
222 | .fail: |
- | |
223 | xor edi, edi |
- | |
224 | ret |
- | |
225 | - | ||
226 | align 4 |
- | |
227 | alloc_mem_block: |
- | |
228 | - | ||
229 | mov ebx, [mem_block_start] |
- | |
230 | mov ecx, [mem_block_end] |
- | |
231 | .l1: |
- | |
232 | bsf eax,[ebx]; |
- | |
233 | jnz found |
- | |
234 | add ebx,4 |
- | |
235 | cmp ebx, ecx |
- | |
236 | jb .l1 |
- | |
237 | xor eax,eax |
- | |
238 | ret |
- | |
239 | - | ||
240 | found: |
- | |
241 | btr [ebx], eax |
- | |
242 | mov [mem_block_start],ebx |
- | |
243 | sub ebx, mem_block_map |
- | |
244 | lea eax,[eax+ebx*8] |
- | |
245 | shl eax, 5 |
- | |
246 | add eax, [mem_block_arr] |
- | |
247 | dec [free_blocks] |
- | |
248 | ret |
- | |
249 | align 4 |
- | |
250 | free_mem_block: |
- | |
251 | mov dword [eax], 0 |
- | |
252 | mov dword [eax+4], 0 |
- | |
253 | mov dword [eax+8], 0 |
- | |
254 | mov dword [eax+12], 0 |
- | |
255 | mov dword [eax+16], 0 |
- | |
256 | ; mov dword [eax+20], 0 |
- | |
257 | mov dword [eax+24], 0 |
- | |
258 | mov dword [eax+28], 0 |
- | |
259 | - | ||
260 | sub eax, [mem_block_arr] |
- | |
261 | shr eax, 5 |
- | |
262 | - | ||
263 | mov ebx, mem_block_map |
- | |
264 | bts [ebx], eax |
- | |
265 | inc [free_blocks] |
- | |
266 | shr eax, 3 |
- | |
267 | and eax, not 3 |
- | |
268 | add eax, ebx |
- | |
269 | cmp [mem_block_start], eax |
- | |
270 | ja @f |
- | |
271 | ret |
- | |
272 | @@: |
- | |
273 | mov [mem_block_start], eax |
- | |
274 | ret |
- | |
275 | .err: |
- | |
276 | xor eax, eax |
- | |
277 | ret |
- | |
278 | - | ||
279 | align 4 |
- | |
280 | proc alloc_kernel_space stdcall, size:dword |
- | |
281 | local block_ind:DWORD |
- | |
282 | - | ||
283 | push ebx |
- | |
284 | push esi |
- | |
285 | push edi |
- | |
286 | - | ||
287 | mov eax, [size] |
- | |
288 | add eax, 4095 |
- | |
289 | and eax, not 4095 |
- | |
290 | mov [size], eax |
- | |
291 | - | ||
292 | mov ebx, heap_mutex |
- | |
293 | call wait_mutex ;ebx |
- | |
294 | - | ||
295 | cmp eax, [heap_free] |
- | |
296 | ja .error |
- | |
297 | - | ||
298 | call get_small_block ; eax |
- | |
299 | test edi, edi |
- | |
300 | jz .error |
- | |
301 | - | ||
302 | cmp [edi+block_flags], FREE_BLOCK |
- | |
303 | jne .error |
- | |
304 | - | ||
305 | mov [block_ind], ebx ;index of allocated block |
- | |
306 | - | ||
307 | mov eax, [edi+block_size] |
- | |
308 | cmp eax, [size] |
- | |
309 | je .m_eq_size |
- | |
310 | - | ||
311 | call alloc_mem_block |
- | |
312 | test eax, eax |
- | |
313 | jz .error |
- | |
314 | - | ||
315 | mov esi, eax ;esi - splitted block |
- | |
316 | - | ||
317 | mov [esi+block_next], edi |
- | |
318 | mov eax, [edi+block_prev] |
- | |
319 | mov [esi+block_prev], eax |
- | |
320 | mov [edi+block_prev], esi |
- | |
321 | mov [esi+list_fd], 0 |
- | |
322 | mov [esi+list_bk], 0 |
- | |
323 | test eax, eax |
- | |
324 | jz @f |
- | |
325 | mov [eax+block_next], esi |
- | |
326 | @@: |
- | |
327 | mov ebx, [edi+block_base] |
- | |
328 | mov [esi+block_base], ebx |
- | |
329 | mov edx, [size] |
- | |
330 | mov [esi+block_size], edx |
- | |
331 | add [edi+block_base], edx |
- | |
332 | sub [edi+block_size], edx |
- | |
333 | - | ||
334 | mov eax, [edi+block_size] |
- | |
335 | shr eax, 12 |
- | |
336 | sub eax, 1 |
- | |
337 | cmp eax, 63 |
- | |
338 | jna @f |
- | |
339 | mov eax, 63 |
- | |
340 | @@: |
- | |
341 | cmp eax, [block_ind] |
- | |
342 | je .m_eq_ind |
- | |
343 | - | ||
344 | remove_from_list edi |
- | |
345 | - | ||
346 | mov ecx, [block_ind] |
- | |
347 | mov [mem_block_list+ecx*4], edx |
- | |
348 | - | ||
349 | test edx, edx |
- | |
350 | jnz @f |
- | |
351 | btr [mem_block_mask], ecx |
- | |
352 | @@: |
- | |
353 | mov edx, [mem_block_list+eax*4] |
- | |
354 | mov [edi+list_fd], edx |
- | |
355 | test edx, edx |
- | |
356 | jz @f |
- | |
357 | mov [edx+list_bk], edi |
- | |
358 | @@: |
- | |
359 | mov [mem_block_list+eax*4], edi |
- | |
360 | bts [mem_block_mask], eax |
- | |
361 | .m_eq_ind: |
- | |
362 | mov ecx, mem_used.fd-MEM_LIST_OFFSET |
- | |
363 | mov edx, [ecx+list_fd] |
- | |
364 | mov [esi+list_fd], edx |
- | |
365 | mov [esi+list_bk], ecx |
- | |
366 | mov [ecx+list_fd], esi |
- | |
367 | mov [edx+list_bk], esi |
- | |
368 | - | ||
369 | mov [esi+block_flags], USED_BLOCK |
- | |
370 | mov eax, [esi+block_base] |
- | |
371 | mov ebx, [size] |
- | |
372 | sub [heap_free], ebx |
- | |
373 | and [heap_mutex], 0 |
- | |
374 | pop edi |
- | |
375 | pop esi |
- | |
376 | pop ebx |
- | |
377 | ret |
- | |
378 | .m_eq_size: |
- | |
379 | remove_from_list edi |
- | |
380 | mov [mem_block_list+ebx*4], edx |
- | |
381 | and edx, edx |
- | |
382 | jnz @f |
- | |
383 | btr [mem_block_mask], ebx |
- | |
384 | @@: |
- | |
385 | mov ecx, mem_used.fd-MEM_LIST_OFFSET |
- | |
386 | mov edx, [ecx+list_fd] |
- | |
387 | mov [edi+list_fd], edx |
- | |
388 | mov [edi+list_bk], ecx |
- | |
389 | mov [ecx+list_fd], edi |
- | |
390 | mov [edx+list_bk], edi |
- | |
391 | - | ||
392 | mov [edi+block_flags], USED_BLOCK |
- | |
393 | mov eax, [edi+block_base] |
- | |
394 | mov ebx, [size] |
- | |
395 | sub [heap_free], ebx |
- | |
396 | and [heap_mutex], 0 |
- | |
397 | pop edi |
- | |
398 | pop esi |
- | |
399 | pop ebx |
- | |
400 | ret |
- | |
401 | .error: |
- | |
402 | xor eax, eax |
- | |
403 | mov [heap_mutex], eax |
- | |
404 | pop edi |
- | |
405 | pop esi |
- | |
406 | pop ebx |
- | |
407 | ret |
- | |
Line 408... | Line 40... | ||
408 | endp |
40 | |
409 | 41 | ||
410 | align 4 |
- | |
411 | proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword |
- | |
412 | push ebx |
- | |
413 | push esi |
- | |
414 | push edi |
- | |
415 | mov ebx, heap_mutex |
- | |
416 | call wait_mutex ;ebx |
- | |
417 | - | ||
418 | mov eax, [base] |
- | |
419 | mov esi, [mem_used.fd] |
- | |
420 | @@: |
- | |
421 | cmp esi, mem_used.fd-MEM_LIST_OFFSET |
- | |
422 | je .fail |
- | |
423 | - | ||
424 | cmp [esi+block_base], eax |
- | |
425 | je .found |
- | |
426 | mov esi, [esi+list_fd] |
- | |
427 | jmp @b |
- | |
428 | .found: |
- | |
429 | cmp [esi+block_flags], USED_BLOCK |
- | |
430 | jne .fail |
- | |
431 | - | ||
432 | mov eax, [esi+block_size] |
- | |
433 | add [heap_free], eax |
- | |
434 | - | ||
435 | mov edi, [esi+block_next] |
- | |
436 | test edi, edi |
- | |
437 | jz .prev |
- | |
438 | - | ||
439 | cmp [edi+block_flags], FREE_BLOCK |
- | |
440 | jne .prev |
- | |
441 | - | ||
442 | remove_from_free edi |
- | |
443 | - | ||
444 | mov edx, [edi+block_next] |
- | |
445 | mov [esi+block_next], edx |
- | |
446 | test edx, edx |
- | |
447 | jz @f |
- | |
448 | - | ||
449 | mov [edx+block_prev], esi |
- | |
450 | @@: |
- | |
451 | mov ecx, [edi+block_size] |
- | |
452 | add [esi+block_size], ecx |
- | |
453 | - | ||
454 | mov eax, edi |
- | |
455 | call free_mem_block |
- | |
456 | .prev: |
- | |
457 | mov edi, [esi+block_prev] |
- | |
458 | test edi, edi |
- | |
459 | jz .insert |
- | |
460 | - | ||
461 | cmp [edi+block_flags], FREE_BLOCK |
- | |
462 | jne .insert |
- | |
463 | - | ||
464 | remove_from_used esi |
- | |
465 | - | ||
466 | mov edx, [esi+block_next] |
- | |
467 | mov [edi+block_next], edx |
- | |
468 | test edx, edx |
- | |
469 | jz @f |
- | |
470 | mov [edx+block_prev], edi |
- | |
471 | @@: |
- | |
472 | mov eax, esi |
- | |
473 | call free_mem_block |
- | |
474 | - | ||
475 | mov ecx, [edi+block_size] |
- | |
476 | mov eax, [esi+block_size] |
- | |
477 | add eax, ecx |
- | |
478 | mov [edi+block_size], eax |
- | |
479 | - | ||
480 | calc_index eax |
- | |
481 | calc_index ecx |
- | |
482 | cmp eax, ecx |
- | |
483 | je .m_eq |
- | |
484 | - | ||
485 | push ecx |
- | |
486 | remove_from_list edi |
- | |
487 | pop ecx |
- | |
488 | - | ||
489 | cmp [mem_block_list+ecx*4], edi |
- | |
490 | jne @f |
- | |
491 | mov [mem_block_list+ecx*4], edx |
- | |
492 | @@: |
- | |
493 | cmp [mem_block_list+ecx*4], 0 |
- | |
494 | jne @f |
- | |
495 | btr [mem_block_mask], ecx |
- | |
496 | @@: |
- | |
497 | mov esi, [mem_block_list+eax*4] |
- | |
498 | mov [mem_block_list+eax*4], edi |
- | |
499 | mov [edi+list_fd], esi |
- | |
500 | test esi, esi |
- | |
501 | jz @f |
- | |
502 | mov [esi+list_bk], edi |
- | |
503 | @@: |
- | |
504 | bts [mem_block_mask], eax |
- | |
505 | .m_eq: |
- | |
506 | xor eax, eax |
- | |
507 | mov [heap_mutex], eax |
- | |
508 | dec eax |
- | |
509 | pop edi |
- | |
510 | pop esi |
- | |
511 | pop ebx |
- | |
512 | ret |
- | |
Line 513... | Line -... | ||
513 | .insert: |
- | |
514 | remove_from_used esi |
- | |
515 | - | ||
516 | mov eax, [esi+block_size] |
- | |
517 | calc_index eax |
- | |
518 | - | ||
519 | mov edi, [mem_block_list+eax*4] |
- | |
520 | mov [mem_block_list+eax*4], esi |
- | |
521 | mov [esi+list_fd], edi |
- | |
522 | test edi, edi |
- | |
523 | jz @f |
- | |
524 | mov [edi+list_bk], esi |
- | |
525 | @@: |
- | |
526 | bts [mem_block_mask], eax |
- | |
527 | mov [esi+block_flags],FREE_BLOCK |
- | |
528 | xor eax, eax |
- | |
529 | mov [heap_mutex], eax |
- | |
530 | dec eax |
- | |
531 | pop edi |
- | |
532 | pop esi |
- | |
533 | pop ebx |
- | |
534 | ret |
- | |
535 | .fail: |
- | |
536 | xor eax, eax |
- | |
537 | mov [heap_mutex], eax |
- | |
538 | pop edi |
42 | align 4 |
539 | pop esi |
43 | proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword |
Line 540... | Line 44... | ||
540 | pop ebx |
44 | |
541 | ret |
45 | ret |
Line 553... | Line 57... | ||
553 | 57 | ||
554 | mov eax, [size] |
58 | mov eax, [size] |
555 | add eax, 4095 |
59 | add eax, 4095 |
556 | and eax, not 4095; |
60 | and eax, not 4095; |
557 | mov [size], eax |
61 | mov [size], eax |
558 | and eax, eax |
62 | test eax, eax |
- | 63 | jz .err |
|
559 | jz .err |
64 | |
560 | mov ebx, eax |
65 | mov ebx, eax |
561 | shr ebx, 12 |
66 | shr ebx, 12 |
Line 562... | Line 67... | ||
562 | mov [pages_count], ebx |
67 | mov [pages_count], ebx |
Line 615... | Line 120... | ||
615 | ret |
120 | ret |
616 | endp |
121 | endp |
Line 617... | Line 122... | ||
617 | 122 | ||
618 | align 4 |
123 | align 4 |
619 | proc kernel_free stdcall, base:dword |
- | |
620 | push ebx esi |
- | |
621 | - | ||
622 | mov ebx, heap_mutex |
- | |
623 | call wait_mutex ;ebx |
- | |
624 | - | ||
625 | mov eax, [base] |
- | |
626 | mov esi, [mem_used.fd] |
- | |
627 | @@: |
- | |
628 | cmp esi, mem_used.fd-MEM_LIST_OFFSET |
- | |
629 | je .fail |
- | |
630 | - | ||
631 | cmp [esi+block_base], eax |
- | |
632 | je .found |
- | |
633 | mov esi, [esi+list_fd] |
- | |
634 | jmp @b |
- | |
635 | .found: |
- | |
636 | cmp [esi+block_flags], USED_BLOCK |
- | |
Line 637... | Line -... | ||
637 | jne .fail |
- | |
638 | - | ||
639 | and [heap_mutex], 0 |
- | |
640 | - | ||
641 | push ecx |
- | |
642 | mov ecx, [esi+block_size]; |
- | |
643 | shr ecx, 12 |
- | |
644 | call release_pages ;eax, ecx |
- | |
645 | pop ecx |
- | |
646 | stdcall free_kernel_space, [base] |
- | |
647 | pop esi ebx |
- | |
648 | ret |
- | |
649 | .fail: |
- | |
650 | and [heap_mutex], 0 |
124 | proc kernel_free stdcall, base:dword |
651 | pop esi ebx |
125 | |
Line 652... | Line -... | ||
652 | ret |
- | |
653 | endp |
- | |
654 | - | ||
655 | - | ||
656 | align 4 |
- | |
657 | proc alloc_large stdcall, size:dword |
- | |
658 | local block_ind:DWORD |
- | |
659 | - | ||
660 | push ebx |
- | |
661 | push esi |
- | |
662 | push edi |
- | |
663 | - | ||
664 | mov eax, [size] |
- | |
665 | add eax, 0x3FFFFF |
- | |
666 | and eax, not 0x3FFFFF |
- | |
667 | mov [size], eax |
- | |
668 | - | ||
669 | ; mov ebx, heap_mutex |
- | |
670 | ; call wait_mutex ;ebx |
- | |
671 | - | ||
672 | ; cmp eax, [heap_free] |
- | |
673 | ; ja .error |
- | |
674 | - | ||
675 | call get_large_block ; eax |
- | |
676 | test edi, edi |
- | |
677 | jz .error |
- | |
678 | - | ||
679 | cmp [edi+block_flags], FREE_BLOCK |
- | |
680 | jne .error |
- | |
681 | - | ||
682 | mov [block_ind], ebx ;index of allocated block |
- | |
683 | - | ||
684 | mov eax, [edi+block_size] |
- | |
685 | cmp eax, [size] |
- | |
686 | je .m_eq_size |
- | |
687 | - | ||
688 | call alloc_mem_block |
- | |
689 | and eax, eax |
- | |
690 | jz .error |
- | |
691 | - | ||
692 | mov esi, eax ;esi - splitted block |
- | |
693 | - | ||
694 | mov [esi+block_next], edi |
- | |
695 | mov eax, [edi+block_prev] |
- | |
696 | mov [esi+block_prev], eax |
- | |
697 | mov [edi+block_prev], esi |
- | |
698 | mov [esi+list_fd], 0 |
- | |
699 | mov [esi+list_bk], 0 |
- | |
700 | test eax, eax |
- | |
701 | jz @f |
- | |
702 | mov [eax+block_next], esi |
- | |
703 | @@: |
- | |
704 | mov ebx, [edi+block_base] |
- | |
705 | mov [esi+block_base], ebx |
- | |
706 | mov edx, [size] |
- | |
707 | mov [esi+block_size], edx |
- | |
708 | add [edi+block_base], edx |
- | |
709 | sub [edi+block_size], edx |
- | |
710 | - | ||
711 | mov eax, [edi+block_size] |
- | |
712 | shr eax, 22 |
- | |
713 | dec eax |
- | |
714 | cmp eax, 31 |
- | |
715 | jna @f |
- | |
716 | mov eax, 31 |
- | |
717 | @@: |
- | |
718 | cmp eax, [block_ind] |
- | |
719 | je .m_eq_ind |
- | |
720 | - | ||
721 | remove_from_list edi |
- | |
722 | - | ||
723 | mov ecx, [block_ind] |
- | |
724 | mov [large_block_list+ecx*4], edx |
- | |
725 | - | ||
726 | test edx, edx |
- | |
727 | jnz @f |
- | |
728 | btr [large_block_mask], ecx |
- | |
729 | @@: |
- | |
730 | mov edx, [large_block_list+eax*4] |
- | |
731 | mov [edi+list_fd], edx |
- | |
732 | test edx, edx |
- | |
733 | jz @f |
- | |
734 | mov [edx+list_bk], edi |
- | |
735 | @@: |
- | |
736 | mov [large_block_list+eax*4], edi |
- | |
737 | bts [large_block_mask], eax |
- | |
738 | .m_eq_ind: |
- | |
739 | mov ecx, mem_used.fd-MEM_LIST_OFFSET |
- | |
740 | mov edx, [ecx+list_fd] |
- | |
741 | mov [esi+list_fd], edx |
- | |
742 | mov [esi+list_bk], ecx |
- | |
743 | mov [ecx+list_fd], esi |
- | |
744 | mov [edx+list_bk], esi |
- | |
745 | - | ||
746 | mov [esi+block_flags], USED_BLOCK |
- | |
747 | mov eax, [esi+block_base] |
- | |
748 | mov ebx, [size] |
- | |
749 | sub [heap_free], ebx |
- | |
750 | and [heap_mutex], 0 |
- | |
751 | pop edi |
- | |
752 | pop esi |
- | |
753 | pop ebx |
- | |
754 | ret |
- | |
755 | .m_eq_size: |
- | |
756 | remove_from_list edi |
- | |
757 | mov [large_block_list+ebx*4], edx |
- | |
758 | and edx, edx |
- | |
759 | jnz @f |
- | |
760 | btr [large_block_mask], ebx |
- | |
761 | @@: |
- | |
762 | mov ecx, mem_used.fd-MEM_LIST_OFFSET |
- | |
763 | mov edx, [ecx+list_fd] |
- | |
764 | mov [edi+list_fd], edx |
- | |
765 | mov [edi+list_bk], ecx |
- | |
766 | mov [ecx+list_fd], edi |
- | |
767 | mov [edx+list_bk], edi |
- | |
768 | - | ||
769 | mov [edi+block_flags], USED_BLOCK |
- | |
770 | mov eax, [edi+block_base] |
- | |
771 | mov ebx, [size] |
- | |
772 | sub [heap_free], ebx |
- | |
773 | and [heap_mutex], 0 |
- | |
774 | pop edi |
- | |
775 | pop esi |
- | |
776 | pop ebx |
- | |
777 | ret |
- | |
778 | .error: |
- | |
779 | xor eax, eax |
- | |
780 | mov [heap_mutex], eax |
- | |
781 | pop edi |
- | |
Line 782... | Line 126... | ||
782 | pop esi |
126 | ret |
783 | pop ebx |
127 | endp |
784 | ret |
128 | |
785 | endp |
129 |