Rev 2130 | Rev 2141 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2130 | Rev 2138 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2009. 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 -... | Line 8... | ||
- | 8 | $Revision: 2138 $ |
|
- | 9 | ||
- | 10 | macro __list_add new, prev, next |
|
- | 11 | { |
|
- | 12 | mov [next+LHEAD.prev], new |
|
- | 13 | mov [new+LHEAD.next], next |
|
- | 14 | mov [new+LHEAD.prev], prev |
|
- | 15 | mov [prev+LHEAD.next], new |
|
- | 16 | } |
|
- | 17 | ||
- | 18 | macro list_add new, head |
|
- | 19 | { |
|
- | 20 | mov eax, [head+LHEAD.next] |
|
- | 21 | __list_add new, head, eax |
|
- | 22 | } |
|
- | 23 | ||
- | 24 | macro list_add_tail new, head |
|
- | 25 | { |
|
- | 26 | mov eax, [head+LHEAD.prev] |
|
- | 27 | __list_add new, eax, head |
|
- | 28 | } |
|
- | 29 | ||
- | 30 | macro list_del entry |
|
- | 31 | { |
|
- | 32 | mov edx, [entry+list_fd] |
|
- | 33 | mov ecx, [entry+list_bk] |
|
- | 34 | mov [edx+list_bk], ecx |
|
Line 8... | Line 35... | ||
8 | $Revision: 2130 $ |
35 | mov [ecx+list_fd], edx |
- | 36 | } |
|
- | 37 | ||
9 | 38 | struc MEM_BLOCK |
|
10 | 39 | { |
|
11 | struc MEM_BLOCK |
- | |
12 | { .next_block dd ? |
- | |
13 | .prev_block dd ? ;+4 |
40 | .list LHEAD |
14 | .list_fd dd ? ;+8 |
41 | .next_block dd ? ;+8 |
15 | .list_bk dd ? ;+12 |
42 | .prev_block dd ? ;+4 |
16 | .base dd ? ;+16 |
43 | .base dd ? ;+16 |
17 | .size dd ? ;+20 |
44 | .size dd ? ;+20 |
Line 18... | Line -... | ||
18 | .flags dd ? ;+24 |
- | |
19 | .handle dd ? ;+28 |
45 | .flags dd ? ;+24 |
20 | } |
46 | .handle dd ? ;+28 |
21 | 47 | } |
|
Line 22... | Line 48... | ||
22 | MEM_LIST_OFFSET equ 8 |
48 | |
Line 30... | Line 56... | ||
30 | 56 | ||
Line 31... | Line 57... | ||
31 | MEM_BLOCK_SIZE equ 8*4 |
57 | MEM_BLOCK_SIZE equ 8*4 |
32 | 58 | ||
33 | block_next equ MEM_BLOCK.next_block |
59 | block_next equ MEM_BLOCK.next_block |
34 | block_prev equ MEM_BLOCK.prev_block |
60 | block_prev equ MEM_BLOCK.prev_block |
35 | list_fd equ MEM_BLOCK.list_fd |
61 | list_fd equ MEM_BLOCK.list.next |
36 | list_bk equ MEM_BLOCK.list_bk |
62 | list_bk equ MEM_BLOCK.list.prev |
37 | block_base equ MEM_BLOCK.base |
63 | block_base equ MEM_BLOCK.base |
Line 38... | Line 64... | ||
38 | block_size equ MEM_BLOCK.size |
64 | block_size equ MEM_BLOCK.size |
Line 45... | Line 71... | ||
45 | jna @f |
71 | jna @f |
46 | mov op, 63 |
72 | mov op, 63 |
47 | @@: |
73 | @@: |
48 | } |
74 | } |
Line 49... | Line -... | ||
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 | 75 | ||
81 | macro remove_from_used op |
76 | macro remove_from_used op |
82 | { |
77 | { |
83 | mov edx, [op+list_fd] |
78 | mov edx, [op+list_fd] |
84 | mov ecx, [op+list_bk] |
79 | mov ecx, [op+list_bk] |
85 | mov [edx+list_bk], ecx |
80 | mov [edx+list_bk], ecx |
86 | mov [ecx+list_fd], edx |
81 | mov [ecx+list_fd], edx |
87 | mov [op+list_fd], 0 |
82 | mov [op+list_fd], 0 |
88 | mov [op+list_bk], 0 |
83 | mov [op+list_bk], 0 |
Line -... | Line 84... | ||
- | 84 | } |
|
- | 85 | ||
- | 86 | ;Initial heap state |
|
- | 87 | ; |
|
- | 88 | ;+heap_size terminator USED_BLOCK |
|
- | 89 | ;+4096*MEM_BLOCK_SIZE free space FREE_BLOCK |
|
- | 90 | ;HEAP_BASE heap_descriptors USED_BLOCK |
|
89 | } |
91 | ; |
90 | 92 | ||
Line 91... | Line 93... | ||
91 | align 4 |
93 | align 4 |
92 | proc init_kernel_heap |
94 | proc init_kernel_heap |
- | 95 | ||
93 | 96 | mov ecx, 64 |
|
94 | mov ecx, 64 |
97 | mov edi, mem_block_list |
95 | mov edi, mem_block_list |
98 | @@: |
- | 99 | mov eax, edi |
|
Line 96... | Line 100... | ||
96 | xor eax, eax |
100 | stosd |
97 | cld |
101 | stosd |
98 | rep stosd |
102 | loop @B |
99 | 103 | ||
Line 100... | Line 104... | ||
100 | mov ecx, 512/4 |
104 | mov ecx, 512/4 |
101 | mov edi, mem_block_map |
105 | mov edi, mem_block_map |
102 | not eax |
106 | not eax |
Line 103... | Line 107... | ||
103 | rep stosd |
107 | rep stosd |
104 | 108 | ||
105 | mov [mem_block_start], mem_block_map |
109 | mov [mem_block_start], mem_block_map |
Line 106... | Line 110... | ||
106 | mov [mem_block_end], mem_block_map+512 |
110 | mov [mem_block_end], mem_block_map+512 |
107 | mov [mem_block_arr], HEAP_BASE |
111 | mov [mem_block_arr], HEAP_BASE |
Line 119... | Line 123... | ||
119 | add edi, 0x1000 |
123 | add edi, 0x1000 |
120 | add edx, 0x1000 |
124 | add edx, 0x1000 |
121 | dec ecx |
125 | dec ecx |
122 | jnz .l1 |
126 | jnz .l1 |
Line 123... | Line 127... | ||
123 | 127 | ||
124 | mov edi, HEAP_BASE |
128 | mov edi, HEAP_BASE ;descriptors |
- | 129 | mov ebx, HEAP_BASE+MEM_BLOCK_SIZE ;free space |
|
- | 130 | mov ecx, HEAP_BASE+MEM_BLOCK_SIZE*2 ;terminator |
|
125 | mov ebx, HEAP_BASE+MEM_BLOCK_SIZE |
131 | |
126 | xor eax, eax |
132 | xor eax, eax |
127 | mov [edi+block_next], ebx |
133 | mov [edi+block_next], ebx |
128 | mov [edi+block_prev], eax |
134 | mov [edi+block_prev], eax |
129 | mov [edi+list_fd], eax |
135 | mov [edi+list_fd], eax |
130 | mov [edi+list_bk], eax |
136 | mov [edi+list_bk], eax |
131 | mov [edi+block_base], HEAP_BASE |
137 | mov [edi+block_base], HEAP_BASE |
132 | mov [edi+block_size], 4096*MEM_BLOCK_SIZE |
138 | mov [edi+block_size], 4096*MEM_BLOCK_SIZE |
Line 133... | Line 139... | ||
133 | mov [edi+block_flags], USED_BLOCK |
139 | mov [edi+block_flags], USED_BLOCK |
- | 140 | ||
- | 141 | mov [ecx+block_next], eax |
|
- | 142 | mov [ecx+block_prev], ebx |
|
- | 143 | mov [edi+list_fd], eax |
|
- | 144 | mov [edi+list_bk], eax |
|
- | 145 | mov [edi+block_base], 0 |
|
- | 146 | mov [edi+block_size], 0 |
|
- | 147 | mov [edi+block_flags], USED_BLOCK |
|
134 | 148 | ||
135 | mov [ebx+block_next], eax |
149 | mov [ebx+block_next], ecx |
136 | mov [ebx+block_prev], eax |
150 | mov [ebx+block_prev], edi |
137 | mov [ebx+list_fd], eax |
151 | mov [ebx+list_fd], eax |
Line 138... | Line 152... | ||
138 | mov [ebx+list_bk], eax |
152 | mov [ebx+list_bk], eax |
Line 147... | Line 161... | ||
147 | mov [ebx+block_flags], FREE_BLOCK |
161 | mov [ebx+block_flags], FREE_BLOCK |
Line 148... | Line 162... | ||
148 | 162 | ||
149 | mov [mem_block_mask], eax |
163 | mov [mem_block_mask], eax |
Line 150... | Line 164... | ||
150 | mov [mem_block_mask+4],0x80000000 |
164 | mov [mem_block_mask+4],0x80000000 |
- | 165 | ||
- | 166 | mov ecx, mem_block_list+63*8 |
|
151 | 167 | list_add ebx, ecx |
|
152 | mov [mem_block_list+63*4], ebx |
168 | |
153 | mov byte [mem_block_map], 0xFC |
169 | mov byte [mem_block_map], 0xFC |
154 | mov ecx, heap_mutex |
170 | mov ecx, heap_mutex |
155 | call mutex_init |
171 | call mutex_init |
Line 189... | Line 205... | ||
189 | and edx, [esi] |
205 | and edx, [esi] |
190 | .find: |
206 | .find: |
191 | bsf edi, edx |
207 | bsf edi, edx |
192 | jz .high_mask |
208 | jz .high_mask |
193 | add ebx, edi |
209 | add ebx, edi |
194 | mov edi, [mem_block_list+ebx*4] |
210 | lea ecx, [mem_block_list+ebx*8] |
- | 211 | mov edi, ecx |
|
195 | .check_size: |
212 | .next: |
- | 213 | mov edi, [edi+list_fd] |
|
- | 214 | cmp edi, ecx |
|
- | 215 | je .err |
|
196 | cmp eax, [edi+block_size] |
216 | cmp eax, [edi+block_size] |
197 | ja .next |
217 | ja .next |
198 | ret |
218 | ret |
- | 219 | .err: |
|
- | 220 | xor edi, edi |
|
- | 221 | ret |
|
Line 199... | Line 222... | ||
199 | 222 | ||
200 | .high_mask: |
223 | .high_mask: |
201 | add esi, 4 |
224 | add esi, 4 |
202 | cmp esi, mem_block_mask+8 |
225 | cmp esi, mem_block_mask+8 |
203 | jae .err |
226 | jae .err |
204 | add ebx, 32 |
227 | add ebx, 32 |
205 | mov edx, [esi] |
228 | mov edx, [esi] |
206 | jmp .find |
- | |
207 | .next: |
- | |
208 | mov edi, [edi+list_fd] |
- | |
209 | test edi, edi |
- | |
210 | jnz .check_size |
- | |
211 | .err: |
- | |
212 | xor edi, edi |
- | |
Line 213... | Line 229... | ||
213 | ret |
229 | jmp .find |
214 | 230 | ||
Line 215... | Line 231... | ||
215 | align 4 |
231 | align 4 |
Line 233... | Line 249... | ||
233 | lea eax,[eax+ebx*8] |
249 | lea eax,[eax+ebx*8] |
234 | shl eax, 5 |
250 | shl eax, 5 |
235 | add eax, [mem_block_arr] |
251 | add eax, [mem_block_arr] |
236 | dec [free_blocks] |
252 | dec [free_blocks] |
237 | ret |
253 | ret |
- | 254 | ||
238 | align 4 |
255 | align 4 |
239 | free_mem_block: |
256 | free_mem_block: |
240 | mov dword [eax], 0 |
257 | mov dword [eax], 0 |
241 | mov dword [eax+4], 0 |
258 | mov dword [eax+4], 0 |
242 | mov dword [eax+8], 0 |
259 | mov dword [eax+8], 0 |
Line 267... | Line 284... | ||
267 | 284 | ||
268 | align 4 |
285 | align 4 |
269 | proc alloc_kernel_space stdcall, size:dword |
286 | proc alloc_kernel_space stdcall, size:dword |
Line -... | Line 287... | ||
- | 287 | local block_ind:DWORD |
|
- | 288 | ||
270 | local block_ind:DWORD |
289 | xchg bx, bx |
271 | 290 | ||
272 | push ebx |
291 | push ebx |
Line 273... | Line -... | ||
273 | push esi |
- | |
274 | push edi |
- | |
275 | - | ||
276 | mov ecx, heap_mutex |
292 | push esi |
277 | call mutex_lock |
293 | push edi |
278 | 294 | ||
279 | mov eax, [size] |
295 | mov eax, [size] |
Line 280... | Line 296... | ||
280 | add eax, 4095 |
296 | add eax, 4095 |
281 | and eax, not 4095 |
297 | and eax, not 4095 |
Line -... | Line 298... | ||
- | 298 | mov [size], eax |
|
- | 299 | ||
- | 300 | cmp eax, [heap_free] |
|
- | 301 | ja .error |
|
- | 302 | ||
282 | mov [size], eax |
303 | mov ecx, heap_mutex |
283 | 304 | call mutex_lock |
|
284 | cmp eax, [heap_free] |
305 | |
Line 285... | Line 306... | ||
285 | ja .error |
306 | mov eax, [size] |
286 | 307 | ||
Line 287... | Line 308... | ||
287 | call get_small_block ; eax |
308 | call get_small_block ; eax |
Line 288... | Line 309... | ||
288 | test edi, edi |
309 | test edi, edi |
289 | jz .error |
310 | jz .error_unlock |
290 | 311 | ||
Line 291... | Line 312... | ||
291 | cmp [edi+block_flags], FREE_BLOCK |
312 | cmp [edi+block_flags], FREE_BLOCK |
292 | jne .error |
313 | jne .error_unlock |
293 | 314 | ||
Line 294... | Line 315... | ||
294 | mov [block_ind], ebx ;index of allocated block |
315 | mov [block_ind], ebx ;index of allocated block |
Line 295... | Line 316... | ||
295 | 316 | ||
296 | mov eax, [edi+block_size] |
317 | mov eax, [edi+block_size] |
297 | cmp eax, [size] |
318 | cmp eax, [size] |
298 | je .m_eq_size |
319 | je .m_eq_size |
299 | 320 | ||
300 | call alloc_mem_block |
321 | call alloc_mem_block |
301 | and eax, eax |
- | |
302 | jz .error |
- | |
303 | 322 | and eax, eax |
|
304 | mov esi, eax ;esi - splitted block |
323 | jz .error_unlock |
305 | 324 | ||
306 | mov [esi+block_next], edi |
325 | mov esi, eax ;esi - splitted block |
307 | mov eax, [edi+block_prev] |
326 | |
308 | mov [esi+block_prev], eax |
327 | mov [esi+block_next], edi |
309 | mov [edi+block_prev], esi |
328 | mov eax, [edi+block_prev] |
310 | mov [esi+list_fd], 0 |
329 | mov [esi+block_prev], eax |
Line 311... | Line 330... | ||
311 | mov [esi+list_bk], 0 |
330 | mov [edi+block_prev], esi |
312 | and eax, eax |
- | |
313 | jz @f |
- | |
314 | mov [eax+block_next], esi |
331 | mov [esi+list_fd], 0 |
315 | @@: |
- | |
316 | mov ebx, [edi+block_base] |
- | |
317 | mov [esi+block_base], ebx |
- | |
318 | mov edx, [size] |
332 | mov [esi+list_bk], 0 |
319 | mov [esi+block_size], edx |
333 | mov [eax+block_next], esi |
Line 320... | Line 334... | ||
320 | add [edi+block_base], edx |
334 | |
Line 321... | Line 335... | ||
321 | sub [edi+block_size], edx |
335 | mov ebx, [edi+block_base] |
322 | 336 | mov [esi+block_base], ebx |
|
323 | mov eax, [edi+block_size] |
- | |
324 | shr eax, 12 |
337 | mov edx, [size] |
325 | sub eax, 1 |
338 | mov [esi+block_size], edx |
326 | cmp eax, 63 |
339 | add [edi+block_base], edx |
327 | jna @f |
340 | sub [edi+block_size], edx |
328 | mov eax, 63 |
- | |
329 | @@: |
- | |
330 | cmp eax, [block_ind] |
- | |
331 | je .m_eq_ind |
- | |
332 | - | ||
333 | remove_from_list edi |
- | |
334 | - | ||
335 | mov ecx, [block_ind] |
341 | |
- | 342 | mov eax, [edi+block_size] |
|
- | 343 | calc_index eax |
|
336 | mov [mem_block_list+ecx*4], edx |
344 | cmp eax, [block_ind] |
337 | 345 | je .m_eq_ind |
|
338 | test edx, edx |
346 | |
339 | jnz @f |
347 | list_del edi |
340 | btr [mem_block_mask], ecx |
348 | |
341 | @@: |
349 | mov ecx, [block_ind] |
342 | mov edx, [mem_block_list+eax*4] |
350 | lea edx, [mem_block_list+ecx*8] |
Line 343... | Line 351... | ||
343 | mov [edi+list_fd], edx |
351 | cmp edx, [edx] |
344 | test edx, edx |
352 | jnz @f |
345 | jz @f |
353 | btr [mem_block_mask], ecx |
- | 354 | @@: |
|
- | 355 | bts [mem_block_mask], eax |
|
- | 356 | lea edx, [mem_block_list+eax*8] ;edx= list head |
|
- | 357 | list_add edi, edx |
|
- | 358 | .m_eq_ind: |
|
- | 359 | mov ecx, mem_used.fd |
|
- | 360 | mov edx, [ecx+list_fd] |
|
- | 361 | mov [esi+list_fd], edx |
|
- | 362 | mov [esi+list_bk], ecx |
|
- | 363 | mov [ecx+list_fd], esi |
|
- | 364 | mov [edx+list_bk], esi |
|
- | 365 | ||
- | 366 | mov [esi+block_flags], USED_BLOCK |
|
346 | mov [edx+list_bk], edi |
367 | mov ebx, [size] |
347 | @@: |
368 | sub [heap_free], ebx |
348 | mov [mem_block_list+eax*4], edi |
369 | |
349 | bts [mem_block_mask], eax |
370 | ; pushad |
350 | .m_eq_ind: |
371 | ; mov eax, [esi+block_base] |
351 | mov ecx, mem_used.fd-MEM_LIST_OFFSET |
372 | ; mov ebx, [esi+block_base] |
352 | mov edx, [ecx+list_fd] |
373 | ; shr ebx, 6 |
353 | mov [esi+list_fd], edx |
374 | ; add eax, ebx |
354 | mov [esi+list_bk], ecx |
375 | ; shr ebx, 6 |
355 | mov [ecx+list_fd], esi |
376 | ; add eax, ebx |
356 | mov [edx+list_bk], esi |
377 | ; shr eax, 12 |
357 | 378 | ; and eax, 63 |
|
358 | mov [esi+block_flags], USED_BLOCK |
379 | ; inc [mem_hash_cnt+eax*4] |
359 | mov ebx, [size] |
380 | ; popad |
360 | sub [heap_free], ebx |
381 | |
361 | mov ecx, heap_mutex |
382 | mov ecx, heap_mutex |
362 | call mutex_unlock |
383 | call mutex_unlock |
363 | mov eax, [esi+block_base] |
384 | mov eax, [esi+block_base] |
364 | pop edi |
385 | pop edi |
365 | pop esi |
386 | pop esi |
Line 366... | Line 387... | ||
366 | pop ebx |
387 | pop ebx |
367 | ret |
388 | ret |
368 | .m_eq_size: |
389 | .m_eq_size: |
- | 390 | list_del edi |
|
- | 391 | lea edx, [mem_block_list+ebx*8] |
|
- | 392 | cmp edx, [edx] |
|
- | 393 | jnz @f |
|
- | 394 | btr [mem_block_mask], ebx |
|
- | 395 | @@: |
|
- | 396 | mov ecx, mem_used.fd |
|
- | 397 | mov edx, [ecx+list_fd] |
|
- | 398 | mov [edi+list_fd], edx |
|
- | 399 | mov [edi+list_bk], ecx |
|
- | 400 | mov [ecx+list_fd], edi |
|
- | 401 | mov [edx+list_bk], edi |
|
- | 402 | ||
369 | remove_from_list edi |
403 | mov [edi+block_flags], USED_BLOCK |
370 | mov [mem_block_list+ebx*4], edx |
404 | mov ebx, [size] |
371 | and edx, edx |
405 | sub [heap_free], ebx |
372 | jnz @f |
406 | |
373 | btr [mem_block_mask], ebx |
407 | ; pushad |
374 | @@: |
408 | ; mov eax, [edi+block_base] |
375 | mov ecx, mem_used.fd-MEM_LIST_OFFSET |
409 | ; mov ebx, [edi+block_base] |
- | 410 | ; shr ebx, 6 |
|
376 | mov edx, [ecx+list_fd] |
411 | ; add eax, ebx |
377 | mov [edi+list_fd], edx |
412 | ; shr ebx, 6 |
378 | mov [edi+list_bk], ecx |
413 | ; add eax, ebx |
- | 414 | ; shr eax, 12 |
|
379 | mov [ecx+list_fd], edi |
415 | ; and eax, 63 |
380 | mov [edx+list_bk], edi |
416 | ; inc [mem_hash_cnt+eax*4] |
381 | 417 | ; popad |
|
382 | mov [edi+block_flags], USED_BLOCK |
418 | |
383 | mov ebx, [size] |
419 | mov ecx, heap_mutex |
384 | sub [heap_free], ebx |
420 | call mutex_unlock |
Line 385... | Line 421... | ||
385 | mov ecx, heap_mutex |
421 | mov eax, [edi+block_base] |
386 | call mutex_unlock |
422 | pop edi |
- | 423 | pop esi |
|
387 | mov eax, [edi+block_base] |
424 | pop ebx |
388 | pop edi |
- | |
389 | pop esi |
- | |
Line 390... | Line 425... | ||
390 | pop ebx |
425 | ret |
391 | ret |
426 | |
Line 392... | Line 427... | ||
392 | .error: |
427 | .error_unlock: |
393 | mov ecx, heap_mutex |
428 | mov ecx, heap_mutex |
394 | call mutex_unlock |
429 | call mutex_unlock |
395 | xor eax, eax |
430 | .error: |
396 | pop edi |
431 | xor eax, eax |
Line 397... | Line 432... | ||
397 | pop esi |
432 | pop edi |
398 | pop ebx |
433 | pop esi |
399 | ret |
434 | pop ebx |
400 | endp |
435 | ret |
401 | 436 | endp |
|
402 | align 4 |
437 | |
403 | proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword |
438 | align 4 |
Line -... | Line 439... | ||
- | 439 | proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword |
|
- | 440 | ||
- | 441 | xchg bx, bx |
|
- | 442 | ||
- | 443 | mov ecx, heap_mutex |
|
- | 444 | call mutex_lock |
|
- | 445 | ||
- | 446 | mov eax, [base] |
|
- | 447 | mov esi, [mem_used.fd] |
|
- | 448 | @@: |
|
- | 449 | cmp esi, mem_used.fd |
|
- | 450 | je .fail |
|
- | 451 | ||
404 | push ebx |
452 | cmp [esi+block_base], eax |
405 | push esi |
453 | je .found |
Line 406... | Line 454... | ||
406 | push edi |
454 | mov esi, [esi+list_fd] |
407 | - | ||
408 | mov ecx, heap_mutex |
- | |
409 | call mutex_lock |
- | |
410 | 455 | jmp @b |
|
411 | mov eax, [base] |
456 | .found: |
Line 412... | Line 457... | ||
412 | mov esi, [mem_used.fd] |
457 | cmp [esi+block_flags], USED_BLOCK |
Line 413... | Line 458... | ||
413 | @@: |
458 | jne .fail |
414 | cmp esi, mem_used.fd-MEM_LIST_OFFSET |
459 | |
415 | je .fail |
- | |
416 | - | ||
417 | cmp [esi+block_base], eax |
- | |
418 | je .found |
460 | |
419 | mov esi, [esi+list_fd] |
- | |
420 | jmp @b |
461 | ; pushad |
421 | .found: |
462 | ; mov eax, [esi+block_base] |
Line -... | Line 463... | ||
- | 463 | ; mov ebx, [esi+block_base] |
|
- | 464 | ; shr ebx, 6 |
|
- | 465 | ; add eax, ebx |
|
- | 466 | ; shr ebx, 6 |
|
- | 467 | ; add eax, ebx |
|
- | 468 | ; shr eax, 12 |
|
- | 469 | ; and eax, 63 |
|
422 | cmp [esi+block_flags], USED_BLOCK |
470 | ; dec [mem_hash_cnt+eax*4] |
423 | jne .fail |
471 | ; popad |
424 | 472 | ||
425 | mov eax, [esi+block_size] |
473 | mov eax, [esi+block_size] |
426 | add [heap_free], eax |
- | |
427 | - | ||
428 | mov edi, [esi+block_next] |
- | |
429 | test edi, edi |
474 | add [heap_free], eax |
430 | jz .prev |
475 | |
Line 431... | Line 476... | ||
431 | 476 | mov edi, [esi+block_next] |
|
Line 432... | Line 477... | ||
432 | cmp [edi+block_flags], FREE_BLOCK |
477 | cmp [edi+block_flags], FREE_BLOCK |
433 | jne .prev |
478 | jne .prev |
434 | - | ||
435 | remove_from_free edi |
- | |
436 | 479 | ||
437 | mov edx, [edi+block_next] |
480 | list_del edi |
438 | mov [esi+block_next], edx |
481 | |
439 | test edx, edx |
482 | mov edx, [edi+block_next] |
Line 440... | Line 483... | ||
440 | jz @f |
483 | mov [esi+block_next], edx |
441 | 484 | mov [edx+block_prev], esi |
|
442 | mov [edx+block_prev], esi |
485 | mov ecx, [edi+block_size] |
443 | @@: |
486 | add [esi+block_size], ecx |
Line 444... | Line 487... | ||
444 | mov ecx, [edi+block_size] |
487 | |
445 | add [esi+block_size], ecx |
488 | calc_index ecx |
446 | 489 | ||
447 | mov eax, edi |
490 | lea edx, [mem_block_list+ecx*8] |
Line 448... | Line 491... | ||
448 | call free_mem_block |
491 | cmp edx, [edx] |
449 | .prev: |
492 | jne @F |
450 | mov edi, [esi+block_prev] |
493 | btr [mem_block_mask], ecx |
Line 451... | Line 494... | ||
451 | test edi, edi |
494 | @@: |
452 | jz .insert |
495 | mov eax, edi |
453 | - | ||
454 | cmp [edi+block_flags], FREE_BLOCK |
- | |
455 | jne .insert |
- | |
456 | 496 | call free_mem_block |
|
457 | remove_from_used esi |
497 | .prev: |
458 | - | ||
459 | mov edx, [esi+block_next] |
- | |
460 | mov [edi+block_next], edx |
- | |
461 | test edx, edx |
- | |
462 | jz @f |
- | |
463 | mov [edx+block_prev], edi |
498 | mov edi, [esi+block_prev] |
464 | @@: |
- | |
465 | mov eax, esi |
- | |
466 | call free_mem_block |
499 | cmp [edi+block_flags], FREE_BLOCK |
- | 500 | jne .insert |
|
- | 501 | ||
467 | 502 | remove_from_used esi |
|
468 | mov ecx, [edi+block_size] |
503 | |
469 | mov eax, [esi+block_size] |
504 | mov edx, [esi+block_next] |
470 | add eax, ecx |
505 | mov [edi+block_next], edx |
471 | mov [edi+block_size], eax |
506 | mov [edx+block_prev], edi |
472 | - | ||
473 | calc_index eax |
- | |
474 | calc_index ecx |
- | |
475 | cmp eax, ecx |
507 | |
476 | je .m_eq |
508 | mov eax, esi |
477 | 509 | call free_mem_block |
|
478 | push ecx |
- | |
- | 510 | ||
479 | remove_from_list edi |
511 | mov ecx, [edi+block_size] |
480 | pop ecx |
512 | mov eax, [esi+block_size] |
- | 513 | add eax, ecx |
|
- | 514 | mov [edi+block_size], eax |
|
Line 481... | Line -... | ||
481 | - | ||
482 | cmp [mem_block_list+ecx*4], edi |
- | |
483 | jne @f |
- | |
484 | mov [mem_block_list+ecx*4], edx |
- | |
485 | @@: |
- | |
486 | cmp [mem_block_list+ecx*4], 0 |
- | |
487 | jne @f |
- | |
488 | btr [mem_block_mask], ecx |
- | |
489 | @@: |
- | |
490 | mov esi, [mem_block_list+eax*4] |
- | |
491 | mov [mem_block_list+eax*4], edi |
- | |
492 | mov [edi+list_fd], esi |
- | |
493 | test esi, esi |
- | |
494 | jz @f |
- | |
495 | mov [esi+list_bk], edi |
- | |
496 | @@: |
- | |
497 | bts [mem_block_mask], eax |
- | |
498 | .m_eq: |
515 | |
499 | mov ecx, heap_mutex |
516 | calc_index eax ;new index |
500 | call mutex_unlock |
517 | calc_index ecx ;old index |
501 | xor eax, eax |
518 | cmp eax, ecx |
502 | not eax |
- | |
503 | pop edi |
- | |
504 | pop esi |
- | |
505 | pop ebx |
519 | je .m_eq |
506 | ret |
520 | |
Line 507... | Line 521... | ||
507 | .insert: |
521 | push ecx |
508 | remove_from_used esi |
522 | list_del edi |
Line 619... | Line 633... | ||
619 | call mutex_lock |
633 | call mutex_lock |
Line 620... | Line 634... | ||
620 | 634 | ||
621 | mov eax, [base] |
635 | mov eax, [base] |
622 | mov esi, [mem_used.fd] |
636 | mov esi, [mem_used.fd] |
623 | @@: |
637 | @@: |
624 | cmp esi, mem_used.fd-MEM_LIST_OFFSET |
638 | cmp esi, mem_used.fd |
Line 625... | Line 639... | ||
625 | je .fail |
639 | je .fail |
626 | 640 | ||
627 | cmp [esi+block_base], eax |
641 | cmp [esi+block_base], eax |
Line 1542... | Line 1556... | ||
1542 | pop edi |
1556 | pop edi |
1543 | pop esi |
1557 | pop esi |
1544 | .fail: |
1558 | .fail: |
1545 | ret |
1559 | ret |
1546 | endp=> |
1560 | endp |
- | 1561 | ||
- | 1562 | align 4 |
|
- | 1563 | sys_perf: |
|
- | 1564 | test ecx, ecx |
|
- | 1565 | jz .fail |
|
- | 1566 | ||
- | 1567 | mov edi, ecx |
|
- | 1568 | mov esi, mem_hash_cnt |
|
- | 1569 | mov ecx, 64 |
|
- | 1570 | rep movsd |
|
- | 1571 | .fail: |
|
- | 1572 | ret=> |