Subversion Repositories Kolibri OS

Rev

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

Rev 2384 Rev 2400
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2009. 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: 2384 $
8
$Revision: 2400 $
9
 
9
 
10
 
10
 
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