Rev 438 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 438 | Rev 444 | ||
---|---|---|---|
- | 1 | $Revision: 431 $ |
|
- | 2 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
- | 3 | ;; ;; |
|
- | 4 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
|
- | 5 | ;; Distributed under terms of the GNU General Public License ;; |
|
- | 6 | ;; ;; |
|
- | 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
|
- | 8 | ||
1 | ; Small heap based on malloc/free/realloc written by Doug Lea |
9 | ; Small heap based on malloc/free/realloc written by Doug Lea |
2 | ; Version 2.8.3 Thu Sep 22 11:16:15 2005 Doug Lea (dl at gee) |
10 | ; Version 2.8.3 Thu Sep 22 11:16:15 2005 Doug Lea (dl at gee) |
3 | ; Source ftp://gee.cs.oswego.edu/pub/misc/malloc.c |
11 | ; Source ftp://gee.cs.oswego.edu/pub/misc/malloc.c |
4 | ; License http://creativecommons.org/licenses/publicdomain. |
12 | ; License http://creativecommons.org/licenses/publicdomain. |
5 | 13 | ||
6 | 14 | ||
7 | ; eax= size |
15 | ; eax= size |
8 | 16 | ||
9 | ; temp |
17 | ; temp |
10 | ; esi= nb |
18 | ; esi= nb |
11 | ; ebx= idx |
19 | ; ebx= idx |
12 | ; |
20 | ; |
13 | malloc: |
21 | malloc: |
14 | push esi |
22 | push esi |
15 | 23 | ||
16 | ; nb = ((size+7)&~7)+8; |
24 | ; nb = ((size+7)&~7)+8; |
17 | 25 | ||
18 | mov esi, eax ;size |
26 | mov esi, eax ;size |
19 | add esi, 7 |
27 | add esi, 7 |
20 | and esi, -8 |
28 | and esi, -8 |
21 | add esi, 8 |
29 | add esi, 8 |
22 | 30 | ||
23 | mov ebx, mst.mutex |
31 | mov ebx, mst.mutex |
24 | call wait_mutex ;ebx |
32 | call wait_mutex ;ebx |
25 | 33 | ||
26 | cmp esi, 256 |
34 | cmp esi, 256 |
27 | jae .large |
35 | jae .large |
28 | 36 | ||
29 | mov ecx, esi |
37 | mov ecx, esi |
30 | shr ecx, 3 |
38 | shr ecx, 3 |
31 | or eax, -1 |
39 | or eax, -1 |
32 | shl eax, cl |
40 | shl eax, cl |
33 | and eax, [mst.smallmap] |
41 | and eax, [mst.smallmap] |
34 | jz .small |
42 | jz .small |
35 | 43 | ||
36 | push ebp |
44 | push ebp |
37 | push edi |
45 | push edi |
38 | 46 | ||
39 | bsf eax, eax |
47 | bsf eax, eax |
40 | mov ebx, eax |
48 | mov ebx, eax |
41 | 49 | ||
42 | ; psize= idx<<3; |
50 | ; psize= idx<<3; |
43 | ; B = &ms.smallbins[idx]; |
51 | ; B = &ms.smallbins[idx]; |
44 | ; p = B->fd; |
52 | ; p = B->fd; |
45 | ; F = p->fd; |
53 | ; F = p->fd; |
46 | ; rsize= psize-nb; |
54 | ; rsize= psize-nb; |
47 | 55 | ||
48 | lea ebp, [eax*8] ;ebp= psize |
56 | lea ebp, [eax*8] ;ebp= psize |
49 | shl eax, 4 |
57 | shl eax, 4 |
50 | lea edi, [mst.smallbins+eax] ;edi= B |
58 | lea edi, [mst.smallbins+eax] ;edi= B |
51 | mov edx, [edi+8] ;edx= p |
59 | mov edx, [edi+8] ;edx= p |
52 | mov eax, [edx+8] ;eax= F |
60 | mov eax, [edx+8] ;eax= F |
53 | mov ecx, ebp |
61 | mov ecx, ebp |
54 | sub ecx, esi ;ecx= rsize |
62 | sub ecx, esi ;ecx= rsize |
55 | 63 | ||
56 | ; if (B == F) |
64 | ; if (B == F) |
57 | cmp edi, eax |
65 | cmp edi, eax |
58 | jne @F |
66 | jne @F |
59 | 67 | ||
60 | btr [mst.smallmap], ebx |
68 | btr [mst.smallmap], ebx |
61 | @@: |
69 | @@: |
62 | 70 | ||
63 | ; B->fd = F; |
71 | ; B->fd = F; |
64 | ; F->bk = B; |
72 | ; F->bk = B; |
65 | ; if(rsize<16) |
73 | ; if(rsize<16) |
66 | 74 | ||
67 | cmp ecx, 16 |
75 | cmp ecx, 16 |
68 | mov [edi+8], eax |
76 | mov [edi+8], eax |
69 | mov [eax+12], edi |
77 | mov [eax+12], edi |
70 | jae .split |
78 | jae .split |
71 | 79 | ||
72 | ; p->head = psize|PINUSE_BIT|CINUSE_BIT; |
80 | ; p->head = psize|PINUSE_BIT|CINUSE_BIT; |
73 | ; (p + psize)->head |= PINUSE_BIT; |
81 | ; (p + psize)->head |= PINUSE_BIT; |
74 | 82 | ||
75 | lea eax, [edx+8] |
83 | lea eax, [edx+8] |
76 | or dword [edx+ebp+4], 1 |
84 | or dword [edx+ebp+4], 1 |
77 | 85 | ||
78 | or ebp, 3 |
86 | or ebp, 3 |
79 | mov [edx+4], ebp |
87 | mov [edx+4], ebp |
80 | 88 | ||
81 | pop edi |
89 | pop edi |
82 | pop ebp |
90 | pop ebp |
83 | .done: |
91 | .done: |
84 | pop esi |
92 | pop esi |
85 | mov [mst.mutex], 0 |
93 | mov [mst.mutex], 0 |
86 | ret |
94 | ret |
87 | .split: |
95 | .split: |
88 | lea ebx, [edx+8] ;ebx=mem |
96 | lea ebx, [edx+8] ;ebx=mem |
89 | 97 | ||
90 | ; r = chunk_plus_offset(p, nb); |
98 | ; r = chunk_plus_offset(p, nb); |
91 | ; p->head = nb|PINUSE_BIT|CINUSE_BIT; |
99 | ; p->head = nb|PINUSE_BIT|CINUSE_BIT; |
92 | ; r->head = rsize|PINUSE_BIT; |
100 | ; r->head = rsize|PINUSE_BIT; |
93 | 101 | ||
94 | lea eax, [edx+esi] ;eax= r |
102 | lea eax, [edx+esi] ;eax= r |
95 | or esi, 3 |
103 | or esi, 3 |
96 | mov [edx+4], esi |
104 | mov [edx+4], esi |
97 | 105 | ||
98 | mov edx, ecx |
106 | mov edx, ecx |
99 | or edx, 1 |
107 | or edx, 1 |
100 | mov [eax+4], edx |
108 | mov [eax+4], edx |
101 | 109 | ||
102 | ; (r + rsize)->prev_foot = rsize; |
110 | ; (r + rsize)->prev_foot = rsize; |
103 | 111 | ||
104 | mov [eax+ecx], ecx |
112 | mov [eax+ecx], ecx |
105 | 113 | ||
106 | ; I = rsize>>3; |
114 | ; I = rsize>>3; |
107 | 115 | ||
108 | shr ecx, 3 |
116 | shr ecx, 3 |
109 | 117 | ||
110 | ; ms.smallmap |= 1<< I; |
118 | ; ms.smallmap |= 1<< I; |
111 | bts [mst.smallmap], ecx |
119 | bts [mst.smallmap], ecx |
112 | 120 | ||
113 | ; B = &ms.smallbins[I]; |
121 | ; B = &ms.smallbins[I]; |
114 | 122 | ||
115 | shl ecx, 4 |
123 | shl ecx, 4 |
116 | pop edi |
124 | pop edi |
117 | pop ebp |
125 | pop ebp |
118 | add ecx, mst.smallbins ;ecx= B |
126 | add ecx, mst.smallbins ;ecx= B |
119 | 127 | ||
120 | mov edx, [ecx+8] ; F = B->fd; |
128 | mov edx, [ecx+8] ; F = B->fd; |
121 | mov [ecx+8], eax ; B->fd = r; |
129 | mov [ecx+8], eax ; B->fd = r; |
122 | mov [edx+12], eax ; F->bk = r; |
130 | mov [edx+12], eax ; F->bk = r; |
123 | mov [eax+8], edx ; r->fd = F; |
131 | mov [eax+8], edx ; r->fd = F; |
124 | mov [eax+12], ecx ; r->bk = B; |
132 | mov [eax+12], ecx ; r->bk = B; |
125 | mov eax, ebx |
133 | mov eax, ebx |
126 | pop esi |
134 | pop esi |
127 | ret |
135 | ret |
128 | .small: |
136 | .small: |
129 | 137 | ||
130 | ; if (ms.treemap != 0 && (mem = malloc_small(nb)) != 0) |
138 | ; if (ms.treemap != 0 && (mem = malloc_small(nb)) != 0) |
131 | 139 | ||
132 | cmp [mst.treemap], 0 |
140 | cmp [mst.treemap], 0 |
133 | je .from_top |
141 | je .from_top |
134 | mov eax, esi |
142 | mov eax, esi |
135 | call malloc_small |
143 | call malloc_small |
136 | test eax, eax |
144 | test eax, eax |
137 | jz .from_top |
145 | jz .from_top |
138 | pop esi |
146 | pop esi |
139 | and [mst.mutex], 0 |
147 | and [mst.mutex], 0 |
140 | ret |
148 | ret |
141 | .large: |
149 | .large: |
142 | 150 | ||
143 | ; if (ms.treemap != 0 && (mem = malloc_large(nb)) != 0) |
151 | ; if (ms.treemap != 0 && (mem = malloc_large(nb)) != 0) |
144 | 152 | ||
145 | cmp [mst.treemap], 0 |
153 | cmp [mst.treemap], 0 |
146 | je .from_top |
154 | je .from_top |
147 | 155 | ||
148 | call malloc_large ;esi= nb |
156 | call malloc_large ;esi= nb |
149 | test eax, eax |
157 | test eax, eax |
150 | jne .done |
158 | jne .done |
151 | .from_top: |
159 | .from_top: |
152 | 160 | ||
153 | ; if (nb < ms.topsize) |
161 | ; if (nb < ms.topsize) |
154 | 162 | ||
155 | mov eax, [mst.topsize] |
163 | mov eax, [mst.topsize] |
156 | cmp esi, eax |
164 | cmp esi, eax |
157 | jae .fail |
165 | jae .fail |
158 | 166 | ||
159 | ; rsize = ms.topsize -= nb; |
167 | ; rsize = ms.topsize -= nb; |
160 | ; p = ms.top; |
168 | ; p = ms.top; |
161 | 169 | ||
162 | mov ecx, [mst.top] |
170 | mov ecx, [mst.top] |
163 | sub eax, esi |
171 | sub eax, esi |
164 | mov [mst.topsize], eax |
172 | mov [mst.topsize], eax |
165 | 173 | ||
166 | ; r = ms.top = chunk_plus_offset(p, nb); |
174 | ; r = ms.top = chunk_plus_offset(p, nb); |
167 | ; r->head = rsize | PINUSE_BIT; |
175 | ; r->head = rsize | PINUSE_BIT; |
168 | ; p->head = nb |PINUSE_BIT|CINUSE_BIT; |
176 | ; p->head = nb |PINUSE_BIT|CINUSE_BIT; |
169 | 177 | ||
170 | lea edx, [ecx+esi] |
178 | lea edx, [ecx+esi] |
171 | or eax, 1 |
179 | or eax, 1 |
172 | mov [mst.top], edx |
180 | mov [mst.top], edx |
173 | or esi, 3 |
181 | or esi, 3 |
174 | mov [edx+4], eax |
182 | mov [edx+4], eax |
175 | mov [ecx+4], esi |
183 | mov [ecx+4], esi |
176 | lea eax, [ecx+8] |
184 | lea eax, [ecx+8] |
177 | pop esi |
185 | pop esi |
178 | and [mst.mutex], 0 |
186 | and [mst.mutex], 0 |
179 | ret |
187 | ret |
180 | .fail: |
188 | .fail: |
181 | xor eax, eax |
189 | xor eax, eax |
182 | pop esi |
190 | pop esi |
183 | and [mst.mutex], 0 |
191 | and [mst.mutex], 0 |
184 | ret |
192 | ret |
185 | 193 | ||
186 | ; param |
194 | ; param |
187 | ; eax= mem |
195 | ; eax= mem |
188 | 196 | ||
189 | align 4 |
197 | align 4 |
190 | free: |
198 | free: |
191 | push edi |
199 | push edi |
192 | mov edi, eax |
200 | mov edi, eax |
193 | add edi, -8 |
201 | add edi, -8 |
194 | 202 | ||
195 | ; if(p->head & CINUSE_BIT) |
203 | ; if(p->head & CINUSE_BIT) |
196 | 204 | ||
197 | test byte [edi+4], 2 |
205 | test byte [edi+4], 2 |
198 | je .fail |
206 | je .fail |
199 | 207 | ||
200 | mov ebx, mst.mutex |
208 | mov ebx, mst.mutex |
201 | call wait_mutex ;ebx |
209 | call wait_mutex ;ebx |
202 | 210 | ||
203 | ; psize = p->head & (~3); |
211 | ; psize = p->head & (~3); |
204 | 212 | ||
205 | mov eax, [edi+4] |
213 | mov eax, [edi+4] |
206 | push esi |
214 | push esi |
207 | mov esi, eax |
215 | mov esi, eax |
208 | and esi, -4 |
216 | and esi, -4 |
209 | 217 | ||
210 | ; next = chunk_plus_offset(p, psize); |
218 | ; next = chunk_plus_offset(p, psize); |
211 | ; if(!(p->head & PINUSE_BIT)) |
219 | ; if(!(p->head & PINUSE_BIT)) |
212 | 220 | ||
213 | test al, 1 |
221 | test al, 1 |
214 | lea ebx, [esi+edi] |
222 | lea ebx, [esi+edi] |
215 | jne .next |
223 | jne .next |
216 | 224 | ||
217 | ; prevsize = p->prev_foot; |
225 | ; prevsize = p->prev_foot; |
218 | ; prev=p - prevsize; |
226 | ; prev=p - prevsize; |
219 | ; psize += prevsize; |
227 | ; psize += prevsize; |
220 | ; p = prev; |
228 | ; p = prev; |
221 | 229 | ||
222 | mov ecx, [edi] ;ecx= prevsize |
230 | mov ecx, [edi] ;ecx= prevsize |
223 | add esi, ecx ;esi= psize |
231 | add esi, ecx ;esi= psize |
224 | sub edi, ecx ;edi= p |
232 | sub edi, ecx ;edi= p |
225 | 233 | ||
226 | ; if (prevsize < 256) |
234 | ; if (prevsize < 256) |
227 | 235 | ||
228 | cmp ecx, 256 |
236 | cmp ecx, 256 |
229 | jae .unlink_large |
237 | jae .unlink_large |
230 | 238 | ||
231 | mov eax, [edi+8] ;F = p->fd; |
239 | mov eax, [edi+8] ;F = p->fd; |
232 | mov edx, [edi+12] ;B = p->bk; |
240 | mov edx, [edi+12] ;B = p->bk; |
233 | 241 | ||
234 | ; if (F == B) |
242 | ; if (F == B) |
235 | ; ms.smallmap &= ~(1<< I); |
243 | ; ms.smallmap &= ~(1<< I); |
236 | shr ecx, 3 |
244 | shr ecx, 3 |
237 | cmp eax, edx |
245 | cmp eax, edx |
238 | jne @F |
246 | jne @F |
239 | and [mst.smallmap], ecx |
247 | and [mst.smallmap], ecx |
240 | @@: |
248 | @@: |
241 | mov [eax+12], edx ;F->bk = B; |
249 | mov [eax+12], edx ;F->bk = B; |
242 | mov [edx+8], eax ;B->fd = F |
250 | mov [edx+8], eax ;B->fd = F |
243 | jmp .next |
251 | jmp .next |
244 | .unlink_large: |
252 | .unlink_large: |
245 | mov edx, edi |
253 | mov edx, edi |
246 | call unlink_large_chunk |
254 | call unlink_large_chunk |
247 | .next: |
255 | .next: |
248 | 256 | ||
249 | ; if(next->head & PINUSE_BIT) |
257 | ; if(next->head & PINUSE_BIT) |
250 | 258 | ||
251 | mov eax, [ebx+4] |
259 | mov eax, [ebx+4] |
252 | test al, 1 |
260 | test al, 1 |
253 | jz .fail2 |
261 | jz .fail2 |
254 | 262 | ||
255 | ; if (! (next->head & CINUSE_BIT)) |
263 | ; if (! (next->head & CINUSE_BIT)) |
256 | 264 | ||
257 | test al, 2 |
265 | test al, 2 |
258 | jnz .fix_next |
266 | jnz .fix_next |
259 | 267 | ||
260 | ; if (next == ms.top) |
268 | ; if (next == ms.top) |
261 | 269 | ||
262 | cmp ebx, [mst.top] |
270 | cmp ebx, [mst.top] |
263 | jne @F |
271 | jne @F |
264 | 272 | ||
265 | ; tsize = ms.topsize += psize; |
273 | ; tsize = ms.topsize += psize; |
266 | 274 | ||
267 | mov eax, [mst.topsize] |
275 | mov eax, [mst.topsize] |
268 | add eax, esi |
276 | add eax, esi |
269 | mov [mst.topsize], eax |
277 | mov [mst.topsize], eax |
270 | 278 | ||
271 | ; ms.top = p; |
279 | ; ms.top = p; |
272 | ; p->head = tsize | PINUSE_BIT; |
280 | ; p->head = tsize | PINUSE_BIT; |
273 | 281 | ||
274 | or eax, 1 |
282 | or eax, 1 |
275 | mov [mst.top], edi |
283 | mov [mst.top], edi |
276 | mov [edi+4], eax |
284 | mov [edi+4], eax |
277 | .fail2: |
285 | .fail2: |
278 | and [mst.mutex], 0 |
286 | and [mst.mutex], 0 |
279 | pop esi |
287 | pop esi |
280 | .fail: |
288 | .fail: |
281 | pop edi |
289 | pop edi |
282 | ret |
290 | ret |
283 | @@: |
291 | @@: |
284 | 292 | ||
285 | ; nsize = next->head & ~INUSE_BITS; |
293 | ; nsize = next->head & ~INUSE_BITS; |
286 | 294 | ||
287 | and eax, -4 |
295 | and eax, -4 |
288 | add esi, eax ;psize += nsize; |
296 | add esi, eax ;psize += nsize; |
289 | 297 | ||
290 | ; if (nsize < 256) |
298 | ; if (nsize < 256) |
291 | 299 | ||
292 | cmp eax, 256 |
300 | cmp eax, 256 |
293 | jae .unl_large |
301 | jae .unl_large |
294 | 302 | ||
295 | mov edx, [ebx+8] ;F = next->fd |
303 | mov edx, [ebx+8] ;F = next->fd |
296 | mov ebx, [ebx+12] ;B = next->bk |
304 | mov ebx, [ebx+12] ;B = next->bk |
297 | 305 | ||
298 | ; if (F == B) |
306 | ; if (F == B) |
299 | 307 | ||
300 | cmp edx, ebx |
308 | cmp edx, ebx |
301 | jne @F |
309 | jne @F |
302 | mov ecx, eax |
310 | mov ecx, eax |
303 | shr ecx, 3 |
311 | shr ecx, 3 |
304 | btr [mst.smallmap], ecx |
312 | btr [mst.smallmap], ecx |
305 | @@: |
313 | @@: |
306 | mov [edx+12], ebx ;F->bk = B |
314 | mov [edx+12], ebx ;F->bk = B |
307 | 315 | ||
308 | ; p->head = psize|PINUSE_BIT; |
316 | ; p->head = psize|PINUSE_BIT; |
309 | 317 | ||
310 | mov ecx, esi |
318 | mov ecx, esi |
311 | mov [ebx+8], edx |
319 | mov [ebx+8], edx |
312 | or ecx, 1 |
320 | or ecx, 1 |
313 | mov [edi+4], ecx |
321 | mov [edi+4], ecx |
314 | 322 | ||
315 | ; (p+psize)->prev_foot = psize; |
323 | ; (p+psize)->prev_foot = psize; |
316 | 324 | ||
317 | mov [esi+edi], esi |
325 | mov [esi+edi], esi |
318 | 326 | ||
319 | ; insert_chunk(p,psize); |
327 | ; insert_chunk(p,psize); |
320 | 328 | ||
321 | mov eax, esi |
329 | mov eax, esi |
322 | pop esi |
330 | pop esi |
323 | mov ecx, edi |
331 | mov ecx, edi |
324 | pop edi |
332 | pop edi |
325 | jmp insert_chunk |
333 | jmp insert_chunk |
326 | .unl_large: |
334 | .unl_large: |
327 | 335 | ||
328 | ; unlink_large_chunk((tchunkptr)next); |
336 | ; unlink_large_chunk((tchunkptr)next); |
329 | 337 | ||
330 | mov edx, ebx |
338 | mov edx, ebx |
331 | call unlink_large_chunk |
339 | call unlink_large_chunk |
332 | ; p->head = psize|PINUSE_BIT; |
340 | ; p->head = psize|PINUSE_BIT; |
333 | 341 | ||
334 | mov ecx, esi |
342 | mov ecx, esi |
335 | or ecx, 1 |
343 | or ecx, 1 |
336 | mov [edi+4], ecx |
344 | mov [edi+4], ecx |
337 | 345 | ||
338 | ; (p+psize)->prev_foot = psize; |
346 | ; (p+psize)->prev_foot = psize; |
339 | 347 | ||
340 | mov [esi+edi], esi |
348 | mov [esi+edi], esi |
341 | 349 | ||
342 | ; insert_chunk(p,psize); |
350 | ; insert_chunk(p,psize); |
343 | 351 | ||
344 | mov eax, esi |
352 | mov eax, esi |
345 | pop esi |
353 | pop esi |
346 | mov ecx, edi |
354 | mov ecx, edi |
347 | pop edi |
355 | pop edi |
348 | jmp insert_chunk |
356 | jmp insert_chunk |
349 | .fix_next: |
357 | .fix_next: |
350 | 358 | ||
351 | ; (p+psize)->prev_foot = psize; |
359 | ; (p+psize)->prev_foot = psize; |
352 | ; next->head &= ~PINUSE_BIT; |
360 | ; next->head &= ~PINUSE_BIT; |
353 | ; p->head = psize|PINUSE_BIT; |
361 | ; p->head = psize|PINUSE_BIT; |
354 | 362 | ||
355 | and eax, -2 |
363 | and eax, -2 |
356 | mov edx, esi |
364 | mov edx, esi |
357 | mov [ebx+4], eax |
365 | mov [ebx+4], eax |
358 | or edx, 1 |
366 | or edx, 1 |
359 | mov [edi+4], edx |
367 | mov [edi+4], edx |
360 | 368 | ||
361 | ; (p+psize)->prev_foot = psize; |
369 | ; (p+psize)->prev_foot = psize; |
362 | 370 | ||
363 | mov [esi+edi], esi |
371 | mov [esi+edi], esi |
364 | ; insert_chunk(p,psize); |
372 | ; insert_chunk(p,psize); |
365 | 373 | ||
366 | mov eax, esi |
374 | mov eax, esi |
367 | pop esi |
375 | pop esi |
368 | mov ecx, edi |
376 | mov ecx, edi |
369 | pop edi |
377 | pop edi |
370 | jmp insert_chunk |
378 | jmp insert_chunk |
371 | 379 | ||
372 | ; param |
380 | ; param |
373 | ; ecx = chunk |
381 | ; ecx = chunk |
374 | ; eax = size |
382 | ; eax = size |
375 | 383 | ||
376 | align 4 |
384 | align 4 |
377 | insert_chunk: |
385 | insert_chunk: |
378 | 386 | ||
379 | cmp eax, 256 |
387 | cmp eax, 256 |
380 | push esi |
388 | push esi |
381 | mov esi, ecx |
389 | mov esi, ecx |
382 | jae .large |
390 | jae .large |
383 | 391 | ||
384 | ; I = S>>3; |
392 | ; I = S>>3; |
385 | ; ms.smallmap |= 1<< I; |
393 | ; ms.smallmap |= 1<< I; |
386 | 394 | ||
387 | shr eax, 3 |
395 | shr eax, 3 |
388 | bts [mst.smallmap], eax |
396 | bts [mst.smallmap], eax |
389 | 397 | ||
390 | ; B = &ms.smallbins[I]; |
398 | ; B = &ms.smallbins[I]; |
391 | 399 | ||
392 | shl eax, 4 |
400 | shl eax, 4 |
393 | add eax, mst.smallbins |
401 | add eax, mst.smallbins |
394 | mov edx, [eax+8] ;F = B->fd |
402 | mov edx, [eax+8] ;F = B->fd |
395 | mov [eax+8], esi ;B->fd = P |
403 | mov [eax+8], esi ;B->fd = P |
396 | mov [edx+12], esi ;F->bk = P |
404 | mov [edx+12], esi ;F->bk = P |
397 | mov [esi+8], edx ;P->fd = F |
405 | mov [esi+8], edx ;P->fd = F |
398 | mov [esi+12], eax ;P->bk = B |
406 | mov [esi+12], eax ;P->bk = B |
399 | pop esi |
407 | pop esi |
400 | and [mst.mutex], 0 |
408 | and [mst.mutex], 0 |
401 | ret |
409 | ret |
402 | .large: |
410 | .large: |
403 | mov ebx, eax |
411 | mov ebx, eax |
404 | call insert_large_chunk |
412 | call insert_large_chunk |
405 | pop esi |
413 | pop esi |
406 | and [mst.mutex], 0 |
414 | and [mst.mutex], 0 |
407 | ret |
415 | ret |
408 | 416 | ||
409 | align 4 |
417 | align 4 |
410 | 418 | ||
411 | ; param |
419 | ; param |
412 | ; esi= chunk |
420 | ; esi= chunk |
413 | ; ebx= size |
421 | ; ebx= size |
414 | 422 | ||
415 | align 4 |
423 | align 4 |
416 | insert_large_chunk: |
424 | insert_large_chunk: |
417 | 425 | ||
418 | ; I = compute_tree_index(S); |
426 | ; I = compute_tree_index(S); |
419 | 427 | ||
420 | mov edx, ebx |
428 | mov edx, ebx |
421 | shr edx, 8 |
429 | shr edx, 8 |
422 | bsr eax, edx |
430 | bsr eax, edx |
423 | lea ecx, [eax+7] |
431 | lea ecx, [eax+7] |
424 | mov edx, ebx |
432 | mov edx, ebx |
425 | shr edx, cl |
433 | shr edx, cl |
426 | and edx, 1 |
434 | and edx, 1 |
427 | lea ecx, [edx+eax*2] |
435 | lea ecx, [edx+eax*2] |
428 | 436 | ||
429 | ; X->index = I; |
437 | ; X->index = I; |
430 | mov dword [esi+28], ecx |
438 | mov dword [esi+28], ecx |
431 | 439 | ||
432 | ; X->child[0] = X->child[1] = 0; |
440 | ; X->child[0] = X->child[1] = 0; |
433 | and dword [esi+20], 0 |
441 | and dword [esi+20], 0 |
434 | and dword [esi+16], 0 |
442 | and dword [esi+16], 0 |
435 | 443 | ||
436 | ; H = &ms.treebins[I]; |
444 | ; H = &ms.treebins[I]; |
437 | 445 | ||
438 | mov eax, ecx |
446 | mov eax, ecx |
439 | lea edx, [mst.treebins+eax*4] |
447 | lea edx, [mst.treebins+eax*4] |
440 | 448 | ||
441 | ; if (!(ms.treemap & 1< |
449 | ; if (!(ms.treemap & 1< |
442 | bt [mst.treemap], ecx |
450 | bt [mst.treemap], ecx |
443 | jc .tree |
451 | jc .tree |
444 | 452 | ||
445 | ; ms.treemap |= 1< |
453 | ; ms.treemap |= 1< |
446 | bts [mst.treemap], ecx |
454 | bts [mst.treemap], ecx |
447 | ; *H = X; |
455 | ; *H = X; |
448 | mov dword [edx], esi |
456 | mov dword [edx], esi |
449 | jmp .done |
457 | jmp .done |
450 | .tree: |
458 | .tree: |
451 | 459 | ||
452 | ; T = *H; |
460 | ; T = *H; |
453 | mov edx, [edx] |
461 | mov edx, [edx] |
454 | 462 | ||
455 | ; K = S << leftshift_for_tree_index(I); |
463 | ; K = S << leftshift_for_tree_index(I); |
456 | mov eax, ecx |
464 | mov eax, ecx |
457 | shr eax, 1 |
465 | shr eax, 1 |
458 | sub ecx, 31 |
466 | sub ecx, 31 |
459 | mov edi, 37 |
467 | mov edi, 37 |
460 | sub edi, eax |
468 | sub edi, eax |
461 | neg ecx |
469 | neg ecx |
462 | sbb ecx, ecx |
470 | sbb ecx, ecx |
463 | and ecx, edi |
471 | and ecx, edi |
464 | mov eax, ebx |
472 | mov eax, ebx |
465 | shl eax, cl ;eax= K |
473 | shl eax, cl ;eax= K |
466 | 474 | ||
467 | jmp .loop |
475 | jmp .loop |
468 | 476 | ||
469 | .not_eq_size: |
477 | .not_eq_size: |
470 | 478 | ||
471 | ; C = &(T->child[(K >> 31) & 1]); |
479 | ; C = &(T->child[(K >> 31) & 1]); |
472 | mov ecx, eax |
480 | mov ecx, eax |
473 | shr ecx, 31 |
481 | shr ecx, 31 |
474 | lea ecx, [edx+ecx*4+16] |
482 | lea ecx, [edx+ecx*4+16] |
475 | 483 | ||
476 | ; K <<= 1; |
484 | ; K <<= 1; |
477 | ; if (*C != 0) |
485 | ; if (*C != 0) |
478 | mov edi, [ecx] |
486 | mov edi, [ecx] |
479 | add eax, eax |
487 | add eax, eax |
480 | test edi, edi |
488 | test edi, edi |
481 | jz .insert_child |
489 | jz .insert_child |
482 | 490 | ||
483 | ; T = *C; |
491 | ; T = *C; |
484 | mov edx, edi |
492 | mov edx, edi |
485 | .loop: |
493 | .loop: |
486 | 494 | ||
487 | ; for (;;) |
495 | ; for (;;) |
488 | ; if ((T->head & ~INUSE_BITS) != S) |
496 | ; if ((T->head & ~INUSE_BITS) != S) |
489 | 497 | ||
490 | mov ecx, [edx+4] |
498 | mov ecx, [edx+4] |
491 | and ecx, not 3 |
499 | and ecx, not 3 |
492 | cmp ecx, ebx |
500 | cmp ecx, ebx |
493 | jne .not_eq_size |
501 | jne .not_eq_size |
494 | 502 | ||
495 | ; F = T->fd; |
503 | ; F = T->fd; |
496 | mov eax, [edx+8] |
504 | mov eax, [edx+8] |
497 | 505 | ||
498 | ; T->fd = F->bk = X; |
506 | ; T->fd = F->bk = X; |
499 | mov [eax+12], esi |
507 | mov [eax+12], esi |
500 | mov [edx+8], esi |
508 | mov [edx+8], esi |
501 | 509 | ||
502 | ; X->fd = F; |
510 | ; X->fd = F; |
503 | ; X->bk = T; |
511 | ; X->bk = T; |
504 | ; X->parent = 0; |
512 | ; X->parent = 0; |
505 | 513 | ||
506 | and dword [esi+24], 0 |
514 | and dword [esi+24], 0 |
507 | mov [esi+8], eax |
515 | mov [esi+8], eax |
508 | mov [esi+12], edx |
516 | mov [esi+12], edx |
509 | ret |
517 | ret |
510 | 518 | ||
511 | .insert_child: |
519 | .insert_child: |
512 | 520 | ||
513 | ; *C = X; |
521 | ; *C = X; |
514 | mov [ecx], esi |
522 | mov [ecx], esi |
515 | .done: |
523 | .done: |
516 | 524 | ||
517 | ; X->parent = T; |
525 | ; X->parent = T; |
518 | mov [esi+24], edx |
526 | mov [esi+24], edx |
519 | 527 | ||
520 | ; X->fd = X->bk = X; |
528 | ; X->fd = X->bk = X; |
521 | mov [esi+12], esi |
529 | mov [esi+12], esi |
522 | mov [esi+8], esi |
530 | mov [esi+8], esi |
523 | ret |
531 | ret |
524 | 532 | ||
525 | 533 | ||
526 | ; param |
534 | ; param |
527 | ; edx= chunk |
535 | ; edx= chunk |
528 | 536 | ||
529 | align 4 |
537 | align 4 |
530 | unlink_large_chunk: |
538 | unlink_large_chunk: |
531 | 539 | ||
532 | mov eax, [edx+12] |
540 | mov eax, [edx+12] |
533 | cmp eax, edx |
541 | cmp eax, edx |
534 | push edi |
542 | push edi |
535 | mov edi, [edx+24] |
543 | mov edi, [edx+24] |
536 | je @F |
544 | je @F |
537 | 545 | ||
538 | mov ecx, [edx+8] ;F = X->fd |
546 | mov ecx, [edx+8] ;F = X->fd |
539 | mov [ecx+12], eax ;F->bk = R; |
547 | mov [ecx+12], eax ;F->bk = R; |
540 | mov [eax+8], ecx ;R->fd = F |
548 | mov [eax+8], ecx ;R->fd = F |
541 | jmp .parent |
549 | jmp .parent |
542 | @@: |
550 | @@: |
543 | mov eax, [edx+20] |
551 | mov eax, [edx+20] |
544 | test eax, eax |
552 | test eax, eax |
545 | push esi |
553 | push esi |
546 | lea esi, [edx+20] |
554 | lea esi, [edx+20] |
547 | jne .loop |
555 | jne .loop |
548 | 556 | ||
549 | mov eax, [edx+16] |
557 | mov eax, [edx+16] |
550 | test eax, eax |
558 | test eax, eax |
551 | lea esi, [edx+16] |
559 | lea esi, [edx+16] |
552 | je .l2 |
560 | je .l2 |
553 | .loop: |
561 | .loop: |
554 | cmp dword [eax+20], 0 |
562 | cmp dword [eax+20], 0 |
555 | lea ecx, [eax+20] |
563 | lea ecx, [eax+20] |
556 | jne @F |
564 | jne @F |
557 | 565 | ||
558 | cmp dword [eax+16], 0 |
566 | cmp dword [eax+16], 0 |
559 | lea ecx, [eax+16] |
567 | lea ecx, [eax+16] |
560 | je .l1 |
568 | je .l1 |
561 | @@: |
569 | @@: |
562 | mov eax, [ecx] |
570 | mov eax, [ecx] |
563 | mov esi, ecx |
571 | mov esi, ecx |
564 | jmp .loop |
572 | jmp .loop |
565 | .l1: |
573 | .l1: |
566 | mov dword [esi], 0 |
574 | mov dword [esi], 0 |
567 | .l2: |
575 | .l2: |
568 | pop esi |
576 | pop esi |
569 | .parent: |
577 | .parent: |
570 | test edi, edi |
578 | test edi, edi |
571 | je .done |
579 | je .done |
572 | 580 | ||
573 | mov ecx, [edx+28] |
581 | mov ecx, [edx+28] |
574 | cmp edx, [mst.treebins+ecx*4] |
582 | cmp edx, [mst.treebins+ecx*4] |
575 | lea ecx, [mst.treebins+ecx*4] |
583 | lea ecx, [mst.treebins+ecx*4] |
576 | jne .l3 |
584 | jne .l3 |
577 | 585 | ||
578 | test eax, eax |
586 | test eax, eax |
579 | mov [ecx], eax |
587 | mov [ecx], eax |
580 | jne .l5 |
588 | jne .l5 |
581 | 589 | ||
582 | mov ecx, [edx+28] |
590 | mov ecx, [edx+28] |
583 | btr [mst.treemap], ecx |
591 | btr [mst.treemap], ecx |
584 | pop edi |
592 | pop edi |
585 | ret |
593 | ret |
586 | .l3: |
594 | .l3: |
587 | cmp [edi+16], edx |
595 | cmp [edi+16], edx |
588 | jne @F |
596 | jne @F |
589 | 597 | ||
590 | mov [edi+16], eax |
598 | mov [edi+16], eax |
591 | jmp .l4 |
599 | jmp .l4 |
592 | @@: |
600 | @@: |
593 | mov [edi+20], eax |
601 | mov [edi+20], eax |
594 | .l4: |
602 | .l4: |
595 | test eax, eax |
603 | test eax, eax |
596 | je .done |
604 | je .done |
597 | .l5: |
605 | .l5: |
598 | mov [eax+24], edi |
606 | mov [eax+24], edi |
599 | mov ecx, [edx+16] |
607 | mov ecx, [edx+16] |
600 | test ecx, ecx |
608 | test ecx, ecx |
601 | je .l6 |
609 | je .l6 |
602 | 610 | ||
603 | mov [eax+16], ecx |
611 | mov [eax+16], ecx |
604 | mov [ecx+24], eax |
612 | mov [ecx+24], eax |
605 | .l6: |
613 | .l6: |
606 | mov edx, [edx+20] |
614 | mov edx, [edx+20] |
607 | test edx, edx |
615 | test edx, edx |
608 | je .done |
616 | je .done |
609 | 617 | ||
610 | mov [eax+20], edx |
618 | mov [eax+20], edx |
611 | mov [edx+24], eax |
619 | mov [edx+24], eax |
612 | .done: |
620 | .done: |
613 | pop edi |
621 | pop edi |
614 | ret |
622 | ret |
615 | 623 | ||
616 | ; param |
624 | ; param |
617 | ; esi= nb |
625 | ; esi= nb |
618 | 626 | ||
619 | align 4 |
627 | align 4 |
620 | malloc_small: |
628 | malloc_small: |
621 | push ebp |
629 | push ebp |
622 | mov ebp, esi |
630 | mov ebp, esi |
623 | 631 | ||
624 | push edi |
632 | push edi |
625 | 633 | ||
626 | bsf eax,[mst.treemap] |
634 | bsf eax,[mst.treemap] |
627 | mov ecx, [mst.treebins+eax*4] |
635 | mov ecx, [mst.treebins+eax*4] |
628 | 636 | ||
629 | ; rsize = (t->head & ~INUSE_BITS) - nb; |
637 | ; rsize = (t->head & ~INUSE_BITS) - nb; |
630 | 638 | ||
631 | mov edi, [ecx+4] |
639 | mov edi, [ecx+4] |
632 | and edi, -4 |
640 | and edi, -4 |
633 | sub edi, esi |
641 | sub edi, esi |
634 | .loop: |
642 | .loop: |
635 | mov ebx, ecx |
643 | mov ebx, ecx |
636 | .loop_1: |
644 | .loop_1: |
637 | 645 | ||
638 | ; while ((t = leftmost_child(t)) != 0) |
646 | ; while ((t = leftmost_child(t)) != 0) |
639 | 647 | ||
640 | mov eax, [ecx+16] |
648 | mov eax, [ecx+16] |
641 | test eax, eax |
649 | test eax, eax |
642 | jz @F |
650 | jz @F |
643 | mov ecx, eax |
651 | mov ecx, eax |
644 | jmp .l1 |
652 | jmp .l1 |
645 | @@: |
653 | @@: |
646 | mov ecx, [ecx+20] |
654 | mov ecx, [ecx+20] |
647 | .l1: |
655 | .l1: |
648 | test ecx, ecx |
656 | test ecx, ecx |
649 | jz .unlink |
657 | jz .unlink |
650 | 658 | ||
651 | ; trem = (t->head & ~INUSE_BITS) - nb; |
659 | ; trem = (t->head & ~INUSE_BITS) - nb; |
652 | 660 | ||
653 | mov eax, [ecx+4] |
661 | mov eax, [ecx+4] |
654 | and eax, -4 |
662 | and eax, -4 |
655 | sub eax, ebp |
663 | sub eax, ebp |
656 | 664 | ||
657 | ; if (trem < rsize) |
665 | ; if (trem < rsize) |
658 | 666 | ||
659 | cmp eax, edi |
667 | cmp eax, edi |
660 | jae .loop_1 |
668 | jae .loop_1 |
661 | 669 | ||
662 | ; rsize = trem; |
670 | ; rsize = trem; |
663 | 671 | ||
664 | mov edi, eax |
672 | mov edi, eax |
665 | jmp .loop |
673 | jmp .loop |
666 | .unlink: |
674 | .unlink: |
667 | 675 | ||
668 | 676 | ||
669 | ; r = chunk_plus_offset((mchunkptr)v, nb); |
677 | ; r = chunk_plus_offset((mchunkptr)v, nb); |
670 | ; unlink_large_chunk(v); |
678 | ; unlink_large_chunk(v); |
671 | 679 | ||
672 | mov edx, ebx |
680 | mov edx, ebx |
673 | lea esi, [ebx+ebp] |
681 | lea esi, [ebx+ebp] |
674 | call unlink_large_chunk |
682 | call unlink_large_chunk |
675 | 683 | ||
676 | ; if (rsize < 16) |
684 | ; if (rsize < 16) |
677 | 685 | ||
678 | cmp edi, 16 |
686 | cmp edi, 16 |
679 | jae .split |
687 | jae .split |
680 | 688 | ||
681 | ; v->head = (rsize + nb)|PINUSE_BIT|CINUSE_BIT; |
689 | ; v->head = (rsize + nb)|PINUSE_BIT|CINUSE_BIT; |
682 | 690 | ||
683 | lea ecx, [edi+ebp] |
691 | lea ecx, [edi+ebp] |
684 | 692 | ||
685 | ; (v+rsize + nb)->head |= PINUSE_BIT; |
693 | ; (v+rsize + nb)->head |= PINUSE_BIT; |
686 | 694 | ||
687 | add edi, ebx |
695 | add edi, ebx |
688 | lea eax, [edi+ebp+4] |
696 | lea eax, [edi+ebp+4] |
689 | pop edi |
697 | pop edi |
690 | or ecx, 3 |
698 | or ecx, 3 |
691 | mov [ebx+4], ecx |
699 | mov [ebx+4], ecx |
692 | or dword [eax], 1 |
700 | or dword [eax], 1 |
693 | pop ebp |
701 | pop ebp |
694 | 702 | ||
695 | lea eax, [ebx+8] |
703 | lea eax, [ebx+8] |
696 | ret |
704 | ret |
697 | .split: |
705 | .split: |
698 | 706 | ||
699 | ; v->head = nb|PINUSE_BIT|CINUSE_BIT; |
707 | ; v->head = nb|PINUSE_BIT|CINUSE_BIT; |
700 | ; r->head = rsize|PINUSE_BIT; |
708 | ; r->head = rsize|PINUSE_BIT; |
701 | ; (r+rsize)->prev_foot = rsize; |
709 | ; (r+rsize)->prev_foot = rsize; |
702 | 710 | ||
703 | or ebp, 3 |
711 | or ebp, 3 |
704 | mov edx, edi |
712 | mov edx, edi |
705 | or edx, 1 |
713 | or edx, 1 |
706 | 714 | ||
707 | cmp edi, 256 |
715 | cmp edi, 256 |
708 | mov [ebx+4], ebp |
716 | mov [ebx+4], ebp |
709 | mov [esi+4], edx |
717 | mov [esi+4], edx |
710 | mov [esi+edi], edi |
718 | mov [esi+edi], edi |
711 | jae .large |
719 | jae .large |
712 | 720 | ||
713 | shr edi, 3 |
721 | shr edi, 3 |
714 | bts [mst.smallmap], edi |
722 | bts [mst.smallmap], edi |
715 | 723 | ||
716 | mov eax, edi |
724 | mov eax, edi |
717 | shl eax, 4 |
725 | shl eax, 4 |
718 | add eax, mst.smallbins |
726 | add eax, mst.smallbins |
719 | 727 | ||
720 | mov edx, [eax+8] |
728 | mov edx, [eax+8] |
721 | mov [eax+8], esi |
729 | mov [eax+8], esi |
722 | mov [edx+12], esi |
730 | mov [edx+12], esi |
723 | pop edi |
731 | pop edi |
724 | mov [esi+12], eax |
732 | mov [esi+12], eax |
725 | mov [esi+8], edx |
733 | mov [esi+8], edx |
726 | pop ebp |
734 | pop ebp |
727 | lea eax, [ebx+8] |
735 | lea eax, [ebx+8] |
728 | ret |
736 | ret |
729 | .large: |
737 | .large: |
730 | lea eax, [ebx+8] |
738 | lea eax, [ebx+8] |
731 | push eax |
739 | push eax |
732 | mov ebx, edi |
740 | mov ebx, edi |
733 | call insert_large_chunk |
741 | call insert_large_chunk |
734 | pop eax |
742 | pop eax |
735 | pop edi |
743 | pop edi |
736 | pop ebp |
744 | pop ebp |
737 | ret |
745 | ret |
738 | 746 | ||
739 | 747 | ||
740 | ; param |
748 | ; param |
741 | ; esi= nb |
749 | ; esi= nb |
742 | 750 | ||
743 | align 4 |
751 | align 4 |
744 | malloc_large: |
752 | malloc_large: |
745 | .idx equ esp+4 |
753 | .idx equ esp+4 |
746 | .rst equ esp |
754 | .rst equ esp |
747 | 755 | ||
748 | push ebp |
756 | push ebp |
749 | push edi |
757 | push edi |
750 | sub esp, 8 |
758 | sub esp, 8 |
751 | ; v = 0; |
759 | ; v = 0; |
752 | ; rsize = -nb; |
760 | ; rsize = -nb; |
753 | 761 | ||
754 | mov edi, esi |
762 | mov edi, esi |
755 | mov ebx, esi |
763 | mov ebx, esi |
756 | xor ebp, ebp |
764 | xor ebp, ebp |
757 | neg edi |
765 | neg edi |
758 | 766 | ||
759 | ; idx = compute_tree_index(nb); |
767 | ; idx = compute_tree_index(nb); |
760 | 768 | ||
761 | mov edx, esi |
769 | mov edx, esi |
762 | shr edx, 8 |
770 | shr edx, 8 |
763 | bsr eax, edx |
771 | bsr eax, edx |
764 | lea ecx, [eax+7] |
772 | lea ecx, [eax+7] |
765 | shr esi, cl |
773 | shr esi, cl |
766 | and esi, 1 |
774 | and esi, 1 |
767 | lea ecx, [esi+eax*2] |
775 | lea ecx, [esi+eax*2] |
768 | mov [.idx], ecx |
776 | mov [.idx], ecx |
769 | 777 | ||
770 | ; if ((t = ms.treebins[idx]) != 0) |
778 | ; if ((t = ms.treebins[idx]) != 0) |
771 | 779 | ||
772 | mov eax, [mst.treebins+ecx*4] |
780 | mov eax, [mst.treebins+ecx*4] |
773 | test eax, eax |
781 | test eax, eax |
774 | jz .l3 |
782 | jz .l3 |
775 | 783 | ||
776 | ; sizebits = nb << leftshift_for_tree_index(idx); |
784 | ; sizebits = nb << leftshift_for_tree_index(idx); |
777 | 785 | ||
778 | cmp ecx, 31 |
786 | cmp ecx, 31 |
779 | jne @F |
787 | jne @F |
780 | xor ecx, ecx |
788 | xor ecx, ecx |
781 | jmp .l1 |
789 | jmp .l1 |
782 | @@: |
790 | @@: |
783 | mov edx, ecx |
791 | mov edx, ecx |
784 | shr edx, 1 |
792 | shr edx, 1 |
785 | mov ecx, 37 |
793 | mov ecx, 37 |
786 | sub ecx, edx |
794 | sub ecx, edx |
787 | .l1: |
795 | .l1: |
788 | mov edx, ebx |
796 | mov edx, ebx |
789 | shl edx, cl |
797 | shl edx, cl |
790 | 798 | ||
791 | ; rst = 0; |
799 | ; rst = 0; |
792 | mov [.rst], ebp |
800 | mov [.rst], ebp |
793 | .loop: |
801 | .loop: |
794 | 802 | ||
795 | ; trem = (t->head & ~INUSE_BITS) - nb; |
803 | ; trem = (t->head & ~INUSE_BITS) - nb; |
796 | 804 | ||
797 | mov ecx, [eax+4] |
805 | mov ecx, [eax+4] |
798 | and ecx, -4 |
806 | and ecx, -4 |
799 | sub ecx, ebx |
807 | sub ecx, ebx |
800 | 808 | ||
801 | ; if (trem < rsize) |
809 | ; if (trem < rsize) |
802 | 810 | ||
803 | cmp ecx, edi |
811 | cmp ecx, edi |
804 | jae @F |
812 | jae @F |
805 | ; v = t; |
813 | ; v = t; |
806 | ; if ((rsize = trem) == 0) |
814 | ; if ((rsize = trem) == 0) |
807 | 815 | ||
808 | test ecx, ecx |
816 | test ecx, ecx |
809 | mov ebp, eax |
817 | mov ebp, eax |
810 | mov edi, ecx |
818 | mov edi, ecx |
811 | je .l2 |
819 | je .l2 |
812 | @@: |
820 | @@: |
813 | 821 | ||
814 | ; rt = t->child[1]; |
822 | ; rt = t->child[1]; |
815 | 823 | ||
816 | mov ecx, [eax+20] |
824 | mov ecx, [eax+20] |
817 | 825 | ||
818 | ; t = t->child[(sizebits >> 31) & 1]; |
826 | ; t = t->child[(sizebits >> 31) & 1]; |
819 | 827 | ||
820 | mov esi, edx |
828 | mov esi, edx |
821 | shr esi, 31 |
829 | shr esi, 31 |
822 | 830 | ||
823 | ; if (rt != 0 && rt != t) |
831 | ; if (rt != 0 && rt != t) |
824 | 832 | ||
825 | test ecx, ecx |
833 | test ecx, ecx |
826 | mov eax, [eax+esi*4+16] |
834 | mov eax, [eax+esi*4+16] |
827 | jz @F |
835 | jz @F |
828 | cmp ecx, eax |
836 | cmp ecx, eax |
829 | jz @F |
837 | jz @F |
830 | 838 | ||
831 | ; rst = rt; |
839 | ; rst = rt; |
832 | mov [.rst], ecx |
840 | mov [.rst], ecx |
833 | @@: |
841 | @@: |
834 | ; if (t == 0) |
842 | ; if (t == 0) |
835 | 843 | ||
836 | test eax, eax |
844 | test eax, eax |
837 | jz @F |
845 | jz @F |
838 | 846 | ||
839 | ; sizebits <<= 1; |
847 | ; sizebits <<= 1; |
840 | 848 | ||
841 | add edx, edx |
849 | add edx, edx |
842 | jmp .loop |
850 | jmp .loop |
843 | @@: |
851 | @@: |
844 | ; t = rst; |
852 | ; t = rst; |
845 | mov eax, [.rst] |
853 | mov eax, [.rst] |
846 | .l2: |
854 | .l2: |
847 | ; if (t == 0 && v == 0) |
855 | ; if (t == 0 && v == 0) |
848 | 856 | ||
849 | test eax, eax |
857 | test eax, eax |
850 | jne .l4 |
858 | jne .l4 |
851 | test ebp, ebp |
859 | test ebp, ebp |
852 | jne .l7 |
860 | jne .l7 |
853 | mov ecx, [.idx] |
861 | mov ecx, [.idx] |
854 | .l3: |
862 | .l3: |
855 | 863 | ||
856 | ; leftbits = (-1< |
864 | ; leftbits = (-1< |
857 | ; if (leftbits != 0) |
865 | ; if (leftbits != 0) |
858 | 866 | ||
859 | or edx, -1 |
867 | or edx, -1 |
860 | shl edx, cl |
868 | shl edx, cl |
861 | and edx, [mst.treemap] |
869 | and edx, [mst.treemap] |
862 | jz @F |
870 | jz @F |
863 | 871 | ||
864 | bsf eax, edx |
872 | bsf eax, edx |
865 | ; t = ms.treebins[i]; |
873 | ; t = ms.treebins[i]; |
866 | mov eax, [mst.treebins+eax*4] |
874 | mov eax, [mst.treebins+eax*4] |
867 | @@: |
875 | @@: |
868 | 876 | ||
869 | ; while (t != 0) |
877 | ; while (t != 0) |
870 | test eax, eax |
878 | test eax, eax |
871 | jz .l5 |
879 | jz .l5 |
872 | .l4: |
880 | .l4: |
873 | 881 | ||
874 | ; trem = (t->head & ~INUSE_BITS) - nb; |
882 | ; trem = (t->head & ~INUSE_BITS) - nb; |
875 | 883 | ||
876 | mov ecx, [eax+4] |
884 | mov ecx, [eax+4] |
877 | and ecx, -4 |
885 | and ecx, -4 |
878 | sub ecx, ebx |
886 | sub ecx, ebx |
879 | 887 | ||
880 | ; if (trem < rsize) |
888 | ; if (trem < rsize) |
881 | 889 | ||
882 | cmp ecx, edi |
890 | cmp ecx, edi |
883 | jae @F |
891 | jae @F |
884 | ; rsize = trem; |
892 | ; rsize = trem; |
885 | 893 | ||
886 | mov edi, ecx |
894 | mov edi, ecx |
887 | ; v = t; |
895 | ; v = t; |
888 | mov ebp, eax |
896 | mov ebp, eax |
889 | @@: |
897 | @@: |
890 | 898 | ||
891 | ; t = leftmost_child(t); |
899 | ; t = leftmost_child(t); |
892 | 900 | ||
893 | mov ecx, [eax+16] |
901 | mov ecx, [eax+16] |
894 | test ecx, ecx |
902 | test ecx, ecx |
895 | je @F |
903 | je @F |
896 | mov eax, ecx |
904 | mov eax, ecx |
897 | jmp .l6 |
905 | jmp .l6 |
898 | @@: |
906 | @@: |
899 | mov eax, [eax+20] |
907 | mov eax, [eax+20] |
900 | .l6: |
908 | .l6: |
901 | 909 | ||
902 | ; while (t != 0) |
910 | ; while (t != 0) |
903 | 911 | ||
904 | test eax, eax |
912 | test eax, eax |
905 | jne .l4 |
913 | jne .l4 |
906 | .l5: |
914 | .l5: |
907 | 915 | ||
908 | ; if (v != 0) |
916 | ; if (v != 0) |
909 | 917 | ||
910 | test ebp, ebp |
918 | test ebp, ebp |
911 | jz .done |
919 | jz .done |
912 | .l7: |
920 | .l7: |
913 | 921 | ||
914 | ; r = chunk_plus_offset((mchunkptr)v, nb); |
922 | ; r = chunk_plus_offset((mchunkptr)v, nb); |
915 | ; unlink_large_chunk(v); |
923 | ; unlink_large_chunk(v); |
916 | 924 | ||
917 | mov edx, ebp |
925 | mov edx, ebp |
918 | lea esi, [ebx+ebp] |
926 | lea esi, [ebx+ebp] |
919 | call unlink_large_chunk |
927 | call unlink_large_chunk |
920 | 928 | ||
921 | ; if (rsize < 16) |
929 | ; if (rsize < 16) |
922 | 930 | ||
923 | cmp edi, 16 |
931 | cmp edi, 16 |
924 | jae .large |
932 | jae .large |
925 | 933 | ||
926 | ; v->head = (rsize + nb)|PINUSE_BIT|CINUSE_BIT; |
934 | ; v->head = (rsize + nb)|PINUSE_BIT|CINUSE_BIT; |
927 | 935 | ||
928 | lea ecx, [edi+ebx] |
936 | lea ecx, [edi+ebx] |
929 | 937 | ||
930 | ; (v+rsize + nb)->head |= PINUSE_BIT; |
938 | ; (v+rsize + nb)->head |= PINUSE_BIT; |
931 | 939 | ||
932 | add edi, ebp |
940 | add edi, ebp |
933 | lea eax, [edi+ebx+4] |
941 | lea eax, [edi+ebx+4] |
934 | or ecx, 3 |
942 | or ecx, 3 |
935 | mov [ebp+4], ecx |
943 | mov [ebp+4], ecx |
936 | or dword [eax], 1 |
944 | or dword [eax], 1 |
937 | lea eax, [ebp+8] |
945 | lea eax, [ebp+8] |
938 | add esp, 8 |
946 | add esp, 8 |
939 | pop edi |
947 | pop edi |
940 | pop ebp |
948 | pop ebp |
941 | ret |
949 | ret |
942 | .large: |
950 | .large: |
943 | 951 | ||
944 | ; v->head = nb|PINUSE_BIT|CINUSE_BIT; |
952 | ; v->head = nb|PINUSE_BIT|CINUSE_BIT; |
945 | ; r->head = rsize|PINUSE_BIT; |
953 | ; r->head = rsize|PINUSE_BIT; |
946 | 954 | ||
947 | mov edx, edi |
955 | mov edx, edi |
948 | or ebx, 3 |
956 | or ebx, 3 |
949 | mov [ebp+4], ebx |
957 | mov [ebp+4], ebx |
950 | or edx, 1 |
958 | or edx, 1 |
951 | mov [esi+4], edx |
959 | mov [esi+4], edx |
952 | 960 | ||
953 | ; (r+rsize)->prev_foot = rsize; |
961 | ; (r+rsize)->prev_foot = rsize; |
954 | ; insert_large_chunk((tchunkptr)r, rsize); |
962 | ; insert_large_chunk((tchunkptr)r, rsize); |
955 | 963 | ||
956 | mov [esi+edi], edi |
964 | mov [esi+edi], edi |
957 | mov eax, edi |
965 | mov eax, edi |
958 | mov ecx, esi |
966 | mov ecx, esi |
959 | call insert_chunk |
967 | call insert_chunk |
960 | 968 | ||
961 | lea eax, [ebp+8] |
969 | lea eax, [ebp+8] |
962 | add esp, 8 |
970 | add esp, 8 |
963 | pop edi |
971 | pop edi |
964 | pop ebp |
972 | pop ebp |
965 | ret |
973 | ret |
966 | .done: |
974 | .done: |
967 | add esp, 8 |
975 | add esp, 8 |
968 | pop edi |
976 | pop edi |
969 | pop ebp |
977 | pop ebp |
970 | xor eax, eax |
978 | xor eax, eax |
971 | ret |
979 | ret |
972 | 980 | ||
973 | align 4 |
981 | align 4 |
974 | init_malloc: |
982 | init_malloc: |
975 | 983 | ||
976 | stdcall kernel_alloc, 0x20000 |
984 | stdcall kernel_alloc, 0x20000 |
977 | 985 | ||
978 | mov [mst.top], eax |
986 | mov [mst.top], eax |
979 | mov [mst.topsize], 128*1024 |
987 | mov [mst.topsize], 128*1024 |
980 | mov dword [eax+4], (128*1024) or 1 |
988 | mov dword [eax+4], (128*1024) or 1 |
981 | mov eax, mst.smallbins |
989 | mov eax, mst.smallbins |
982 | @@: |
990 | @@: |
983 | mov [eax+8], eax |
991 | mov [eax+8], eax |
984 | mov [eax+12], eax |
992 | mov [eax+12], eax |
985 | add eax, 16 |
993 | add eax, 16 |
986 | cmp eax, mst.smallbins+512 |
994 | cmp eax, mst.smallbins+512 |
987 | jl @B |
995 | jl @B |
988 | 996 | ||
989 | ret>> |
997 | ret>> |
990 | > |
998 | > |
991 | > |
999 | > |
992 | > |
1000 | > |
993 | >><>>><>>>><>16) |
1001 | >><>>><>>>><>16) |
994 | 1002 | ||
995 | >3; |
1003 | >3; |
996 | ;><3; |
1004 | ;><3; |
997 | ;> |
1005 | ;> |