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 |