Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
164 serge 1
 
2
;HEAP_SIZE equ 0x01000000
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, 0x01000000 + 4096*MEM_BLOCK_SIZE
170 serge 129
           mov [heap_size], ecx
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
           shl ebx, 3
217
           add eax,ebx
218
           shl eax, 5
219
           add eax, [mem_block_arr]
220
           dec [free_blocks]
170 serge 221
           popfd
164 serge 222
           ret
223
endp
224
225
 
226
           pushfd
227
           cli
228
           sub eax, [mem_block_arr]
229
           shr eax, 5
230
231
 
232
           bts [ebx], eax
233
           inc [free_blocks]
170 serge 234
           shr eax, 3
164 serge 235
           and eax, not 3
236
           add eax, ebx
237
           cmp [mem_block_start], eax
238
           ja @f
239
           popfd
240
           ret
241
@@:
242
           mov [mem_block_start], eax
243
           popfd
244
	   ret
245
.err:
246
           xor eax, eax
247
           popfd
248
	   ret
249
endp
250
251
 
252
proc alloc_kernel_space stdcall, size:dword
253
           local block_ind:DWORD
254
255
 
256
           cli
257
258
 
259
           add eax, 0xFFF
260
           and eax, 0xFFFFF000;
261
           mov [size], eax
262
           cmp eax, [heap_free]
170 serge 263
           ja .error
264
164 serge 265
 
266
           sub eax, 1
267
268
 
269
270
 
271
           and eax, eax
272
           jz .error
273
274
 
275
276
 
277
           jne .error
278
279
 
280
281
 
282
           cmp eax, [size]
283
           je .m_eq_size
284
285
 
286
           and eax, eax
287
           jz .error
288
289
 
290
291
 
292
           mov eax, [edi+block_prev]
293
           mov [esi+block_prev], eax
294
           mov [edi+block_prev], esi
295
           mov [esi+list_next], 0
296
           mov [esi+list_prev], 0
297
           and eax, eax
298
           jz @f
299
           mov [eax+block_next], esi
300
@@:
301
           mov ebx, [edi+block_base]
302
           mov [esi+block_base], ebx
303
           mov edx, [size]
304
           mov [esi+block_size], edx
305
           add [edi+block_base], edx
306
           sub [edi+block_size], edx
307
308
 
309
           shr eax, 12
310
           sub eax, 1
311
           cmp eax, 63
312
           jna @f
313
           mov eax, 63
314
@@:
315
           cmp eax, [block_ind]
316
           je .m_eq_ind
317
318
 
319
           test ebx, ebx
320
           jz @f
321
322
 
323
@@:
324
           mov ecx, [block_ind]
325
           mov [mem_block_list+ecx*4], ebx
326
327
 
328
           jnz @f
329
           btr [mem_block_mask], ecx
330
@@:
331
           mov edx, [mem_block_list+eax*4]
332
           mov [edi+list_next], edx
333
           test edx, edx
334
           jz @f
335
           mov [edx+list_prev], edi
336
@@:
337
           mov [mem_block_list+eax*4], edi
338
           bts [mem_block_mask], eax
339
.m_eq_ind:
340
           mov ebx, [mem_used_list]
341
           mov [esi+list_next], ebx
342
           test ebx, ebx
343
           jz @f
344
           mov [ebx+list_prev], esi
345
@@:
346
           mov [esi+block_flags], USED_BLOCK
347
           mov [mem_used_list], esi
348
           mov eax, [esi+block_base]
349
           mov ebx, [size]
170 serge 350
           sub [heap_free], ebx
351
           popfd
164 serge 352
           ret
353
354
 
355
           remove_from_list edi
356
           mov [mem_block_list+ecx*4], edx
357
           and edx, edx
358
           jnz @f
359
           mov ecx, [block_ind]
360
           btr [mem_block_mask], ecx
361
@@:
362
           mov ebx, [mem_used_list]
363
           mov [edi+list_next], ebx
364
           test ebx, ebx
365
           jnz @f
366
           mov [ebx+list_prev], edi
367
@@:
368
           mov [mem_used_list], edi
369
           mov [edi+block_flags], USED_BLOCK
370
           mov eax, [edi+block_base]
371
           mov ebx, [size]
170 serge 372
           sub [heap_free], ebx
373
           popfd
164 serge 374
           ret
375
.error:
376
           xor eax, eax
377
           popfd
378
           ret
379
endp
380
381
 
382
proc free_kernel_space stdcall, base:dword
383
384
 
385
           mov esi, [mem_used_list]
386
@@:
387
           test esi, esi
388
           jz .fail
389
390
 
391
           je .found
392
           mov esi, [esi+list_next]
393
           jmp @b
394
.found:
395
           cmp [esi+block_flags], USED_BLOCK
396
           jne .fail
397
398
 
170 serge 399
           add [heap_free], eax
400
401
 
164 serge 402
           test edi, edi
403
           jz .prev
404
405
 
406
           jne .prev
407
408
 
409
410
 
411
           mov [esi+block_next], edx
412
           test edx, edx
413
           jz @f
414
415
 
416
@@:
417
           mov ecx, [edi+block_size]
418
           add [esi+block_size], ecx
419
420
 
421
           call free_mem_block
422
.prev:
423
           mov edi, [esi+block_prev]
424
           test edi, edi
425
           jz .insert
426
427
 
428
           jne .insert
429
430
 
431
432
 
433
           mov [edi+block_next], edx
434
           test edx, edx
435
           jz @f
436
           mov [edx+block_prev], edi
437
@@:
438
           mov eax, esi
439
           call free_mem_block
440
441
 
442
           mov eax, [esi+block_size]
443
           add eax, ecx
444
           mov [edi+block_size], eax
445
446
 
447
           calc_index ecx
448
           cmp eax, ecx
449
           je .m_eq
450
451
 
452
           remove_from_list edi
453
           pop ecx
454
455
 
456
           jne @f
457
           mov [mem_block_list+ecx*4], edx
458
@@:
459
           cmp [mem_block_list+ecx*4], 0
460
           jne @f
461
           btr [mem_block_mask], ecx
462
@@:
463
           mov esi, [mem_block_list+eax*4]
464
           mov [mem_block_list+eax*4], edi
465
           mov [edi+list_next], esi
466
           test esi, esi
467
           jz @f
468
           mov [esi+list_prev], edi
469
@@:
470
           bts [mem_block_mask], eax
471
.m_eq:
472
           xor eax, eax
473
           not eax
474
           ret
475
.insert:
476
           remove_from_used esi
477
478
 
479
           calc_index eax
480
481
 
482
           mov [mem_block_list+eax*4], esi
483
           mov [esi+list_next], edi
484
           test edi, edi
485
           jz @f
486
           mov [edi+list_prev], esi
487
@@:
488
           bts [mem_block_mask], eax
489
           mov [esi+block_flags],FREE_BLOCK
490
           xor eax, eax
491
           not eax
492
           ret
493
.fail:
494
           xor eax, eax
495
           ret
496
endp
497
498
 
499
proc kernel_alloc stdcall, size:dword
500
           locals
501
             lin_addr    dd ?
502
             pages_count dd ?
503
           endl
504
505
 
506
           add eax, 0xFFF
507
           and eax, 0xFFFFF000;
508
           mov [size], eax
509
           and eax, eax
510
           jz .error
511
           mov ebx, eax
512
           shr ebx, 12
513
           mov [pages_count], ebx
514
515
 
516
           and eax, eax
517
           jz .error
518
           mov [lin_addr], eax
519
520
 
521
           mov edx, eax
522
           mov ebx, ecx
523
524
 
525
           jz .next
526
527
 
528
           push ebx
529
           stdcall alloc_pages, ebx
530
           pop ecx                   ; yes ecx!!!
531
           and eax, eax
532
           jz .error
533
534
 
535
           mov edx, [lin_addr]
536
@@:
537
           stdcall map_page,edx,edi,dword PG_SW
538
           add edx, 0x1000
539
           add edi, 0x1000
540
           dec ecx
541
           jnz @B
542
.next:
543
           mov ecx, [pages_count]
544
           and ecx, 7
545
           jz .end
546
547
 
548
           call alloc_page
549
           pop ecx
550
           test eax, eax
551
           jz .error
552
553
 
554
           add edx, 0x1000
555
           dec ecx
556
           jnz @B
557
.end:
558
           mov eax, [lin_addr]
559
           ret
560
561
 
562
           xor eax, eax
563
           ret
564
endp
565
566
 
567
proc kernel_free stdcall, base:dword
568
           locals
569
             size  dd ?
570
           endl
571
572
 
573
           mov esi, [mem_used_list]
574
@@:
575
           test esi, esi
576
           jz .fail
577
578
 
579
           je .found
580
           mov esi, [esi+list_next]
581
           jmp @b
582
.found:
583
           cmp [esi+block_flags], USED_BLOCK
584
           jne .fail
585
586
 
587
           mov [size], ecx
588
589
 
590
           test eax, eax
591
           jz .fail
592
593
 
594
           mov edi, [base]
595
596
 
597
           mov esi, edi
598
           shr edi, 10
599
           add edi, pages_tab
600
           xor edx, edx
601
.release:
602
           mov eax, [edi]
603
           test eax, 1
604
           jz .next
605
606
 
607
           mov [edi],edx
608
.next:
609
           invlpg [esi]
610
           add esi, 0x1000
611
           add edi, 4
612
           dec ecx
613
           jnz .release
614
.fail:
615
           ret
616
endp
617
618
 
619
restore block_prev
620
restore block_list
621
restore block_base
622
restore block_size
623
restore block_flags
624
625
 
626
627
 
188 serge 628
629
 
164 serge 630
proc init_heap
188 serge 631
164 serge 632
 
172 serge 633
           shl ebx,8
634
           mov eax, [PROC_BASE+APPDATA.heap_top+ebx]
635
           test eax, eax
636
           jz @F
637
           sub eax,[PROC_BASE+APPDATA.heap_base+ebx]
638
           sub eax, 4096
639
           ret
640
@@:
641
           mov esi, [PROC_BASE+APPDATA.mem_size+ebx]
642
           add esi, 4095
188 serge 643
           and esi, not 4095
644
           mov eax, HEAP_TOP
645
           mov [PROC_BASE+APPDATA.heap_base+ebx], esi
172 serge 646
           mov [PROC_BASE+APPDATA.heap_top+ebx], eax
188 serge 647
164 serge 648
 
188 serge 649
           add esi, new_app_base
650
           shr esi, 10
651
           mov ecx, eax
652
           sub eax, 4096
164 serge 653
           or ecx, FREE_BLOCK
188 serge 654
           mov [pages_tab+esi], ecx
655
           ret
164 serge 656
.exit:
657
           xor eax, eax
658
           ret
659
endp
660
661
 
662
proc user_alloc stdcall, alloc_size:dword
663
664
 
665
           add ecx, (4095+4096)
666
           and ecx, not 4095
667
668
 
669
           shl ebx, 8
670
           mov esi, dword [ebx+PROC_BASE+APPDATA.heap_base]; heap_base
172 serge 671
           mov edi, dword [ebx+PROC_BASE+APPDATA.heap_top]; heap_top
672
           add esi, new_app_base
164 serge 673
           add edi, new_app_base
674
675
 
676
           cmp esi, edi
677
           jae m_exit
678
679
 
680
           shr ebx, 12
681
           mov eax, [pages_tab+ebx*4]
682
           test eax, FREE_BLOCK
683
           jz test_used
684
           and eax, 0xFFFFF000
685
           cmp eax, ecx    ;alloc_size
686
           jb  m_next
687
688
 
689
           add edx, ecx
690
           sub eax, ecx;
691
           or eax, FREE_BLOCK
692
           shr edx, 12
693
           mov [pages_tab+edx*4], eax
694
695
 
696
           mov [pages_tab+ebx*4], ecx
697
           shr ecx, 12
698
           dec ecx
699
           inc ebx
700
@@:
701
           mov dword [pages_tab+ebx*4], 2
702
           inc ebx
703
           dec ecx
704
           jnz @B
705
706
 
707
           add eax, 4096
708
           sub eax, new_app_base
709
           ret
710
m_next:
711
           add esi, eax
712
           jmp l_0
713
test_used:
714
           test eax, USED_BLOCK
715
           jz m_exit
716
717
 
718
           add esi, eax
719
           jmp l_0
720
m_exit:
721
           xor eax, eax
722
           ret
723
endp
724
725
 
726
proc user_free stdcall, base:dword
727
728
 
729
           test esi, esi
730
           jz .exit
731
732
 
733
           shr esi, 12
734
           mov eax, [pages_tab+esi*4]
735
           test eax, USED_BLOCK
736
           jz .not_used
188 serge 737
164 serge 738
 
739
           mov ecx, eax
740
           or eax, FREE_BLOCK
741
           mov [pages_tab+esi*4], eax
742
           inc esi
743
           sub ecx, 4096
744
           shr ecx, 12
745
.release:
746
           xor eax, eax
188 serge 747
           xchg eax, [pages_tab+esi*4]
748
           test eax, 1
749
           jz @F
750
           call free_page
164 serge 751
@@:
188 serge 752
           inc esi
164 serge 753
           dec ecx
754
           jnz .release
755
.not_used:
188 serge 756
           mov ebx, [CURRENT_TASK]
164 serge 757
           shl ebx, 8
758
           mov esi, dword [ebx+PROC_BASE+APPDATA.heap_base]; heap_base
172 serge 759
           mov edi, dword [ebx+PROC_BASE+APPDATA.heap_top]; heap_top
760
           shr esi, 12
164 serge 761
           shr edi, 12
762
@@:
763
           mov eax, [pages_tab+esi*4]
764
           test eax, USED_BLOCK
765
           jz .test_free
766
           shr eax, 12
767
           add esi, eax
768
           jmp @B
769
.test_free:
770
           test eax, FREE_BLOCK
771
           jz .err
772
           mov edx, eax
773
           shr edx, 12
774
           add edx, esi
775
           cmp edx, edi
776
           jae .exit
777
778
 
779
           test ebx, USED_BLOCK
780
           jz .next_free
781
782
 
783
           add edx, ebx
784
           mov esi, edx
785
           jmp @B
786
.next_free:
787
           test ebx, FREE_BLOCK
788
           jz .err
789
           and dword [pages_tab+edx*4], 0
790
           add eax, ebx
791
           and eax, not 4095
792
           or eax, FREE_BLOCK
793
           mov [pages_tab+esi*4], eax
794
           jmp @B
795
.exit:
796
           xor eax, eax
797
           inc eax
798
           ret
799
.err:
800
           xor eax, eax
801
           ret
802
endp
803
804
 
805
proc alloc_dll
806
           pushf
807
           cli
808
           bsf eax, [dll_map]
809
           jnz .find
810
           popf
811
           xor eax, eax
812
           ret
813
.find:
814
           btr [dll_map], eax
815
           popf
816
           shl eax, 5
817
           add eax, dll_tab
818
           ret
819
endp
820
821
 
822
proc alloc_service
823
           pushf
824
           cli
825
           bsf eax, [srv_map]
826
           jnz .find
827
           popf
828
           xor eax, eax
829
           ret
830
831
 
832
           popf
833
           shl eax,5
834
           add eax, srv_tab
835
           ret
836
endp
837