Subversion Repositories Kolibri OS

Rev

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

Rev 2385 Rev 2540
Line 1... Line 1...
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
$Revision: 2385 $
8
$Revision $
9
 
9
 
10
 
10
 
Line 576... Line 576...
576
restore block_size
576
restore block_size
577
restore block_flags
577
restore block_flags
Line 578... Line 578...
578
 
578
 
Line 579... Line 579...
579
;;;;;;;;;;;;;;      USER     ;;;;;;;;;;;;;;;;;
579
;;;;;;;;;;;;;;      USER     ;;;;;;;;;;;;;;;;;
Line 580... Line 580...
580
 
580
 
581
HEAP_TOP  equ 0x5FC00000
581
HEAP_TOP  equ 0x80000000
Line 582... Line 582...
582
 
582
 
Line 846... Line 846...
846
        pop     ebx
846
        pop     ebx
847
        pop     esi
847
        pop     esi
848
        ret
848
        ret
849
endp
849
endp
Line -... Line 850...
-
 
850
 
-
 
851
 
-
 
852
align 4
-
 
853
proc user_unmap stdcall, base:dword, offset:dword, size:dword
-
 
854
 
-
 
855
        push    ebx
-
 
856
 
-
 
857
        mov     ebx, [base]             ; must be valid pointer
-
 
858
        test    ebx, ebx
-
 
859
        jz      .error
-
 
860
 
-
 
861
        mov     edx, [offset]           ; check offset
-
 
862
        add     edx, ebx                ; must be below 2Gb app limit
-
 
863
        js      .error
-
 
864
 
-
 
865
        shr     ebx, 12                 ; chek block attributes
-
 
866
        lea     ebx, [page_tabs+ebx*4]
-
 
867
        mov     eax, [ebx-4]            ; block attributes
-
 
868
        test    al, USED_BLOCK
-
 
869
        jz      .error
-
 
870
        test    al, DONT_FREE_BLOCK
-
 
871
        jnz     .error
-
 
872
 
-
 
873
        shr     edx, 12
-
 
874
        lea     edx, [page_tabs+edx*4]  ; unmap offset
-
 
875
 
-
 
876
        mov     ecx, [size]
-
 
877
        add     ecx, 4095
-
 
878
        shr     ecx, 12                 ; unmap size in pages
-
 
879
 
-
 
880
        shr     eax, 12                 ; block size + 1 page
-
 
881
        lea     ebx, [ebx+eax*4-4]      ; block end ptr
-
 
882
        lea     eax, [edx+ecx*4]        ; unmap end ptr
-
 
883
 
-
 
884
        cmp     eax, ebx                ; check for overflow
-
 
885
        ja      .error
-
 
886
 
-
 
887
        mov     ebx, [offset]
-
 
888
        and     ebx, not 4095           ; is it required ?
-
 
889
 
-
 
890
.unmap:
-
 
891
        mov     eax, [edx]              ; get page addres
-
 
892
        test    al, 1                   ; page mapped ?
-
 
893
        jz      @F
-
 
894
        test    eax, PG_SHARED          ; page shared ?
-
 
895
        jnz     @F
-
 
896
        mov     [page_tabs+edx*4], dword 2
-
 
897
                                        ; mark page as reserved
-
 
898
        invlpg  [ebx]                   ; when we start using
-
 
899
        call    free_page               ; empty c-o-w page instead this ?
-
 
900
@@:
-
 
901
        add     ebx, 4096
-
 
902
        add     edx, 4
-
 
903
        dec     ecx
-
 
904
        jnz     .unmap
-
 
905
 
-
 
906
        pop     ebx
-
 
907
        or      al, 1                   ; return non zero on success
-
 
908
        ret
-
 
909
.error:
-
 
910
        pop     ebx
-
 
911
        xor     eax, eax                ; something wrong
-
 
912
        ret
-
 
913
endp
-
 
914
 
850
 
915
align 4
851
user_normalize:
916
user_normalize:
852
; in: esi=heap_base, edi=heap_top
917
; in: esi=heap_base, edi=heap_top
853
; out: eax=0 <=> OK
918
; out: eax=0 <=> OK
854
; destroys: ebx,edx,esi,edi
919
; destroys: ebx,edx,esi,edi