Subversion Repositories Kolibri OS

Rev

Rev 281 | Rev 321 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 281 Rev 294
1
HEAP_BASE equ 0x00C00000
1
HEAP_BASE equ 0x00C00000
2
;HEAP_SIZE equ 0x01000000
2
;HEAP_SIZE equ 0x01000000
3
 
3
 
4
struc MEM_BLOCK
4
struc MEM_BLOCK
5
{  .next_block  dd ?
5
{  .next_block  dd ?
6
   .prev_block  dd ? ;+4
6
   .prev_block  dd ? ;+4
7
   .list_next   dd ? ;+8
7
   .list_next   dd ? ;+8
8
   .list_prev   dd ? ;+12
8
   .list_prev   dd ? ;+12
9
   .base        dd ? ;+16
9
   .base        dd ? ;+16
10
   .size        dd ? ;+20
10
   .size        dd ? ;+20
11
   .flags       dd ? ;+24
11
   .flags       dd ? ;+24
12
   .handle      dd ? ;+28
12
   .handle      dd ? ;+28
13
}
13
}
14
 
14
 
15
FREE_BLOCK      equ  4
15
FREE_BLOCK      equ  4
16
USED_BLOCK      equ  8
16
USED_BLOCK      equ  8
17
 
17
 
18
virtual at 0
18
virtual at 0
19
  MEM_BLOCK MEM_BLOCK
19
  MEM_BLOCK MEM_BLOCK
20
end virtual
20
end virtual
21
 
21
 
22
MEM_BLOCK_SIZE equ 8*4
22
MEM_BLOCK_SIZE equ 8*4
23
 
23
 
24
block_next   equ MEM_BLOCK.next_block
24
block_next   equ MEM_BLOCK.next_block
25
block_prev   equ MEM_BLOCK.prev_block
25
block_prev   equ MEM_BLOCK.prev_block
26
list_next    equ MEM_BLOCK.list_next
26
list_next    equ MEM_BLOCK.list_next
27
list_prev    equ MEM_BLOCK.list_prev
27
list_prev    equ MEM_BLOCK.list_prev
28
block_base   equ MEM_BLOCK.base
28
block_base   equ MEM_BLOCK.base
29
block_size   equ MEM_BLOCK.size
29
block_size   equ MEM_BLOCK.size
30
block_flags  equ MEM_BLOCK.flags
30
block_flags  equ MEM_BLOCK.flags
31
 
31
 
32
macro calc_index op
32
macro calc_index op
33
{          shr op, 12
33
{          shr op, 12
34
           dec op
34
           dec op
35
           cmp op, 63
35
           cmp op, 63
36
           jna @f
36
           jna @f
37
           mov op, 63
37
           mov op, 63
38
@@:
38
@@:
39
}
39
}
40
 
40
 
41
macro remove_from_list op
41
macro remove_from_list op
42
{          mov edx, [op+list_next]
42
{          mov edx, [op+list_next]
43
           mov ecx, [op+list_prev]
43
           mov ecx, [op+list_prev]
44
           test edx, edx
44
           test edx, edx
45
           jz @f
45
           jz @f
46
           mov [edx+list_prev], ecx
46
           mov [edx+list_prev], ecx
47
@@:
47
@@:
48
           test ecx, ecx
48
           test ecx, ecx
49
           jz @f
49
           jz @f
50
           mov [ecx+list_next], edx
50
           mov [ecx+list_next], edx
51
@@:
51
@@:
52
           mov [op+list_next],0
52
           mov [op+list_next],0
53
           mov [op+list_prev],0
53
           mov [op+list_prev],0
54
}
54
}
55
 
55
 
56
macro remove_from_free op
56
macro remove_from_free op
57
{
57
{
58
           remove_from_list op
58
           remove_from_list op
59
 
59
 
60
           mov eax, [op+block_size]
60
           mov eax, [op+block_size]
61
           calc_index eax
61
           calc_index eax
62
           cmp [mem_block_list+eax*4], op
62
           cmp [mem_block_list+eax*4], op
63
           jne @f
63
           jne @f
64
           mov [mem_block_list+eax*4], edx
64
           mov [mem_block_list+eax*4], edx
65
@@:
65
@@:
66
           cmp [mem_block_list+eax*4], 0
66
           cmp [mem_block_list+eax*4], 0
67
           jne @f
67
           jne @f
68
           btr [mem_block_mask], eax
68
           btr [mem_block_mask], eax
69
@@:
69
@@:
70
}
70
}
71
 
71
 
72
macro remove_from_used op
72
macro remove_from_used op
73
{
73
{
74
           remove_from_list op
74
           remove_from_list op
75
           cmp [mem_used_list], op
75
           cmp [mem_used_list], op
76
           jne @f
76
           jne @f
77
           mov [mem_used_list], edx
77
           mov [mem_used_list], edx
78
@@:
78
@@:
79
}
79
}
80
 
80
 
81
align 4
81
align 4
82
proc init_kernel_heap
82
proc init_kernel_heap
83
 
83
 
84
           mov ecx, 64/4
84
           mov ecx, 64/4
85
           mov edi, mem_block_list
85
           mov edi, mem_block_list
86
           xor eax, eax
86
           xor eax, eax
87
           cld
87
           cld
88
           rep stosd
88
           rep stosd
89
 
89
 
90
           mov ecx, 512/4
90
           mov ecx, 512/4
91
           mov edi, mem_block_map
91
           mov edi, mem_block_map
92
           not eax
92
           not eax
93
           rep stosd
93
           rep stosd
94
 
94
 
95
           mov [mem_block_start], mem_block_map
95
           mov [mem_block_start], mem_block_map
96
           mov [mem_block_end], mem_block_map+512
96
           mov [mem_block_end], mem_block_map+512
97
           mov [mem_block_arr], HEAP_BASE
97
           mov [mem_block_arr], HEAP_BASE
98
 
98
 
99
           stdcall alloc_pages, dword 32
99
           stdcall alloc_pages, dword 32
100
           mov ecx, 32
100
           mov ecx, 32
101
           mov edx, eax
101
           mov edx, eax
102
           mov edi, HEAP_BASE
102
           mov edi, HEAP_BASE
103
.l1:
103
.l1:
104
           stdcall map_page,edi,edx,PG_SW
104
           stdcall map_page,edi,edx,PG_SW
105
           add edi, 0x1000
105
           add edi, 0x1000
106
           add edx, 0x1000
106
           add edx, 0x1000
107
           dec ecx
107
           dec ecx
108
           jnz .l1
108
           jnz .l1
109
 
109
 
110
           mov edi, HEAP_BASE
110
           mov edi, HEAP_BASE
111
           mov ebx, edi
111
           mov ebx, edi
112
           add ebx, MEM_BLOCK_SIZE
112
           add ebx, MEM_BLOCK_SIZE
113
           xor eax, eax
113
           xor eax, eax
114
           mov [edi+block_next], ebx
114
           mov [edi+block_next], ebx
115
           mov [edi+block_prev], eax
115
           mov [edi+block_prev], eax
116
           mov [edi+list_next], eax
116
           mov [edi+list_next], eax
117
           mov [edi+list_prev], eax
117
           mov [edi+list_prev], eax
118
           mov [edi+block_base], HEAP_BASE
118
           mov [edi+block_base], HEAP_BASE
119
           mov [edi+block_size], 4096*MEM_BLOCK_SIZE
119
           mov [edi+block_size], 4096*MEM_BLOCK_SIZE
120
           mov [edi+block_flags], USED_BLOCK
120
           mov [edi+block_flags], USED_BLOCK
121
 
121
 
122
           mov [ebx+block_next], eax
122
           mov [ebx+block_next], eax
123
           mov [ebx+block_prev], eax
123
           mov [ebx+block_prev], eax
124
           mov [ebx+list_next], eax
124
           mov [ebx+list_next], eax
125
           mov [ebx+block_base], HEAP_BASE+4096*MEM_BLOCK_SIZE
125
           mov [ebx+block_base], HEAP_BASE+4096*MEM_BLOCK_SIZE
126
 
126
 
127
           mov ecx, [MEM_AMOUNT]
127
           mov ecx, [MEM_AMOUNT]
128
           sub ecx, HEAP_BASE + 4096*MEM_BLOCK_SIZE
128
           sub ecx, HEAP_BASE + 4096*MEM_BLOCK_SIZE
129
           mov [heap_size], ecx
129
           mov [heap_size], ecx
130
           mov [heap_free], ecx
130
           mov [heap_free], ecx
131
           mov [ebx+block_size], ecx
131
           mov [ebx+block_size], ecx
132
           mov [ebx+block_flags], FREE_BLOCK
132
           mov [ebx+block_flags], FREE_BLOCK
133
 
133
 
134
           mov [mem_block_mask], eax
134
           mov [mem_block_mask], eax
135
           mov [mem_block_mask+4],0x80000000
135
           mov [mem_block_mask+4],0x80000000
136
 
136
 
137
           mov [mem_used_list], eax
137
           mov [mem_used_list], eax
138
           mov [mem_block_list+63*4], ebx
138
           mov [mem_block_list+63*4], ebx
139
           mov byte [mem_block_map], 0xFC
139
           mov byte [mem_block_map], 0xFC
140
           and [heap_mutex], 0
140
           and [heap_mutex], 0
141
           mov [heap_blocks], 4095
141
           mov [heap_blocks], 4095
142
           mov [free_blocks], 4095
142
           mov [free_blocks], 4095
143
           ret
143
           ret
144
endp
144
endp
145
 
145
 
146
align 4
146
align 4
147
proc get_block stdcall, index:dword
147
proc get_block stdcall, index:dword
148
 
148
 
149
           mov eax, 63
149
           mov eax, 63
150
           mov ecx, [index]
150
           mov ecx, [index]
151
           cmp ecx, eax
151
           cmp ecx, eax
152
           jna @f
152
           jna @f
153
           ;cmova ecx, eax
153
           ;cmova ecx, eax
154
           mov ecx, eax
154
           mov ecx, eax
155
@@:
155
@@:
156
           xor esi, esi
156
           xor esi, esi
157
           xor ebx, ebx
157
           xor ebx, ebx
158
           xor edx, edx
158
           xor edx, edx
159
           not edx
159
           not edx
160
 
160
 
161
           cmp ecx, 32
161
           cmp ecx, 32
162
           jb .bit_test
162
           jb .bit_test
163
 
163
 
164
           sub ecx, 32
164
           sub ecx, 32
165
           add ebx, 32
165
           add ebx, 32
166
           add esi, 4
166
           add esi, 4
167
 
167
 
168
.bit_test:
168
.bit_test:
169
           shl edx, cl
169
           shl edx, cl
170
           and edx, [mem_block_mask+esi]
170
           and edx, [mem_block_mask+esi]
171
           jz .high_mask
171
           jz .high_mask
172
           bsf eax, edx
172
           bsf eax, edx
173
           add ebx, eax
173
           add ebx, eax
174
           mov eax, [mem_block_list+ebx*4]
174
           mov eax, [mem_block_list+ebx*4]
175
           ret
175
           ret
176
 
176
 
177
.high_mask:
177
.high_mask:
178
 
178
 
179
           add esi, 4
179
           add esi, 4
180
           add ebx, 32
180
           add ebx, 32
181
           test esi, 0xFFFFFFF8
181
           test esi, 0xFFFFFFF8
182
           jnz .big_error
182
           jnz .big_error
183
           mov edx, [mem_block_mask+esi]
183
           mov edx, [mem_block_mask+esi]
184
           and edx, edx
184
           and edx, edx
185
           jz .high_mask
185
           jz .high_mask
186
           bsf eax, edx
186
           bsf eax, edx
187
           add ebx, eax
187
           add ebx, eax
188
           mov eax, [mem_block_list+ebx*4]
188
           mov eax, [mem_block_list+ebx*4]
189
           ret
189
           ret
190
 
190
 
191
.big_error:
191
.big_error:
192
           xor eax, eax
192
           xor eax, eax
193
           ret
193
           ret
194
endp
194
endp
195
 
195
 
196
align 4
196
align 4
197
proc alloc_mem_block
197
proc alloc_mem_block
198
 
198
 
199
           mov ebx, [mem_block_start]
199
           mov ebx, [mem_block_start]
200
           mov ecx, [mem_block_end]
200
           mov ecx, [mem_block_end]
201
.l1:
201
.l1:
202
           bsf eax,[ebx];
202
           bsf eax,[ebx];
203
           jnz found
203
           jnz found
204
           add ebx,4
204
           add ebx,4
205
           cmp ebx, ecx
205
           cmp ebx, ecx
206
           jb .l1
206
           jb .l1
207
           xor eax,eax
207
           xor eax,eax
208
           ret
208
           ret
209
 
209
 
210
found:
210
found:
211
           btr [ebx], eax
211
           btr [ebx], eax
212
           mov [mem_block_start],ebx
212
           mov [mem_block_start],ebx
213
           sub ebx, mem_block_map
213
           sub ebx, mem_block_map
214
           lea eax,[eax+ebx*8]
214
           lea eax,[eax+ebx*8]
215
           shl eax, 5
215
           shl eax, 5
216
           add eax, [mem_block_arr]
216
           add eax, [mem_block_arr]
217
           dec [free_blocks]
217
           dec [free_blocks]
218
           ret
218
           ret
219
endp
219
endp
220
 
220
 
221
proc free_mem_block
221
proc free_mem_block
222
           sub eax, [mem_block_arr]
222
           sub eax, [mem_block_arr]
223
           shr eax, 5
223
           shr eax, 5
224
 
224
 
225
           mov ebx, mem_block_map
225
           mov ebx, mem_block_map
226
           bts [ebx], eax
226
           bts [ebx], eax
227
           inc [free_blocks]
227
           inc [free_blocks]
228
           shr eax, 3
228
           shr eax, 3
229
           and eax, not 3
229
           and eax, not 3
230
           add eax, ebx
230
           add eax, ebx
231
           cmp [mem_block_start], eax
231
           cmp [mem_block_start], eax
232
           ja @f
232
           ja @f
233
           ret
233
           ret
234
@@:
234
@@:
235
           mov [mem_block_start], eax
235
           mov [mem_block_start], eax
236
	   ret
236
	   ret
237
.err:
237
.err:
238
           xor eax, eax
238
           xor eax, eax
239
	   ret
239
	   ret
240
endp
240
endp
241
 
241
 
242
align 4
242
align 4
243
proc alloc_kernel_space stdcall, size:dword
243
proc alloc_kernel_space stdcall, size:dword
244
           local block_ind:DWORD
244
           local block_ind:DWORD
245
 
245
 
246
           mov eax, [size]
246
           mov eax, [size]
247
           add eax, 4095
247
           add eax, 4095
248
           and eax, not 4095
248
           and eax, not 4095
249
           mov [size], eax
249
           mov [size], eax
250
 
250
 
251
           mov ebx, heap_mutex
251
           mov ebx, heap_mutex
252
           call wait_mutex    ;ebx
252
           call wait_mutex    ;ebx
253
 
253
 
254
           cmp eax, [heap_free]
254
           cmp eax, [heap_free]
255
           ja .error
255
           ja .error
256
 
256
 
257
           shr eax, 12
257
           shr eax, 12
258
           sub eax, 1
258
           sub eax, 1
259
 
259
 
260
           mov [block_ind], eax
260
           mov [block_ind], eax
261
 
261
 
262
           stdcall get_block, eax
262
           stdcall get_block, eax
263
           test eax, eax
263
           test eax, eax
264
           jz .error
264
           jz .error
265
 
265
 
266
           mov edi, eax           ;edi - pBlock
266
           mov edi, eax           ;edi - pBlock
267
 
267
 
268
           cmp [edi+block_flags], FREE_BLOCK
268
           cmp [edi+block_flags], FREE_BLOCK
269
           jne .error
269
           jne .error
270
 
270
 
271
           mov [block_ind], ebx   ;index of allocated block
271
           mov [block_ind], ebx   ;index of allocated block
272
 
272
 
273
           mov eax, [edi+block_size]
273
           mov eax, [edi+block_size]
274
           cmp eax, [size]
274
           cmp eax, [size]
275
           je .m_eq_size
275
           je .m_eq_size
276
 
276
 
277
           call alloc_mem_block
277
           call alloc_mem_block
278
           and eax, eax
278
           and eax, eax
279
           jz .error
279
           jz .error
280
 
280
 
281
           mov esi, eax           ;esi - splitted block
281
           mov esi, eax           ;esi - splitted block
282
 
282
 
283
           mov [esi+block_next], edi
283
           mov [esi+block_next], edi
284
           mov eax, [edi+block_prev]
284
           mov eax, [edi+block_prev]
285
           mov [esi+block_prev], eax
285
           mov [esi+block_prev], eax
286
           mov [edi+block_prev], esi
286
           mov [edi+block_prev], esi
287
           mov [esi+list_next], 0
287
           mov [esi+list_next], 0
288
           mov [esi+list_prev], 0
288
           mov [esi+list_prev], 0
289
           and eax, eax
289
           and eax, eax
290
           jz @f
290
           jz @f
291
           mov [eax+block_next], esi
291
           mov [eax+block_next], esi
292
@@:
292
@@:
293
           mov ebx, [edi+block_base]
293
           mov ebx, [edi+block_base]
294
           mov [esi+block_base], ebx
294
           mov [esi+block_base], ebx
295
           mov edx, [size]
295
           mov edx, [size]
296
           mov [esi+block_size], edx
296
           mov [esi+block_size], edx
297
           add [edi+block_base], edx
297
           add [edi+block_base], edx
298
           sub [edi+block_size], edx
298
           sub [edi+block_size], edx
299
 
299
 
300
           mov eax, [edi+block_size]
300
           mov eax, [edi+block_size]
301
           shr eax, 12
301
           shr eax, 12
302
           sub eax, 1
302
           sub eax, 1
303
           cmp eax, 63
303
           cmp eax, 63
304
           jna @f
304
           jna @f
305
           mov eax, 63
305
           mov eax, 63
306
@@:
306
@@:
307
           cmp eax, [block_ind]
307
           cmp eax, [block_ind]
308
           je .m_eq_ind
308
           je .m_eq_ind
309
 
309
 
310
           remove_from_list edi
310
           remove_from_list edi
311
 
311
 
312
           mov ecx, [block_ind]
312
           mov ecx, [block_ind]
313
           mov [mem_block_list+ecx*4], edx
313
           mov [mem_block_list+ecx*4], edx
314
 
314
 
315
           test edx, edx
315
           test edx, edx
316
           jnz @f
316
           jnz @f
317
           btr [mem_block_mask], ecx
317
           btr [mem_block_mask], ecx
318
@@:
318
@@:
319
           mov edx, [mem_block_list+eax*4]
319
           mov edx, [mem_block_list+eax*4]
320
           mov [edi+list_next], edx
320
           mov [edi+list_next], edx
321
           test edx, edx
321
           test edx, edx
322
           jz @f
322
           jz @f
323
           mov [edx+list_prev], edi
323
           mov [edx+list_prev], edi
324
@@:
324
@@:
325
           mov [mem_block_list+eax*4], edi
325
           mov [mem_block_list+eax*4], edi
326
           bts [mem_block_mask], eax
326
           bts [mem_block_mask], eax
327
.m_eq_ind:
327
.m_eq_ind:
328
           mov ebx, [mem_used_list]
328
           mov ebx, [mem_used_list]
329
           mov [esi+list_next], ebx
329
           mov [esi+list_next], ebx
330
           test ebx, ebx
330
           test ebx, ebx
331
           jz @f
331
           jz @f
332
           mov [ebx+list_prev], esi
332
           mov [ebx+list_prev], esi
333
@@:
333
@@:
334
           mov [esi+block_flags], USED_BLOCK
334
           mov [esi+block_flags], USED_BLOCK
335
           mov [mem_used_list], esi
335
           mov [mem_used_list], esi
336
           mov eax, [esi+block_base]
336
           mov eax, [esi+block_base]
337
           mov ebx, [size]
337
           mov ebx, [size]
338
           sub [heap_free], ebx
338
           sub [heap_free], ebx
339
           and [heap_mutex], 0
339
           and [heap_mutex], 0
340
           ret
340
           ret
341
.m_eq_size:
341
.m_eq_size:
342
           remove_from_list edi
342
           remove_from_list edi
343
           mov [mem_block_list+ebx*4], edx
343
           mov [mem_block_list+ebx*4], edx
344
           and edx, edx
344
           and edx, edx
345
           jnz @f
345
           jnz @f
346
           btr [mem_block_mask], ebx
346
           btr [mem_block_mask], ebx
347
@@:
347
@@:
348
           mov ecx, [mem_used_list]
348
           mov ecx, [mem_used_list]
349
           mov [edi+list_next], ecx
349
           mov [edi+list_next], ecx
350
           test ecx, ecx
350
           test ecx, ecx
351
           jnz @f
351
           jnz @f
352
           mov [ecx+list_prev], edi
352
           mov [ecx+list_prev], edi
353
@@:
353
@@:
354
           mov [mem_used_list], edi
354
           mov [mem_used_list], edi
355
           mov [edi+block_flags], USED_BLOCK
355
           mov [edi+block_flags], USED_BLOCK
356
           mov eax, [edi+block_base]
356
           mov eax, [edi+block_base]
357
           mov ebx, [size]
357
           mov ebx, [size]
358
           sub [heap_free], ebx
358
           sub [heap_free], ebx
359
           and [heap_mutex], 0
359
           and [heap_mutex], 0
360
           ret
360
           ret
361
.error:
361
.error:
362
           xor eax, eax
362
           xor eax, eax
363
           mov [heap_mutex], eax
363
           mov [heap_mutex], eax
364
           ret
364
           ret
365
endp
365
endp
366
 
366
 
367
align 4
367
align 4
368
proc free_kernel_space stdcall, base:dword
368
proc free_kernel_space stdcall, base:dword
369
 
369
 
370
           mov ebx, heap_mutex
370
           mov ebx, heap_mutex
371
           call wait_mutex    ;ebx
371
           call wait_mutex    ;ebx
372
 
372
 
373
           mov eax, [base]
373
           mov eax, [base]
374
           mov esi, [mem_used_list]
374
           mov esi, [mem_used_list]
375
@@:
375
@@:
376
           test esi, esi
376
           test esi, esi
377
           jz .fail
377
           jz .fail
378
 
378
 
379
           cmp [esi+block_base], eax
379
           cmp [esi+block_base], eax
380
           je .found
380
           je .found
381
           mov esi, [esi+list_next]
381
           mov esi, [esi+list_next]
382
           jmp @b
382
           jmp @b
383
.found:
383
.found:
384
           cmp [esi+block_flags], USED_BLOCK
384
           cmp [esi+block_flags], USED_BLOCK
385
           jne .fail
385
           jne .fail
386
 
386
 
387
           mov eax, [esi+block_size]
387
           mov eax, [esi+block_size]
388
           add [heap_free], eax
388
           add [heap_free], eax
389
 
389
 
390
           mov edi, [esi+block_next]
390
           mov edi, [esi+block_next]
391
           test edi, edi
391
           test edi, edi
392
           jz .prev
392
           jz .prev
393
 
393
 
394
           cmp [edi+block_flags], FREE_BLOCK
394
           cmp [edi+block_flags], FREE_BLOCK
395
           jne .prev
395
           jne .prev
396
 
396
 
397
           remove_from_free edi
397
           remove_from_free edi
398
 
398
 
399
           mov edx, [edi+block_next]
399
           mov edx, [edi+block_next]
400
           mov [esi+block_next], edx
400
           mov [esi+block_next], edx
401
           test edx, edx
401
           test edx, edx
402
           jz @f
402
           jz @f
403
 
403
 
404
           mov [edx+block_prev], esi
404
           mov [edx+block_prev], esi
405
@@:
405
@@:
406
           mov ecx, [edi+block_size]
406
           mov ecx, [edi+block_size]
407
           add [esi+block_size], ecx
407
           add [esi+block_size], ecx
408
 
408
 
409
           mov eax, edi
409
           mov eax, edi
410
           call free_mem_block
410
           call free_mem_block
411
.prev:
411
.prev:
412
           mov edi, [esi+block_prev]
412
           mov edi, [esi+block_prev]
413
           test edi, edi
413
           test edi, edi
414
           jz .insert
414
           jz .insert
415
 
415
 
416
           cmp [edi+block_flags], FREE_BLOCK
416
           cmp [edi+block_flags], FREE_BLOCK
417
           jne .insert
417
           jne .insert
418
 
418
 
419
           remove_from_used esi
419
           remove_from_used esi
420
 
420
 
421
           mov edx, [esi+block_next]
421
           mov edx, [esi+block_next]
422
           mov [edi+block_next], edx
422
           mov [edi+block_next], edx
423
           test edx, edx
423
           test edx, edx
424
           jz @f
424
           jz @f
425
           mov [edx+block_prev], edi
425
           mov [edx+block_prev], edi
426
@@:
426
@@:
427
           mov eax, esi
427
           mov eax, esi
428
           call free_mem_block
428
           call free_mem_block
429
 
429
 
430
           mov ecx, [edi+block_size]
430
           mov ecx, [edi+block_size]
431
           mov eax, [esi+block_size]
431
           mov eax, [esi+block_size]
432
           add eax, ecx
432
           add eax, ecx
433
           mov [edi+block_size], eax
433
           mov [edi+block_size], eax
434
 
434
 
435
           calc_index eax
435
           calc_index eax
436
           calc_index ecx
436
           calc_index ecx
437
           cmp eax, ecx
437
           cmp eax, ecx
438
           je .m_eq
438
           je .m_eq
439
 
439
 
440
           push ecx
440
           push ecx
441
           remove_from_list edi
441
           remove_from_list edi
442
           pop ecx
442
           pop ecx
443
 
443
 
444
           cmp [mem_block_list+ecx*4], edi
444
           cmp [mem_block_list+ecx*4], edi
445
           jne @f
445
           jne @f
446
           mov [mem_block_list+ecx*4], edx
446
           mov [mem_block_list+ecx*4], edx
447
@@:
447
@@:
448
           cmp [mem_block_list+ecx*4], 0
448
           cmp [mem_block_list+ecx*4], 0
449
           jne @f
449
           jne @f
450
           btr [mem_block_mask], ecx
450
           btr [mem_block_mask], ecx
451
@@:
451
@@:
452
           mov esi, [mem_block_list+eax*4]
452
           mov esi, [mem_block_list+eax*4]
453
           mov [mem_block_list+eax*4], edi
453
           mov [mem_block_list+eax*4], edi
454
           mov [edi+list_next], esi
454
           mov [edi+list_next], esi
455
           test esi, esi
455
           test esi, esi
456
           jz @f
456
           jz @f
457
           mov [esi+list_prev], edi
457
           mov [esi+list_prev], edi
458
@@:
458
@@:
459
           bts [mem_block_mask], eax
459
           bts [mem_block_mask], eax
460
.m_eq:
460
.m_eq:
461
           xor eax, eax
461
           xor eax, eax
462
           mov [heap_mutex], eax
462
           mov [heap_mutex], eax
463
           not eax
463
           not eax
464
           ret
464
           ret
465
.insert:
465
.insert:
466
           remove_from_used esi
466
           remove_from_used esi
467
 
467
 
468
           mov eax, [esi+block_size]
468
           mov eax, [esi+block_size]
469
           calc_index eax
469
           calc_index eax
470
 
470
 
471
           mov edi, [mem_block_list+eax*4]
471
           mov edi, [mem_block_list+eax*4]
472
           mov [mem_block_list+eax*4], esi
472
           mov [mem_block_list+eax*4], esi
473
           mov [esi+list_next], edi
473
           mov [esi+list_next], edi
474
           test edi, edi
474
           test edi, edi
475
           jz @f
475
           jz @f
476
           mov [edi+list_prev], esi
476
           mov [edi+list_prev], esi
477
@@:
477
@@:
478
           bts [mem_block_mask], eax
478
           bts [mem_block_mask], eax
479
           mov [esi+block_flags],FREE_BLOCK
479
           mov [esi+block_flags],FREE_BLOCK
480
           xor eax, eax
480
           xor eax, eax
481
           mov [heap_mutex], eax
481
           mov [heap_mutex], eax
482
           not eax
482
           not eax
483
           ret
483
           ret
484
.fail:
484
.fail:
485
           xor eax, eax
485
           xor eax, eax
486
           mov [heap_mutex], eax
486
           mov [heap_mutex], eax
487
           ret
487
           ret
488
endp
488
endp
489
 
489
 
490
align 4
490
align 4
491
proc kernel_alloc stdcall, size:dword
491
proc kernel_alloc stdcall, size:dword
492
           locals
492
           locals
493
             lin_addr    dd ?
493
             lin_addr    dd ?
494
             pages_count dd ?
494
             pages_count dd ?
495
           endl
495
           endl
496
 
496
 
497
           mov eax, [size]
497
           mov eax, [size]
498
           add eax, 4095
498
           add eax, 4095
499
           and eax, not 4095;
499
           and eax, not 4095;
500
           mov [size], eax
500
           mov [size], eax
501
           and eax, eax
501
           and eax, eax
502
           jz .error
502
           jz .error
503
           mov ebx, eax
503
           mov ebx, eax
504
           shr ebx, 12
504
           shr ebx, 12
505
           mov [pages_count], ebx
505
           mov [pages_count], ebx
506
 
506
 
507
           stdcall alloc_kernel_space, eax
507
           stdcall alloc_kernel_space, eax
508
           and eax, eax
508
           and eax, eax
509
           jz .error
509
           jz .error
510
           mov [lin_addr], eax
510
           mov [lin_addr], eax
511
 
511
 
512
           mov ecx, [pages_count]
512
           mov ecx, [pages_count]
513
           mov edx, eax
513
           mov edx, eax
514
           mov ebx, ecx
514
           mov ebx, ecx
515
 
515
 
516
           shr ecx, 3
516
           shr ecx, 3
517
           jz .next
517
           jz .next
518
 
518
 
519
           and ebx, not 7
519
           and ebx, not 7
520
           push ebx
520
           push ebx
521
           stdcall alloc_pages, ebx
521
           stdcall alloc_pages, ebx
522
           pop ecx                   ; yes ecx!!!
522
           pop ecx                   ; yes ecx!!!
523
           and eax, eax
523
           and eax, eax
524
           jz .error
524
           jz .error
525
 
525
 
526
           mov edi, eax
526
           mov edi, eax
527
           mov edx, [lin_addr]
527
           mov edx, [lin_addr]
528
@@:
528
@@:
529
           stdcall map_page,edx,edi,dword PG_SW
529
           stdcall map_page,edx,edi,dword PG_SW
530
           add edx, 0x1000
530
           add edx, 0x1000
531
           add edi, 0x1000
531
           add edi, 0x1000
532
           dec ecx
532
           dec ecx
533
           jnz @B
533
           jnz @B
534
.next:
534
.next:
535
           mov ecx, [pages_count]
535
           mov ecx, [pages_count]
536
           and ecx, 7
536
           and ecx, 7
537
           jz .end
537
           jz .end
538
 
538
 
539
@@:        push ecx
539
@@:        push ecx
540
           call alloc_page
540
           call alloc_page
541
           pop ecx
541
           pop ecx
542
           test eax, eax
542
           test eax, eax
543
           jz .error
543
           jz .error
544
 
544
 
545
           stdcall map_page,edx,eax,dword PG_SW
545
           stdcall map_page,edx,eax,dword PG_SW
546
           add edx, 0x1000
546
           add edx, 0x1000
547
           dec ecx
547
           dec ecx
548
           jnz @B
548
           jnz @B
549
.end:
549
.end:
550
           mov eax, [lin_addr]
550
           mov eax, [lin_addr]
551
           ret
551
           ret
552
.error:
552
.error:
553
           xor eax, eax
553
           xor eax, eax
554
           ret
554
           ret
555
endp
555
endp
556
 
556
 
557
align 4
557
align 4
558
proc kernel_free stdcall, base:dword
558
proc kernel_free stdcall, base:dword
559
 
559
 
560
           mov ebx, heap_mutex
560
           mov ebx, heap_mutex
561
           call wait_mutex    ;ebx
561
           call wait_mutex    ;ebx
562
 
562
 
563
           mov eax, [base]
563
           mov eax, [base]
564
           mov esi, [mem_used_list]
564
           mov esi, [mem_used_list]
565
@@:
565
@@:
566
           test esi, esi
566
           test esi, esi
567
           jz .fail
567
           jz .fail
568
 
568
 
569
           cmp [esi+block_base], eax
569
           cmp [esi+block_base], eax
570
           je .found
570
           je .found
571
           mov esi, [esi+list_next]
571
           mov esi, [esi+list_next]
572
           jmp @b
572
           jmp @b
573
.found:
573
.found:
574
           cmp [esi+block_flags], USED_BLOCK
574
           cmp [esi+block_flags], USED_BLOCK
575
           jne .fail
575
           jne .fail
576
 
576
 
577
           and [heap_mutex], 0
577
           and [heap_mutex], 0
578
 
578
 
579
           mov ecx, [esi+block_size];
579
           mov ecx, [esi+block_size];
580
           shr ecx, 12
580
           shr ecx, 12
581
           call release_pages   ;eax, ecx
581
           call release_pages   ;eax, ecx
582
           stdcall free_kernel_space, [base]
582
           stdcall free_kernel_space, [base]
583
           ret
583
           ret
584
.fail:
584
.fail:
585
           and [heap_mutex], 0
585
           and [heap_mutex], 0
586
           ret
586
           ret
587
endp
587
endp
588
 
588
 
589
restore block_next
589
restore block_next
590
restore block_prev
590
restore block_prev
591
restore block_list
591
restore block_list
592
restore block_base
592
restore block_base
593
restore block_size
593
restore block_size
594
restore block_flags
594
restore block_flags
595
 
595
 
596
;;;;;;;;;;;;;;      USER     ;;;;;;;;;;;;;;;;;
596
;;;;;;;;;;;;;;      USER     ;;;;;;;;;;;;;;;;;
597
 
597
 
598
HEAP_TOP  equ 0x5FC00000
598
HEAP_TOP  equ 0x5FC00000
599
 
599
 
600
align 4
600
align 4
601
proc init_heap
601
proc init_heap
602
 
602
 
603
           mov ebx,[CURRENT_TASK]
603
           mov ebx,[CURRENT_TASK]
604
           shl ebx,8
604
           shl ebx,8
605
           mov eax, [PROC_BASE+APPDATA.heap_top+ebx]
605
           mov eax, [PROC_BASE+APPDATA.heap_top+ebx]
606
           test eax, eax
606
           test eax, eax
607
           jz @F
607
           jz @F
608
           sub eax,[PROC_BASE+APPDATA.heap_base+ebx]
608
           sub eax,[PROC_BASE+APPDATA.heap_base+ebx]
609
           sub eax, 4096
609
           sub eax, 4096
610
           ret
610
           ret
611
@@:
611
@@:
612
           mov esi, [PROC_BASE+APPDATA.mem_size+ebx]
612
           mov esi, [PROC_BASE+APPDATA.mem_size+ebx]
613
           add esi, 4095
613
           add esi, 4095
614
           and esi, not 4095
614
           and esi, not 4095
615
           mov eax, HEAP_TOP
615
           mov [PROC_BASE+APPDATA.mem_size+ebx], esi
-
 
616
           mov eax, HEAP_TOP
616
           mov [PROC_BASE+APPDATA.heap_base+ebx], esi
617
           mov [PROC_BASE+APPDATA.heap_base+ebx], esi
617
           mov [PROC_BASE+APPDATA.heap_top+ebx], eax
618
           mov [PROC_BASE+APPDATA.heap_top+ebx], eax
618
 
619
 
619
           sub eax, esi
620
           sub eax, esi
620
           add esi, new_app_base
621
           add esi, new_app_base
621
           shr esi, 10
622
           shr esi, 10
622
           mov ecx, eax
623
           mov ecx, eax
623
           sub eax, 4096
624
           sub eax, 4096
624
           or ecx, FREE_BLOCK
625
           or ecx, FREE_BLOCK
625
           mov [pages_tab+esi], ecx
626
           mov [pages_tab+esi], ecx
626
           ret
627
           ret
627
.exit:
628
.exit:
628
           xor eax, eax
629
           xor eax, eax
629
           ret
630
           ret
630
endp
631
endp
631
 
632
 
632
align 4
633
align 4
633
proc user_alloc stdcall, alloc_size:dword
634
proc user_alloc stdcall, alloc_size:dword
634
 
635
 
635
           mov ecx, [alloc_size]
636
           mov ecx, [alloc_size]
636
           add ecx, (4095+4096)
637
           add ecx, (4095+4096)
637
           and ecx, not 4095
638
           and ecx, not 4095
638
 
639
 
639
           mov ebx, [CURRENT_TASK]
640
           mov ebx, [CURRENT_TASK]
640
           shl ebx, 8
641
           shl ebx, 8
641
           mov esi, dword [ebx+PROC_BASE+APPDATA.heap_base]; heap_base
642
           mov esi, dword [ebx+PROC_BASE+APPDATA.heap_base]; heap_base
642
           mov edi, dword [ebx+PROC_BASE+APPDATA.heap_top]; heap_top
643
           mov edi, dword [ebx+PROC_BASE+APPDATA.heap_top]; heap_top
643
           add esi, new_app_base
644
           add esi, new_app_base
644
           add edi, new_app_base
645
           add edi, new_app_base
645
l_0:
646
l_0:
646
           cmp esi, edi
647
           cmp esi, edi
647
           jae m_exit
648
           jae m_exit
648
 
649
 
649
           mov ebx, esi
650
           mov ebx, esi
650
           shr ebx, 12
651
           shr ebx, 12
651
           mov eax, [pages_tab+ebx*4]
652
           mov eax, [pages_tab+ebx*4]
652
           test eax, FREE_BLOCK
653
           test eax, FREE_BLOCK
653
           jz test_used
654
           jz test_used
654
           and eax, 0xFFFFF000
655
           and eax, 0xFFFFF000
655
           cmp eax, ecx    ;alloc_size
656
           cmp eax, ecx    ;alloc_size
656
           jb  m_next
657
           jb  m_next
657
	   jz  @f
658
	   jz  @f
658
 
659
 
659
           mov edx, esi
660
           mov edx, esi
660
           add edx, ecx
661
           add edx, ecx
661
           sub eax, ecx;
662
           sub eax, ecx;
662
           or eax, FREE_BLOCK
663
           or eax, FREE_BLOCK
663
           shr edx, 12
664
           shr edx, 12
664
           mov [pages_tab+edx*4], eax
665
           mov [pages_tab+edx*4], eax
665
 
666
 
666
@@:
667
@@:
667
           or ecx, USED_BLOCK
668
           or ecx, USED_BLOCK
668
           mov [pages_tab+ebx*4], ecx
669
           mov [pages_tab+ebx*4], ecx
669
           shr ecx, 12
670
           shr ecx, 12
670
           dec ecx
671
           dec ecx
671
           inc ebx
672
           inc ebx
672
@@:
673
@@:
673
           mov dword [pages_tab+ebx*4], 2
674
           mov dword [pages_tab+ebx*4], 2
674
           inc ebx
675
           inc ebx
675
           dec ecx
676
           dec ecx
676
           jnz @B
677
           jnz @B
677
 
678
 
-
 
679
        mov     edx, [CURRENT_TASK]
-
 
680
        shl     edx, 8
-
 
681
        mov     ebx, [alloc_size]
-
 
682
        add     ebx, 0xFFF
-
 
683
        and     ebx, not 0xFFF
-
 
684
        add     ebx, [PROC_BASE+APPDATA.mem_size+edx]
-
 
685
        call    update_mem_size
-
 
686
 
678
           mov eax, esi
687
           mov eax, esi
679
           add eax, 4096
688
           add eax, 4096
680
           sub eax, new_app_base
689
           sub eax, new_app_base
681
           ret
690
           ret
682
m_next:
691
m_next:
683
           add esi, eax
692
           add esi, eax
684
           jmp l_0
693
           jmp l_0
685
test_used:
694
test_used:
686
           test eax, USED_BLOCK
695
           test eax, USED_BLOCK
687
           jz m_exit
696
           jz m_exit
688
 
697
 
689
           and eax, 0xFFFFF000
698
           and eax, 0xFFFFF000
690
           add esi, eax
699
           add esi, eax
691
           jmp l_0
700
           jmp l_0
692
m_exit:
701
m_exit:
693
           xor eax, eax
702
           xor eax, eax
694
           ret
703
           ret
695
endp
704
endp
696
 
705
 
697
align 4
706
align 4
698
proc user_free stdcall, base:dword
707
proc user_free stdcall, base:dword
699
 
708
 
700
           mov esi, [base]
709
           mov esi, [base]
701
           test esi, esi
710
           test esi, esi
702
           jz .exit
711
           jz .exit
703
 
712
 
-
 
713
           xor ebx, ebx
704
           sub esi, 4096
714
           sub esi, 4096
705
           shr esi, 12
715
           shr esi, 12
706
           mov eax, [pages_tab+esi*4]
716
           mov eax, [pages_tab+esi*4]
707
           test eax, USED_BLOCK
717
           test eax, USED_BLOCK
708
           jz .not_used
718
           jz .not_used
709
 
719
 
710
           and eax, not 4095
720
           and eax, not 4095
711
           mov ecx, eax
721
           mov ecx, eax
712
           or eax, FREE_BLOCK
722
           or eax, FREE_BLOCK
713
           mov [pages_tab+esi*4], eax
723
           mov [pages_tab+esi*4], eax
714
           inc esi
724
           inc esi
715
           sub ecx, 4096
725
           sub ecx, 4096
716
           shr ecx, 12
726
           shr ecx, 12
717
.release:
727
           mov ebx, ecx
-
 
728
.release:
718
           xor eax, eax
729
           xor eax, eax
719
           xchg eax, [pages_tab+esi*4]
730
           xchg eax, [pages_tab+esi*4]
720
           test eax, 1
731
           test eax, 1
721
           jz @F
732
           jz @F
722
           call free_page
733
           call free_page
723
@@:
734
@@:
724
           inc esi
735
           inc esi
725
           dec ecx
736
           dec ecx
726
           jnz .release
737
           jnz .release
727
.not_used:
738
.not_used:
728
           mov ebx, [CURRENT_TASK]
739
           mov edx, [CURRENT_TASK]
729
           shl ebx, 8
740
           shl edx, 8
730
           mov esi, dword [ebx+PROC_BASE+APPDATA.heap_base]; heap_base
741
           mov esi, dword [edx+PROC_BASE+APPDATA.heap_base]; heap_base
731
           mov edi, dword [ebx+PROC_BASE+APPDATA.heap_top]; heap_top
742
           mov edi, dword [edx+PROC_BASE+APPDATA.heap_top]; heap_top
732
           add esi, new_app_base
743
           sub ebx, [edx+PROC_BASE+APPDATA.mem_size]
-
 
744
           neg ebx
-
 
745
           call update_mem_size
-
 
746
           add esi, new_app_base
733
           add edi, new_app_base
747
           add edi, new_app_base
734
           shr esi, 12
748
           shr esi, 12
735
           shr edi, 12
749
           shr edi, 12
736
@@:
750
@@:
737
           mov eax, [pages_tab+esi*4]
751
           mov eax, [pages_tab+esi*4]
738
           test eax, USED_BLOCK
752
           test eax, USED_BLOCK
739
           jz .test_free
753
           jz .test_free
740
           shr eax, 12
754
           shr eax, 12
741
           add esi, eax
755
           add esi, eax
742
           jmp @B
756
           jmp @B
743
.test_free:
757
.test_free:
744
           test eax, FREE_BLOCK
758
           test eax, FREE_BLOCK
745
           jz .err
759
           jz .err
746
           mov edx, eax
760
           mov edx, eax
747
           shr edx, 12
761
           shr edx, 12
748
           add edx, esi
762
           add edx, esi
749
           cmp edx, edi
763
           cmp edx, edi
750
           jae .exit
764
           jae .exit
751
 
765
 
752
           mov ebx, [pages_tab+edx*4]
766
           mov ebx, [pages_tab+edx*4]
753
           test ebx, USED_BLOCK
767
           test ebx, USED_BLOCK
754
           jz .next_free
768
           jz .next_free
755
 
769
 
756
           shr ebx, 12
770
           shr ebx, 12
757
           add edx, ebx
771
           add edx, ebx
758
           mov esi, edx
772
           mov esi, edx
759
           jmp @B
773
           jmp @B
760
.next_free:
774
.next_free:
761
           test ebx, FREE_BLOCK
775
           test ebx, FREE_BLOCK
762
           jz .err
776
           jz .err
763
           and dword [pages_tab+edx*4], 0
777
           and dword [pages_tab+edx*4], 0
764
           add eax, ebx
778
           add eax, ebx
765
           and eax, not 4095
779
           and eax, not 4095
766
           or eax, FREE_BLOCK
780
           or eax, FREE_BLOCK
767
           mov [pages_tab+esi*4], eax
781
           mov [pages_tab+esi*4], eax
768
           jmp @B
782
           jmp @B
769
.exit:
783
.exit:
770
           xor eax, eax
784
           xor eax, eax
771
           inc eax
785
           inc eax
772
           ret
786
           ret
773
.err:
787
.err:
774
           xor eax, eax
788
           xor eax, eax
775
           ret
789
           ret
776
endp
790
endp
777
 
791
 
778
if 0
792
if 0
779
align 4
793
align 4
780
proc alloc_dll
794
proc alloc_dll
781
           pushf
795
           pushf
782
           cli
796
           cli
783
           bsf eax, [dll_map]
797
           bsf eax, [dll_map]
784
           jnz .find
798
           jnz .find
785
           popf
799
           popf
786
           xor eax, eax
800
           xor eax, eax
787
           ret
801
           ret
788
.find:
802
.find:
789
           btr [dll_map], eax
803
           btr [dll_map], eax
790
           popf
804
           popf
791
           shl eax, 5
805
           shl eax, 5
792
           add eax, dll_tab
806
           add eax, dll_tab
793
           ret
807
           ret
794
endp
808
endp
795
 
809
 
796
align 4
810
align 4
797
proc alloc_service
811
proc alloc_service
798
           pushf
812
           pushf
799
           cli
813
           cli
800
           bsf eax, [srv_map]
814
           bsf eax, [srv_map]
801
           jnz .find
815
           jnz .find
802
           popf
816
           popf
803
           xor eax, eax
817
           xor eax, eax
804
           ret
818
           ret
805
.find:
819
.find:
806
           btr [srv_map], eax
820
           btr [srv_map], eax
807
           popf
821
           popf
808
           shl eax,0x02
822
           shl eax,0x02
809
           lea eax,[srv_tab+eax+eax*8]   ;srv_tab+eax*36
823
           lea eax,[srv_tab+eax+eax*8]   ;srv_tab+eax*36
810
           ret
824
           ret
811
endp
825
endp
812
 
826
 
813
end if
827
end if