Subversion Repositories Kolibri OS

Rev

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
>
1001
>
994
 
1002
 
995
>
1003
>
996
;>
1004
;>
997
;>
1005
;>