Subversion Repositories Kolibri OS

Rev

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

Rev 170 Rev 172
Line 630... Line 630...
630
           locals
630
           locals
631
             tab_count dd ?
631
             tab_count dd ?
632
           endl
632
           endl
633
 
633
 
Line -... Line 634...
-
 
634
           mov ebx,[CURRENT_TASK]
-
 
635
           shl ebx,8
-
 
636
           mov eax, [PROC_BASE+APPDATA.heap_top+ebx]
-
 
637
           test eax, eax
-
 
638
           jz @F
-
 
639
           sub eax,[PROC_BASE+APPDATA.heap_base+ebx]
-
 
640
           sub eax, 4096
-
 
641
           ret
-
 
642
@@:
634
           mov edx, [heap_size]
643
           mov edx, [heap_size]
635
           and edx, edx
644
           and edx, edx
636
           jz .exit
645
           jz .exit
637
           add edx, 4095
646
           add edx, (4095+4096)
638
           and edx, not 4095
647
           and edx, not 4095
639
           mov [heap_size], edx
648
           mov [heap_size], edx
640
           add edx, 0x003FFFFF
649
           add edx, 0x003FFFFF
641
           and edx, not 0x003FFFFF
650
           and edx, not 0x003FFFFF
642
           shr edx, 22
651
           shr edx, 22
643
           mov [tab_count], edx
652
           mov [tab_count], edx
Line 644... Line -...
644
 
-
 
645
           mov ebx,[CURRENT_TASK]
-
 
646
           shl ebx,8
653
 
647
           mov esi, [PROC_BASE+0x8c+ebx]
654
           mov esi, [PROC_BASE+APPDATA.mem_size+ebx]
648
           add esi, 0x003FFFFF
655
           add esi, 0x003FFFFF
649
           and esi, not 0x003FFFFF
656
           and esi, not 0x003FFFFF
650
           mov edi, esi
657
           mov edi, esi
651
           mov [PROC_BASE+0x18+ebx], esi
658
           mov [PROC_BASE+APPDATA.heap_base+ebx], esi
652
           add esi, [heap_size]
659
           add esi, [heap_size]
Line 653... Line 660...
653
           mov [PROC_BASE+0x1C+ebx], esi
660
           mov [PROC_BASE+APPDATA.heap_top+ebx], esi
654
 
661
 
655
           mov eax, cr3
662
           mov eax, cr3
Line 670... Line 677...
670
           mov ecx, [tab_count]
677
           mov ecx, [tab_count]
671
           shl ecx, 12-2
678
           shl ecx, 12-2
672
           mov ebx,[CURRENT_TASK]
679
           mov ebx,[CURRENT_TASK]
673
           shl ebx,8
680
           shl ebx,8
674
           mov edi, [PROC_BASE+0x18+ebx]
681
           mov edi, [PROC_BASE+APPDATA.heap_base+ebx]
675
           add edi, new_app_base
682
           add edi, new_app_base
676
           shr edi, 10
683
           shr edi, 10
677
           mov esi, edi
684
           mov esi, edi
678
           add edi, pages_tab
685
           add edi, pages_tab
679
           xor eax, eax
686
           xor eax, eax
Line 686... Line 693...
686
           mov eax, ebx
693
           mov eax, ebx
687
           sub eax, 4096
694
           sub eax, 4096
688
           or ebx, FREE_BLOCK
695
           or ebx, FREE_BLOCK
689
           mov [pages_tab+esi], ebx
696
           mov [pages_tab+esi], ebx
690
 
697
           ret
691
           ret
-
 
692
.exit:
698
.exit:
693
           xor eax, eax
699
           xor eax, eax
694
           ret
700
           ret
695
endp
701
endp
696
 
702
 
Line 702... Line 708...
702
           and ecx, not 4095
708
           and ecx, not 4095
703
 
709
 
Line 704... Line 710...
704
           mov ebx, [CURRENT_TASK]
710
           mov ebx, [CURRENT_TASK]
705
           shl ebx, 8
711
           shl ebx, 8
706
           mov esi, dword [ebx+PROC_BASE+0x18]; heap_base
712
           mov esi, dword [ebx+PROC_BASE+APPDATA.heap_base]; heap_base
707
           mov edi, dword [ebx+PROC_BASE+0x1C]; heap_top
713
           mov edi, dword [ebx+PROC_BASE+APPDATA.heap_top]; heap_top
708
           add esi, new_app_base
714
           add esi, new_app_base
709
           add edi, new_app_base
715
           add edi, new_app_base
Line 710... Line 716...
710
 
716
 
711
l_0:
717
l_0:
Line 786... Line 792...
786
           jnz .release
792
           jnz .release
787
@@:
793
@@:
788
           mov ebx, [CURRENT_TASK]
794
           mov ebx, [CURRENT_TASK]
789
           shl ebx, 8
795
           shl ebx, 8
790
           mov esi, dword [ebx+PROC_BASE+0x18]; heap_base
796
           mov esi, dword [ebx+PROC_BASE+APPDATA.heap_base]; heap_base
791
           mov edi, dword [ebx+PROC_BASE+0x1C]; heap_top
797
           mov edi, dword [ebx+PROC_BASE+APPDATA.heap_top]; heap_top
792
           shr esi, 12
798
           shr esi, 12
793
           shr edi, 12
799
           shr edi, 12
794
@@:
800
@@:
795
           mov eax, [pages_tab+esi*4]
801
           mov eax, [pages_tab+esi*4]
796
           test eax, USED_BLOCK
802
           test eax, USED_BLOCK
797
           jz .test_free
803
           jz .test_free
Line 832... Line 838...
832
           xor eax, eax
838
           xor eax, eax
833
           ret
839
           ret
834
endp
840
endp
835
 
841
 
Line 836... Line -...
836
 
-
 
837
;proc new_mem_resize stdcall, new_size:dword
-
 
838
;
-
 
839
;           stdcall wait_mutex, pg_data.pg_mutex
-
 
840
;
-
 
841
;           mov edi, [new_size]
-
 
842
;           add edi,4095
-
 
843
;           and edi,not 4095
-
 
844
;           mov [new_size], edi
-
 
845
 
-
 
846
;           mov    edx,[CURRENT_TASK]
-
 
847
;           shl    edx,8
-
 
848
;           mov    esi, [PROC_BASE+0x8c+edx]
-
 
849
;           add esi, 4095
-
 
850
;           and esi, not 4095
-
 
851
 
-
 
852
;           cmp edi, esi
-
 
853
;           jae .expand
-
 
854
 
-
 
855
;           shr edi, 12
-
 
856
;           shr esi, 12
-
 
857
;
-
 
858
;@@:        mov eax, [pages_tab+0x4000+edi*4]
-
 
859
;           test eax, 1
-
 
860
;           jz .next
-
 
861
;           mov dword [pages_tab+0x4000+edi*4], 2
-
 
862
;           mov ebx, edi
-
 
863
;           shl ebx, 12
-
 
864
;           invlpg [ebx+std_application_base_address]
-
 
865
;           call free_page
-
 
866
;
-
 
867
;.next:     add edi, 1
-
 
868
;           cmp edi, esi
-
 
869
;           jb @B
-
 
870
;
-
 
871
;.update_size:
-
 
872
 
-
 
873
;           mov ebx, [new_size]
-
 
874
;           mov    [PROC_BASE+0x8c+edx],ebx
-
 
875
;
-
 
876
;;search threads and update
-
 
877
;;application memory size infomation
-
 
878
;           mov    ecx,[PROC_BASE+0xb8+edx]
-
 
879
;           mov    eax,2
-
 
880
 
-
 
881
;.search_threads:
-
 
882
;;eax = current slot
-
 
883
;;ebx = new memory size
-
 
884
;;ecx = page directory
-
 
885
;           cmp    eax,[TASK_COUNT]
-
 
886
;           jg     .search_threads_end
-
 
887
;           mov    edx,eax
-
 
888
;           shl    edx,5
-
 
889
;           cmp    word [CURRENT_TASK+edx+0xa],9 ;if slot empty?
-
 
890
;           jz     .search_threads_next
-
 
891
;           shl    edx,3
-
 
892
;           cmp    [PROC_BASE+edx+0xb8],ecx     ;if it is our thread?
-
 
893
;           jnz    .search_threads_next
-
 
894
;           mov    [PROC_BASE+edx+0x8c],ebx     ;update memory size
-
 
895
;.search_threads_next:
-
 
896
;           inc    eax
-
 
897
;           jmp    .search_threads
-
 
898
;.search_threads_end:
-
 
899
;           xor eax, eax
-
 
900
;           dec [pg_data.pg_mutex]
-
 
901
;           ret
-
 
902
;
-
 
903
;
-
 
904
;.expand:
-
 
905
;           add edi, new_app_base
-
 
906
;           add esi, new_app_base
-
 
907
;
-
 
908
;.grow:     call alloc_page
-
 
909
;           test eax, eax
-
 
910
;           jz .exit
-
 
911
;           stdcall map_page,esi,eax,dword PG_UW
-
 
912
 
-
 
913
;           push edi
-
 
914
;           mov edi, esi
-
 
915
;           xor eax, eax
-
 
916
;           mov ecx, 1024
-
 
917
;           cld
-
 
918
;           rep stosd
-
 
919
;           pop edi
-
 
920
 
-
 
921
;           add esi, 0x1000
-
 
922
;           cmp esi, edi
-
 
923
;           jna .grow
-
 
924
;           jmp .update_size
-
 
925
;.exit:
-
 
926
;           xor eax, eax
-
 
927
;           inc eax
-
 
928
;           dec [pg_data.pg_mutex]
-
 
929
;           ret
-
 
930
;endp
-
 
931
 
-
 
932
 
-
 
933
align 4
842
align 4
934
proc alloc_dll
843
proc alloc_dll
935
           pushf
844
           pushf
936
           cli
845
           cli
937
           bsf eax, [dll_map]
846
           bsf eax, [dll_map]
Line 962... Line 871...
962
           shl eax,5
871
           shl eax,5
963
           add eax, srv_tab
872
           add eax, srv_tab
964
           ret
873
           ret
965
endp
874
endp
966
 
875
967
if NEW
-
 
968
 
-
 
969
align 16
-
 
970
new_services:
-
 
971
         cmp eax, 10
-
 
972
         jb .fail
-
 
973
         ja @f
-
 
974
 
-
 
975
         push dword [ebp+8+new_app_base]
-
 
976
         call get_mem_info
-
 
977
         mov [esp+36], eax
-
 
978
         ret
-
 
979
@@:
-
 
980
         cmp eax, 11
-
 
981
         ja @f
-
 
982
 
-
 
983
         push dword [ebp+8+new_app_base]
-
 
984
         call init_heap
-
 
985
         mov [esp+36], eax
-
 
986
         ret
-
 
987
@@:
-
 
988
         cmp eax, 12
-
 
989
         ja @f
-
 
990
 
-
 
991
         push dword [ebp+8+new_app_base]
-
 
992
         call user_alloc
-
 
993
         mov [esp+36], eax
-
 
994
         ret
-
 
995
@@:
-
 
996
         cmp eax, 13
-
 
997
         ja @f
-
 
998
 
-
 
999
         push dword [ebp+8+new_app_base]
-
 
1000
         call user_free
-
 
1001
         mov [esp+36], eax
-
 
1002
         ret
-
 
1003
 
-
 
1004
@@:
-
 
1005
         cmp eax, 14
-
 
1006
         ja @f
-
 
1007
         mov eax, [ebp+8+new_app_base]
-
 
1008
         add eax,new_app_base
-
 
1009
         stdcall get_notify, eax
-
 
1010
         ret
-
 
1011
;@@:
-
 
1012
;         cmp eax, 15
-
 
1013
;         ja @f
-
 
1014
;         call set_notify
-
 
1015
;         ret
-
 
1016
@@:
-
 
1017
         cmp eax, 16
-
 
1018
         ja @f
-
 
1019
 
-
 
1020
         mov eax, [ebp+8+new_app_base]
-
 
1021
         add eax, new_app_base
-
 
1022
         stdcall get_service, eax
-
 
1023
         mov [esp+36], eax
-
 
1024
         ret
-
 
1025
@@:
-
 
1026
         cmp eax, 17
-
 
1027
         ja @f
-
 
1028
         stdcall srv_handler,[ebp+8+new_app_base],\
-
 
1029
                          [ebp+12+new_app_base],\
-
 
1030
                          [ebp+16+new_app_base]
-
 
1031
         mov [esp+36], eax
-
 
1032
         ret
-
 
1033
;@@:
-
 
1034
;         cmp eax, 20
-
 
1035
;         ja @f
-
 
1036
;         call CreateSound
-
 
1037
;         mov [esp+36], eax
-
 
1038
;         ret
-
 
1039
 
-
 
1040
@@:
-
 
1041
.fail:
-
 
1042
         xor eax, eax
-
 
1043
         mov [esp+36], eax
-
 
1044
         ret
-
 
1045
 
-
 
1046
proc strncmp stdcall, str1:dword, str2:dword, count:dword
-
 
1047
 
-
 
1048
        mov ecx,[count]
-
 
1049
        jecxz .end
-
 
1050
 
-
 
1051
        mov ebx,ecx
-
 
1052
 
-
 
1053
        mov edi,[str1]
-
 
1054
        mov esi,edi
-
 
1055
        xor eax,eax
-
 
1056
        repne scasb
-
 
1057
        neg ecx             ; cx = count - strlen
-
 
1058
        add ecx,ebx         ; strlen + count - strlen
-
 
1059
 
-
 
1060
.okay:
-
 
1061
        mov edi,esi
-
 
1062
        mov esi,[str2]
-
 
1063
        repe cmpsb
-
 
1064
        mov al,[esi-1]
-
 
1065
        xor ecx,ecx
-
 
1066
 
-
 
1067
        cmp al,[edi-1]
-
 
1068
        ja .str2_big
-
 
1069
        je .end
-
 
1070
 
-
 
1071
.str1_big:
-
 
1072
        sub ecx,2
-
 
1073
 
-
 
1074
.str2_big:
-
 
1075
        not ecx
-
 
1076
.end:
-
 
1077
        mov eax,ecx
-
 
1078
        ret
-
 
1079
endp
-
 
1080
 
-
 
1081
 
-
 
1082
proc get_proc stdcall, exp:dword, sz_name:dword
-
 
1083
 
-
 
1084
           mov edx, [exp]
-
 
1085
.next:
-
 
1086
           mov eax, [edx]
-
 
1087
           test eax, eax
-
 
1088
           jz .end
-
 
1089
 
-
 
1090
           push edx
-
 
1091
           stdcall strncmp, eax, [sz_name], 16
-
 
1092
           pop edx
-
 
1093
           test eax, eax
-
 
1094
           jz .ok
-
 
1095
 
-
 
1096
           add edx,8
-
 
1097
           jmp .next
-
 
1098
.ok:
-
 
1099
           mov eax, [edx+4]
-
 
1100
.end:
-
 
1101
           ret
-
 
1102
endp
-
 
1103
 
-
 
1104
proc link_dll stdcall, exp:dword, imp:dword
-
 
1105
         mov esi, [imp]
-
 
1106
 
-
 
1107
.next:
-
 
1108
         mov eax, [esi]
-
 
1109
         test eax, eax
-
 
1110
         jz .end
-
 
1111
 
-
 
1112
         push esi
-
 
1113
         stdcall get_proc, [exp], eax
-
 
1114
         pop esi
-
 
1115
 
-
 
1116
         test eax, eax
-
 
1117
         jz @F
-
 
1118
 
-
 
1119
         mov [esi], eax
-
 
1120
@@:
-
 
1121
         add esi, 4
-
 
1122
         jmp .next
-
 
1123
.end:
-
 
1124
         ret
-
 
1125
endp
-
 
1126
 
-
 
1127
end if
-
 
1128
-
 
1129
-
 
1130
-
 
1131
-