Subversion Repositories Kolibri OS

Rev

Rev 214 | Rev 266 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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