Subversion Repositories Kolibri OS

Rev

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

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