Subversion Repositories Kolibri OS

Rev

Rev 172 | Rev 192 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 172 Rev 188
Line 99... Line 99...
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
 
-
 
104
.l1:
103
.l1:
105
           stdcall map_page,edi,edx,PG_SW
104
           stdcall map_page,edi,edx,PG_SW
106
           add edi, 0x1000
105
           add edi, 0x1000
107
           add edx, 0x1000
106
           add edx, 0x1000
108
           dec ecx
107
           dec ecx
Line 624... Line 623...
624
restore block_flags
623
restore block_flags
625
 
624
 
Line 626... Line 625...
626
;;;;;;;;;;;;;;      USER     ;;;;;;;;;;;;;;;;;
625
;;;;;;;;;;;;;;      USER     ;;;;;;;;;;;;;;;;;
Line -... Line 626...
-
 
626
 
-
 
627
HEAP_TOP  equ 0x5FC00000
627
 
628
 
628
align 4
-
 
629
proc init_heap stdcall, heap_size:dword
-
 
630
           locals
-
 
631
             tab_count dd ?
629
align 4
Line 632... Line 630...
632
           endl
630
proc init_heap
633
 
631
 
634
           mov ebx,[CURRENT_TASK]
632
           mov ebx,[CURRENT_TASK]
635
           shl ebx,8
633
           shl ebx,8
636
           mov eax, [PROC_BASE+APPDATA.heap_top+ebx]
634
           mov eax, [PROC_BASE+APPDATA.heap_top+ebx]
637
           test eax, eax
635
           test eax, eax
638
           jz @F
636
           jz @F
639
           sub eax,[PROC_BASE+APPDATA.heap_base+ebx]
637
           sub eax,[PROC_BASE+APPDATA.heap_base+ebx]
640
           sub eax, 4096
638
           sub eax, 4096
641
           ret
-
 
642
@@:
-
 
643
           mov edx, [heap_size]
-
 
644
           and edx, edx
-
 
645
           jz .exit
-
 
646
           add edx, (4095+4096)
-
 
647
           and edx, not 4095
-
 
648
           mov [heap_size], edx
-
 
649
           add edx, 0x003FFFFF
-
 
650
           and edx, not 0x003FFFFF
-
 
651
           shr edx, 22
-
 
652
           mov [tab_count], edx
639
           ret
653
 
640
@@:
654
           mov esi, [PROC_BASE+APPDATA.mem_size+ebx]
641
           mov esi, [PROC_BASE+APPDATA.mem_size+ebx]
655
           add esi, 0x003FFFFF
642
           add esi, 4095
656
           and esi, not 0x003FFFFF
643
           and esi, not 4095
657
           mov edi, esi
-
 
658
           mov [PROC_BASE+APPDATA.heap_base+ebx], esi
644
           mov eax, HEAP_TOP
659
           add esi, [heap_size]
-
 
660
           mov [PROC_BASE+APPDATA.heap_top+ebx], esi
-
 
661
 
-
 
662
           mov eax, cr3
-
 
663
           and eax, not 0xFFF
-
 
664
           stdcall map_page,[current_pdir],eax,dword PG_SW
-
 
665
 
-
 
666
           add edi, new_app_base
-
 
667
@@:
-
 
668
           call alloc_page
-
 
669
           test eax, eax
-
 
670
           jz .exit
-
 
671
 
-
 
672
           stdcall map_page_table, [current_pdir], edi, eax
-
 
673
           add edi, 0x00400000
-
 
674
           dec edx
-
 
675
           jnz @B
-
 
676
 
-
 
677
           mov ecx, [tab_count]
-
 
678
           shl ecx, 12-2
-
 
679
           mov ebx,[CURRENT_TASK]
-
 
680
           shl ebx,8
-
 
681
           mov edi, [PROC_BASE+APPDATA.heap_base+ebx]
-
 
682
           add edi, new_app_base
-
 
683
           shr edi, 10
-
 
684
           mov esi, edi
-
 
685
           add edi, pages_tab
-
 
686
           xor eax, eax
-
 
Line 687... Line 645...
687
           cld
645
           mov [PROC_BASE+APPDATA.heap_base+ebx], esi
688
           rep stosd
-
 
689
 
646
           mov [PROC_BASE+APPDATA.heap_top+ebx], eax
-
 
647
 
690
           stdcall map_page,[current_pdir],dword PG_UNMAP
648
           sub eax, esi
691
 
649
           add esi, new_app_base
692
           mov ebx, [heap_size]
650
           shr esi, 10
693
           mov eax, ebx
651
           mov ecx, eax
694
           sub eax, 4096
652
           sub eax, 4096
695
           or ebx, FREE_BLOCK
653
           or ecx, FREE_BLOCK
696
           mov [pages_tab+esi], ebx
654
           mov [pages_tab+esi], ecx
697
           ret
655
           ret
698
.exit:
656
.exit:
Line 774... Line 732...
774
           sub esi, 4096
732
           sub esi, 4096
775
           shr esi, 12
733
           shr esi, 12
776
           mov eax, [pages_tab+esi*4]
734
           mov eax, [pages_tab+esi*4]
777
           test eax, USED_BLOCK
735
           test eax, USED_BLOCK
778
           jz @f
736
           jz .not_used
Line 779... Line 737...
779
 
737
 
780
           and eax, not 4095
738
           and eax, not 4095
781
           mov ecx, eax
739
           mov ecx, eax
782
           or eax, FREE_BLOCK
740
           or eax, FREE_BLOCK
783
           mov [pages_tab+esi*4], eax
741
           mov [pages_tab+esi*4], eax
784
           inc esi
742
           inc esi
785
           sub ecx, 4096
743
           sub ecx, 4096
786
           shr ecx, 12
744
           shr ecx, 12
-
 
745
.release:
787
.release:
746
           xor eax, eax
-
 
747
           xchg eax, [pages_tab+esi*4]
-
 
748
           test eax, 1
788
           mov eax, [pages_tab+esi*4]
749
           jz @F
-
 
750
           call free_page
789
           call free_page
751
@@:
790
           inc esi
752
           inc esi
791
           dec ecx
753
           dec ecx
792
           jnz .release
754
           jnz .release
793
@@:
755
.not_used:
794
           mov ebx, [CURRENT_TASK]
756
           mov ebx, [CURRENT_TASK]
795
           shl ebx, 8
757
           shl ebx, 8
796
           mov esi, dword [ebx+PROC_BASE+APPDATA.heap_base]; heap_base
758
           mov esi, dword [ebx+PROC_BASE+APPDATA.heap_base]; heap_base
797
           mov edi, dword [ebx+PROC_BASE+APPDATA.heap_top]; heap_top
759
           mov edi, dword [ebx+PROC_BASE+APPDATA.heap_top]; heap_top