forked from KolibriOS/kolibrios
Improved readability, no semantic changes.
git-svn-id: svn://kolibrios.org@7965 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
709f961e4c
commit
9ab5b699d5
@ -1,6 +1,6 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2020. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License. ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
@ -1228,7 +1228,7 @@ proc load_library stdcall, file_name:dword, encoding:dword
|
||||
mov [eax+HDLL.parent], esi
|
||||
mov edx, ebx
|
||||
shr edx, 12
|
||||
or dword [page_tabs+(edx-1)*4], DONT_FREE_BLOCK
|
||||
or dword [page_tabs+(edx-1)*4], MEM_BLOCK_DONT_FREE
|
||||
; copy entries of page table from kernel-side image to usermode
|
||||
; use copy-on-write for user-mode image, so map as readonly
|
||||
xor edi, edi
|
||||
|
@ -1,6 +1,6 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2020. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
@ -18,18 +18,10 @@ struct MEM_BLOCK
|
||||
handle dd ? ;+28
|
||||
ends
|
||||
|
||||
FREE_BLOCK = 4
|
||||
USED_BLOCK = 8
|
||||
DONT_FREE_BLOCK = 10h
|
||||
|
||||
|
||||
block_next equ MEM_BLOCK.next_block
|
||||
block_prev equ MEM_BLOCK.prev_block
|
||||
list_fd equ MEM_BLOCK.list.next
|
||||
list_bk equ MEM_BLOCK.list.prev
|
||||
block_base equ MEM_BLOCK.base
|
||||
block_size equ MEM_BLOCK.size
|
||||
block_flags equ MEM_BLOCK.flags
|
||||
MEM_BLOCK_RESERVED = 0x02 ; Will be allocated on first access (lazy allocation)
|
||||
MEM_BLOCK_FREE = 0x04
|
||||
MEM_BLOCK_USED = 0x08
|
||||
MEM_BLOCK_DONT_FREE = 0x10
|
||||
|
||||
macro calc_index op
|
||||
{ shr op, 12
|
||||
@ -43,8 +35,8 @@ macro calc_index op
|
||||
align 4
|
||||
md:
|
||||
.add_to_used:
|
||||
mov eax, [esi+block_base]
|
||||
mov ebx, [esi+block_base]
|
||||
mov eax, [esi + MEM_BLOCK.base]
|
||||
mov ebx, [esi + MEM_BLOCK.base]
|
||||
shr ebx, 6
|
||||
add eax, ebx
|
||||
shr ebx, 6
|
||||
@ -55,8 +47,8 @@ md:
|
||||
|
||||
lea ecx, [mem_used_list + eax*8]
|
||||
list_add esi, ecx
|
||||
mov [esi+block_flags], USED_BLOCK
|
||||
mov eax, [esi+block_size]
|
||||
mov [esi + MEM_BLOCK.flags], MEM_BLOCK_USED
|
||||
mov eax, [esi + MEM_BLOCK.size]
|
||||
sub [heap_free], eax
|
||||
ret
|
||||
align 4
|
||||
@ -73,11 +65,11 @@ align 4
|
||||
lea ebx, [mem_used_list + ecx*8]
|
||||
mov esi, ebx
|
||||
.next:
|
||||
mov esi, [esi+list_fd]
|
||||
mov esi, [esi + MEM_BLOCK.list.next]
|
||||
cmp esi, ebx
|
||||
je .fail
|
||||
|
||||
cmp eax, [esi+block_base]
|
||||
cmp eax, [esi + MEM_BLOCK.base]
|
||||
jne .next
|
||||
|
||||
ret
|
||||
@ -91,7 +83,7 @@ align 4
|
||||
test esi, esi
|
||||
jz .done
|
||||
|
||||
cmp [esi+block_flags], USED_BLOCK
|
||||
cmp [esi + MEM_BLOCK.flags], MEM_BLOCK_USED
|
||||
jne .fatal
|
||||
|
||||
dec [mem_hash_cnt + ecx*4]
|
||||
@ -104,9 +96,9 @@ align 4
|
||||
|
||||
;Initial heap state
|
||||
;
|
||||
;+heap_size terminator USED_BLOCK
|
||||
;+4096*MEM_BLOCK.sizeof free space FREE_BLOCK
|
||||
;HEAP_BASE heap_descriptors USED_BLOCK
|
||||
; + heap_size terminator MEM_BLOCK_USED
|
||||
; + 4096*MEM_BLOCK.sizeof free space MEM_BLOCK_FREE
|
||||
;HEAP_BASE heap_descriptors MEM_BLOCK_USED
|
||||
;
|
||||
|
||||
align 4
|
||||
@ -140,33 +132,33 @@ proc init_kernel_heap
|
||||
mov ecx, HEAP_BASE + sizeof.MEM_BLOCK*2 ;terminator
|
||||
|
||||
xor eax, eax
|
||||
mov [edi+block_next], ebx
|
||||
mov [edi+block_prev], eax
|
||||
mov [edi+list_fd], eax
|
||||
mov [edi+list_bk], eax
|
||||
mov [edi+block_base], HEAP_BASE
|
||||
mov [edi+block_size], 4096*sizeof.MEM_BLOCK
|
||||
mov [edi+block_flags], USED_BLOCK
|
||||
mov [edi + MEM_BLOCK.next_block], ebx
|
||||
mov [edi + MEM_BLOCK.prev_block], eax
|
||||
mov [edi + MEM_BLOCK.list.next], eax
|
||||
mov [edi + MEM_BLOCK.list.prev], eax
|
||||
mov [edi + MEM_BLOCK.base], HEAP_BASE
|
||||
mov [edi + MEM_BLOCK.size], 4096*sizeof.MEM_BLOCK
|
||||
mov [edi + MEM_BLOCK.flags], MEM_BLOCK_USED
|
||||
|
||||
mov [ecx+block_next], eax
|
||||
mov [ecx+block_prev], ebx
|
||||
mov [ecx+list_fd], eax
|
||||
mov [ecx+list_bk], eax
|
||||
mov [ecx+block_base], eax
|
||||
mov [ecx+block_size], eax
|
||||
mov [ecx+block_flags], USED_BLOCK
|
||||
mov [ecx + MEM_BLOCK.next_block], eax
|
||||
mov [ecx + MEM_BLOCK.prev_block], ebx
|
||||
mov [ecx + MEM_BLOCK.list.next], eax
|
||||
mov [ecx + MEM_BLOCK.list.prev], eax
|
||||
mov [ecx + MEM_BLOCK.base], eax
|
||||
mov [ecx + MEM_BLOCK.size], eax
|
||||
mov [ecx + MEM_BLOCK.flags], MEM_BLOCK_USED
|
||||
|
||||
mov [ebx+block_next], ecx
|
||||
mov [ebx+block_prev], edi
|
||||
mov [ebx+block_base], HEAP_BASE+4096*sizeof.MEM_BLOCK
|
||||
mov [ebx + MEM_BLOCK.next_block], ecx
|
||||
mov [ebx + MEM_BLOCK.prev_block], edi
|
||||
mov [ebx + MEM_BLOCK.base], HEAP_BASE + 4096*sizeof.MEM_BLOCK
|
||||
|
||||
mov ecx, [pg_data.kernel_pages]
|
||||
shl ecx, 12
|
||||
sub ecx, HEAP_BASE-OS_BASE + 4096*sizeof.MEM_BLOCK
|
||||
mov [heap_size], ecx
|
||||
mov [heap_free], ecx
|
||||
mov [ebx+block_size], ecx
|
||||
mov [ebx+block_flags], FREE_BLOCK
|
||||
mov [ebx + MEM_BLOCK.size], ecx
|
||||
mov [ebx + MEM_BLOCK.flags], MEM_BLOCK_FREE
|
||||
|
||||
mov [mem_block_mask], eax
|
||||
mov [mem_block_mask + 4], 0x80000000
|
||||
@ -183,7 +175,7 @@ proc init_kernel_heap
|
||||
add eax, sizeof.MEM_BLOCK
|
||||
loop @B
|
||||
|
||||
mov [eax-sizeof.MEM_BLOCK], dword 0
|
||||
mov dword[eax-sizeof.MEM_BLOCK], 0
|
||||
|
||||
mov ecx, heap_mutex
|
||||
call mutex_init
|
||||
@ -228,10 +220,10 @@ get_small_block:
|
||||
lea ecx, [mem_block_list + ebx*8]
|
||||
mov edi, ecx
|
||||
.next:
|
||||
mov edi, [edi+list_fd]
|
||||
mov edi, [edi + MEM_BLOCK.list.next]
|
||||
cmp edi, ecx
|
||||
je .err
|
||||
cmp eax, [edi+block_size]
|
||||
cmp eax, [edi + MEM_BLOCK.size]
|
||||
ja .next
|
||||
ret
|
||||
.err:
|
||||
@ -249,11 +241,12 @@ get_small_block:
|
||||
|
||||
align 4
|
||||
free_mem_block:
|
||||
|
||||
mov ebx, [next_memblock]
|
||||
mov [eax], ebx
|
||||
mov [next_memblock], eax
|
||||
xor ebx, ebx
|
||||
|
||||
xor ebx, ebx
|
||||
mov dword[eax + 4], ebx
|
||||
mov dword[eax + 8], ebx
|
||||
mov dword[eax + 12], ebx
|
||||
@ -261,7 +254,9 @@ free_mem_block:
|
||||
; mov dword[eax + 20], 0 ;don't clear block size
|
||||
mov dword[eax + 24], ebx
|
||||
mov dword[eax + 28], ebx
|
||||
|
||||
inc [free_blocks]
|
||||
|
||||
ret
|
||||
|
||||
align 4
|
||||
@ -288,12 +283,12 @@ proc alloc_kernel_space stdcall, size:dword
|
||||
test edi, edi
|
||||
jz .error_unlock
|
||||
|
||||
cmp [edi+block_flags], FREE_BLOCK
|
||||
cmp [edi + MEM_BLOCK.flags], MEM_BLOCK_FREE
|
||||
jne .error_unlock
|
||||
|
||||
mov [block_ind], ebx ;index of allocated block
|
||||
|
||||
mov eax, [edi+block_size]
|
||||
mov eax, [edi + MEM_BLOCK.size]
|
||||
cmp eax, [size]
|
||||
je .m_eq_size
|
||||
|
||||
@ -305,22 +300,22 @@ proc alloc_kernel_space stdcall, size:dword
|
||||
mov eax, [esi]
|
||||
mov [next_memblock], eax
|
||||
|
||||
mov [esi+block_next], edi
|
||||
mov eax, [edi+block_prev]
|
||||
mov [esi+block_prev], eax
|
||||
mov [edi+block_prev], esi
|
||||
mov [esi+list_fd], 0
|
||||
mov [esi+list_bk], 0
|
||||
mov [eax+block_next], esi
|
||||
mov [esi + MEM_BLOCK.next_block], edi
|
||||
mov eax, [edi + MEM_BLOCK.prev_block]
|
||||
mov [esi + MEM_BLOCK.prev_block], eax
|
||||
mov [edi + MEM_BLOCK.prev_block], esi
|
||||
mov [esi + MEM_BLOCK.list.next], 0
|
||||
mov [esi + MEM_BLOCK.list.prev], 0
|
||||
mov [eax + MEM_BLOCK.next_block], esi
|
||||
|
||||
mov ebx, [edi+block_base]
|
||||
mov [esi+block_base], ebx
|
||||
mov ebx, [edi + MEM_BLOCK.base]
|
||||
mov [esi + MEM_BLOCK.base], ebx
|
||||
mov edx, [size]
|
||||
mov [esi+block_size], edx
|
||||
add [edi+block_base], edx
|
||||
sub [edi+block_size], edx
|
||||
mov [esi + MEM_BLOCK.size], edx
|
||||
add [edi + MEM_BLOCK.base], edx
|
||||
sub [edi + MEM_BLOCK.size], edx
|
||||
|
||||
mov eax, [edi+block_size]
|
||||
mov eax, [edi + MEM_BLOCK.size]
|
||||
calc_index eax
|
||||
cmp eax, [block_ind]
|
||||
je .add_used
|
||||
@ -341,7 +336,7 @@ proc alloc_kernel_space stdcall, size:dword
|
||||
call md.add_to_used
|
||||
|
||||
spin_unlock_irqrestore heap_mutex
|
||||
mov eax, [esi+block_base]
|
||||
mov eax, [esi + MEM_BLOCK.base]
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebx
|
||||
@ -378,20 +373,20 @@ proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword
|
||||
test esi, esi
|
||||
jz .fail
|
||||
|
||||
mov eax, [esi+block_size]
|
||||
mov eax, [esi + MEM_BLOCK.size]
|
||||
add [heap_free], eax
|
||||
|
||||
mov edi, [esi+block_next]
|
||||
cmp [edi+block_flags], FREE_BLOCK
|
||||
mov edi, [esi + MEM_BLOCK.next_block]
|
||||
cmp [edi + MEM_BLOCK.flags], MEM_BLOCK_FREE
|
||||
jne .prev
|
||||
|
||||
list_del edi
|
||||
|
||||
mov edx, [edi+block_next]
|
||||
mov [esi+block_next], edx
|
||||
mov [edx+block_prev], esi
|
||||
mov ecx, [edi+block_size]
|
||||
add [esi+block_size], ecx
|
||||
mov edx, [edi + MEM_BLOCK.next_block]
|
||||
mov [esi + MEM_BLOCK.next_block], edx
|
||||
mov [edx + MEM_BLOCK.prev_block], esi
|
||||
mov ecx, [edi + MEM_BLOCK.size]
|
||||
add [esi + MEM_BLOCK.size], ecx
|
||||
|
||||
calc_index ecx
|
||||
|
||||
@ -403,21 +398,21 @@ proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword
|
||||
mov eax, edi
|
||||
call free_mem_block
|
||||
.prev:
|
||||
mov edi, [esi+block_prev]
|
||||
cmp [edi+block_flags], FREE_BLOCK
|
||||
mov edi, [esi + MEM_BLOCK.prev_block]
|
||||
cmp [edi + MEM_BLOCK.flags], MEM_BLOCK_FREE
|
||||
jne .insert
|
||||
|
||||
mov edx, [esi+block_next]
|
||||
mov [edi+block_next], edx
|
||||
mov [edx+block_prev], edi
|
||||
mov edx, [esi + MEM_BLOCK.next_block]
|
||||
mov [edi + MEM_BLOCK.next_block], edx
|
||||
mov [edx + MEM_BLOCK.prev_block], edi
|
||||
|
||||
mov eax, esi
|
||||
call free_mem_block
|
||||
|
||||
mov ecx, [edi+block_size]
|
||||
mov eax, [esi+block_size]
|
||||
mov ecx, [edi + MEM_BLOCK.size]
|
||||
mov eax, [esi + MEM_BLOCK.size]
|
||||
add eax, ecx
|
||||
mov [edi+block_size], eax
|
||||
mov [edi + MEM_BLOCK.size], eax
|
||||
|
||||
calc_index eax ;new index
|
||||
calc_index ecx ;old index
|
||||
@ -443,8 +438,8 @@ proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword
|
||||
not eax
|
||||
ret
|
||||
.insert:
|
||||
mov [esi+block_flags], FREE_BLOCK
|
||||
mov eax, [esi+block_size]
|
||||
mov [esi + MEM_BLOCK.flags], MEM_BLOCK_FREE
|
||||
mov eax, [esi + MEM_BLOCK.size]
|
||||
calc_index eax
|
||||
mov edi, esi
|
||||
jmp .add_block
|
||||
@ -532,13 +527,13 @@ proc kernel_free stdcall, base:dword
|
||||
mov eax, [base]
|
||||
call md.find_used
|
||||
|
||||
cmp [esi+block_flags], USED_BLOCK
|
||||
cmp [esi + MEM_BLOCK.flags], MEM_BLOCK_USED
|
||||
jne .fail
|
||||
|
||||
spin_unlock_irqrestore heap_mutex
|
||||
|
||||
mov eax, [esi+block_base]
|
||||
mov ecx, [esi+block_size]
|
||||
mov eax, [esi + MEM_BLOCK.base]
|
||||
mov ecx, [esi + MEM_BLOCK.size]
|
||||
shr ecx, 12
|
||||
call release_pages ;eax, ecx
|
||||
stdcall free_kernel_space, [base]
|
||||
@ -551,13 +546,6 @@ proc kernel_free stdcall, base:dword
|
||||
ret
|
||||
endp
|
||||
|
||||
restore block_next
|
||||
restore block_prev
|
||||
restore block_list
|
||||
restore block_base
|
||||
restore block_size
|
||||
restore block_flags
|
||||
|
||||
;;;;;;;;;;;;;; USER HEAP ;;;;;;;;;;;;;;;;;
|
||||
|
||||
HEAP_TOP = 0x80000000
|
||||
@ -588,22 +576,25 @@ proc init_heap
|
||||
shr esi, 10
|
||||
mov ecx, eax
|
||||
sub eax, PAGE_SIZE
|
||||
or ecx, FREE_BLOCK
|
||||
or ecx, MEM_BLOCK_FREE
|
||||
mov [page_tabs + esi], ecx
|
||||
ret
|
||||
endp
|
||||
|
||||
align 4
|
||||
proc user_alloc stdcall, alloc_size:dword
|
||||
|
||||
push ebx esi edi
|
||||
|
||||
mov ebx, [current_process]
|
||||
lea ecx, [ebx + PROC.heap_lock]
|
||||
call mutex_lock
|
||||
|
||||
mov ecx, [alloc_size]
|
||||
add ecx, (4095 + PAGE_SIZE)
|
||||
and ecx, not 4095
|
||||
mov esi, dword [ebx+PROC.heap_base] ; heap_base
|
||||
mov edi, dword [ebx+PROC.heap_top] ; heap_top
|
||||
mov esi, [ebx + PROC.heap_base]
|
||||
mov edi, [ebx + PROC.heap_top]
|
||||
.scan:
|
||||
cmp esi, edi
|
||||
jae .m_exit
|
||||
@ -611,7 +602,7 @@ proc user_alloc stdcall, alloc_size:dword
|
||||
mov ebx, esi
|
||||
shr ebx, 12
|
||||
mov eax, [page_tabs + ebx*4]
|
||||
test al, FREE_BLOCK
|
||||
test al, MEM_BLOCK_FREE
|
||||
jz .test_used
|
||||
and eax, 0xFFFFF000
|
||||
cmp eax, ecx ;alloc_size
|
||||
@ -620,18 +611,18 @@ proc user_alloc stdcall, alloc_size:dword
|
||||
|
||||
lea edx, [esi + ecx]
|
||||
sub eax, ecx
|
||||
or al, FREE_BLOCK
|
||||
or al, MEM_BLOCK_FREE
|
||||
shr edx, 12
|
||||
mov [page_tabs + edx*4], eax
|
||||
@@:
|
||||
or ecx, USED_BLOCK
|
||||
or ecx, MEM_BLOCK_USED
|
||||
mov [page_tabs + ebx*4], ecx
|
||||
shr ecx, 12
|
||||
inc ebx
|
||||
dec ecx
|
||||
jz .no
|
||||
@@:
|
||||
mov dword [page_tabs+ebx*4], 2
|
||||
mov dword [page_tabs + ebx*4], MEM_BLOCK_RESERVED
|
||||
inc ebx
|
||||
dec ecx
|
||||
jnz @B
|
||||
@ -653,10 +644,10 @@ proc user_alloc stdcall, alloc_size:dword
|
||||
pop ebx
|
||||
ret
|
||||
.test_used:
|
||||
test al, USED_BLOCK
|
||||
test al, MEM_BLOCK_USED
|
||||
jz .m_exit
|
||||
|
||||
and eax, 0xFFFFF000
|
||||
and eax, 0xFFFFF000 ; not PAGESIZE
|
||||
.m_next:
|
||||
add esi, eax
|
||||
jmp .scan
|
||||
@ -716,7 +707,7 @@ proc user_alloc_at stdcall, address:dword, alloc_size:dword
|
||||
pop ebx
|
||||
ret
|
||||
.found:
|
||||
test al, FREE_BLOCK
|
||||
test al, MEM_BLOCK_FREE
|
||||
jz .error
|
||||
mov eax, ecx
|
||||
sub eax, edx
|
||||
@ -733,7 +724,7 @@ proc user_alloc_at stdcall, address:dword, alloc_size:dword
|
||||
mov eax, edx
|
||||
sub eax, esi
|
||||
jz .nofirst
|
||||
or al, FREE_BLOCK
|
||||
or al, MEM_BLOCK_FREE
|
||||
mov [page_tabs + ebx*4], eax
|
||||
.nofirst:
|
||||
mov eax, [alloc_size]
|
||||
@ -742,14 +733,14 @@ proc user_alloc_at stdcall, address:dword, alloc_size:dword
|
||||
mov ebx, edx
|
||||
add edx, eax
|
||||
shr ebx, 12
|
||||
or al, USED_BLOCK
|
||||
or al, MEM_BLOCK_USED
|
||||
mov [page_tabs + ebx*4], eax
|
||||
shr eax, 12
|
||||
dec eax
|
||||
jz .second_nofill
|
||||
inc ebx
|
||||
.fill:
|
||||
mov dword [page_tabs+ebx*4], 2
|
||||
mov dword [page_tabs + ebx*4], MEM_BLOCK_RESERVED
|
||||
inc ebx
|
||||
dec eax
|
||||
jnz .fill
|
||||
@ -757,7 +748,7 @@ proc user_alloc_at stdcall, address:dword, alloc_size:dword
|
||||
.second_nofill:
|
||||
sub ecx, edx
|
||||
jz .nothird
|
||||
or cl, FREE_BLOCK
|
||||
or cl, MEM_BLOCK_FREE
|
||||
mov [page_tabs + ebx*4], ecx
|
||||
|
||||
.nothird:
|
||||
@ -796,14 +787,14 @@ proc user_free stdcall, base:dword
|
||||
xor ebx, ebx
|
||||
shr esi, 12
|
||||
mov eax, [page_tabs + (esi-1)*4]
|
||||
test al, USED_BLOCK
|
||||
test al, MEM_BLOCK_USED
|
||||
jz .cantfree
|
||||
test al, DONT_FREE_BLOCK
|
||||
test al, MEM_BLOCK_DONT_FREE
|
||||
jnz .cantfree
|
||||
|
||||
and eax, not 4095
|
||||
mov ecx, eax
|
||||
or al, FREE_BLOCK
|
||||
or al, MEM_BLOCK_FREE
|
||||
mov [page_tabs + (esi-1)*4], eax
|
||||
sub ecx, 4096
|
||||
mov ebx, ecx
|
||||
@ -873,9 +864,9 @@ proc user_unmap stdcall, base:dword, offset:dword, size:dword
|
||||
shr ebx, 12 ; chek block attributes
|
||||
lea ebx, [page_tabs + ebx*4]
|
||||
mov eax, [ebx-4] ; block attributes
|
||||
test al, USED_BLOCK
|
||||
test al, MEM_BLOCK_USED
|
||||
jz .error
|
||||
test al, DONT_FREE_BLOCK
|
||||
test al, MEM_BLOCK_DONT_FREE
|
||||
jnz .error
|
||||
|
||||
shr edx, 12
|
||||
@ -902,12 +893,12 @@ proc user_unmap stdcall, base:dword, offset:dword, size:dword
|
||||
jz @F
|
||||
test eax, PG_SHARED ; page shared ?
|
||||
jnz @F
|
||||
mov [edx], dword 2
|
||||
mov dword[edx], MEM_BLOCK_RESERVED
|
||||
; mark page as reserved
|
||||
invlpg [ebx] ; when we start using
|
||||
call free_page ; empty c-o-w page instead this ?
|
||||
@@:
|
||||
add ebx, 4096
|
||||
add ebx, 4096 ; PAGESIZE?
|
||||
add edx, 4
|
||||
dec ecx
|
||||
jnz .unmap
|
||||
@ -930,13 +921,13 @@ user_normalize:
|
||||
shr edi, 12
|
||||
@@:
|
||||
mov eax, [page_tabs + esi*4]
|
||||
test al, USED_BLOCK
|
||||
test al, MEM_BLOCK_USED
|
||||
jz .test_free
|
||||
shr eax, 12
|
||||
add esi, eax
|
||||
jmp @B
|
||||
.test_free:
|
||||
test al, FREE_BLOCK
|
||||
test al, MEM_BLOCK_FREE
|
||||
jz .err
|
||||
mov edx, eax
|
||||
shr edx, 12
|
||||
@ -945,7 +936,7 @@ user_normalize:
|
||||
jae .exit
|
||||
|
||||
mov ebx, [page_tabs + edx*4]
|
||||
test bl, USED_BLOCK
|
||||
test bl, MEM_BLOCK_USED
|
||||
jz .next_free
|
||||
|
||||
shr ebx, 12
|
||||
@ -953,12 +944,12 @@ user_normalize:
|
||||
mov esi, edx
|
||||
jmp @B
|
||||
.next_free:
|
||||
test bl, FREE_BLOCK
|
||||
test bl, MEM_BLOCK_FREE
|
||||
jz .err
|
||||
and dword[page_tabs + edx*4], 0
|
||||
add eax, ebx
|
||||
and eax, not 4095
|
||||
or eax, FREE_BLOCK
|
||||
and eax, not 4095 ; not (PAGESIZE - 1) ?
|
||||
or eax, MEM_BLOCK_FREE
|
||||
mov [page_tabs + esi*4], eax
|
||||
jmp @B
|
||||
.exit:
|
||||
@ -990,7 +981,7 @@ user_realloc:
|
||||
lea ecx, [eax - 0x1000]
|
||||
shr ecx, 12
|
||||
mov edx, [page_tabs + ecx*4]
|
||||
test dl, USED_BLOCK
|
||||
test dl, MEM_BLOCK_USED
|
||||
jnz @f
|
||||
; attempt to realloc invalid pointer
|
||||
.ret0:
|
||||
@ -1002,7 +993,7 @@ user_realloc:
|
||||
xor eax, eax
|
||||
ret
|
||||
@@:
|
||||
test dl, DONT_FREE_BLOCK
|
||||
test dl, MEM_BLOCK_DONT_FREE
|
||||
jnz .ret0
|
||||
add ebx, 0x1FFF
|
||||
shr edx, 12
|
||||
@ -1036,7 +1027,7 @@ user_realloc:
|
||||
mov ebx, [edx + PROC.mem_used]
|
||||
sub ebx, eax
|
||||
add ebx, 0x1000
|
||||
or al, FREE_BLOCK
|
||||
or al, MEM_BLOCK_FREE
|
||||
mov [page_tabs + ecx*4], eax
|
||||
push esi edi
|
||||
mov esi, [edx + PROC.heap_base]
|
||||
@ -1048,7 +1039,7 @@ user_realloc:
|
||||
.nofreeall:
|
||||
sub edx, ecx
|
||||
shl ebx, 12
|
||||
or ebx, USED_BLOCK
|
||||
or ebx, MEM_BLOCK_USED
|
||||
xchg [page_tabs + ecx*4], ebx
|
||||
shr ebx, 12
|
||||
sub ebx, edx
|
||||
@ -1074,7 +1065,7 @@ user_realloc:
|
||||
cmp edx, esi
|
||||
jae .merge_done
|
||||
mov eax, [page_tabs + edx*4]
|
||||
test al, USED_BLOCK
|
||||
test al, MEM_BLOCK_USED
|
||||
jnz .merge_done
|
||||
and dword [page_tabs + edx*4], 0
|
||||
shr eax, 12
|
||||
@ -1084,7 +1075,7 @@ user_realloc:
|
||||
jmp @b
|
||||
.merge_done:
|
||||
pop esi
|
||||
or ebx, FREE_BLOCK
|
||||
or ebx, MEM_BLOCK_FREE
|
||||
mov [page_tabs + ecx*4], ebx
|
||||
.ret:
|
||||
mov ecx, [current_process]
|
||||
@ -1101,7 +1092,7 @@ user_realloc:
|
||||
cmp edx, eax
|
||||
jae .cant_inplace
|
||||
mov eax, [page_tabs + edx*4]
|
||||
test al, FREE_BLOCK
|
||||
test al, MEM_BLOCK_FREE
|
||||
jz .cant_inplace
|
||||
shr eax, 12
|
||||
add eax, edx
|
||||
@ -1109,13 +1100,13 @@ user_realloc:
|
||||
jb .cant_inplace
|
||||
jz @f
|
||||
shl eax, 12
|
||||
or al, FREE_BLOCK
|
||||
or al, MEM_BLOCK_FREE
|
||||
mov [page_tabs + ebx*4], eax
|
||||
@@:
|
||||
mov eax, ebx
|
||||
sub eax, ecx
|
||||
shl eax, 12
|
||||
or al, USED_BLOCK
|
||||
or al, MEM_BLOCK_USED
|
||||
mov [page_tabs + ecx*4], eax
|
||||
lea eax, [ecx + 1]
|
||||
shl eax, 12
|
||||
@ -1150,7 +1141,7 @@ user_realloc:
|
||||
cmp esi, edi
|
||||
jae .place_not_found
|
||||
mov eax, [page_tabs + esi*4]
|
||||
test al, FREE_BLOCK
|
||||
test al, MEM_BLOCK_FREE
|
||||
jz .next_place
|
||||
shr eax, 12
|
||||
cmp eax, ebx
|
||||
@ -1170,13 +1161,13 @@ user_realloc:
|
||||
push esi
|
||||
add esi, ebx
|
||||
shl eax, 12
|
||||
or al, FREE_BLOCK
|
||||
or al, MEM_BLOCK_FREE
|
||||
mov [page_tabs + esi*4], eax
|
||||
pop esi
|
||||
@@:
|
||||
mov eax, ebx
|
||||
shl eax, 12
|
||||
or al, USED_BLOCK
|
||||
or al, MEM_BLOCK_USED
|
||||
mov [page_tabs + esi*4], eax
|
||||
inc esi
|
||||
mov eax, esi
|
||||
@ -1184,7 +1175,7 @@ user_realloc:
|
||||
push eax
|
||||
mov eax, [page_tabs + ecx*4]
|
||||
and eax, not 0xFFF
|
||||
or al, FREE_BLOCK
|
||||
or al, MEM_BLOCK_FREE
|
||||
sub edx, ecx
|
||||
mov [page_tabs + ecx*4], eax
|
||||
inc ecx
|
||||
@ -1210,7 +1201,7 @@ user_realloc:
|
||||
add [edx + PROC.mem_used], ebx
|
||||
pop ebx
|
||||
@@:
|
||||
mov dword [page_tabs+esi*4], 2
|
||||
mov dword [page_tabs + esi*4], MEM_BLOCK_RESERVED
|
||||
inc esi
|
||||
dec ebx
|
||||
jnz @b
|
||||
@ -1526,3 +1517,4 @@ proc shmem_close stdcall, name:dword
|
||||
.fail:
|
||||
ret
|
||||
endp
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;
|
||||
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved.
|
||||
;; Copyright (C) KolibriOS team 2004-2020. All rights reserved.
|
||||
;; PROGRAMMING:
|
||||
;; Ivan Poddubny
|
||||
;; Marat Zakiyanov (Mario79)
|
||||
@ -2799,7 +2799,7 @@ align 4
|
||||
jz .nomem
|
||||
mov ebx, eax
|
||||
shr ebx, 12
|
||||
or dword [page_tabs+(ebx-1)*4], DONT_FREE_BLOCK
|
||||
or dword [page_tabs+(ebx-1)*4], MEM_BLOCK_DONT_FREE
|
||||
mov esi, [img_background]
|
||||
shr esi, 12
|
||||
mov ecx, [mem_BACKGROUND]
|
||||
@ -2844,7 +2844,7 @@ nosb6:
|
||||
mov ebx, ecx
|
||||
shr eax, 12
|
||||
mov ecx, [page_tabs+(eax-1)*4]
|
||||
test cl, USED_BLOCK+DONT_FREE_BLOCK
|
||||
test cl, MEM_BLOCK_USED or MEM_BLOCK_DONT_FREE
|
||||
jz .err
|
||||
jnp .err
|
||||
push eax
|
||||
@ -2862,7 +2862,7 @@ align 4
|
||||
inc eax
|
||||
loop @b
|
||||
pop eax
|
||||
and dword [page_tabs+(eax-1)*4], not DONT_FREE_BLOCK
|
||||
and dword [page_tabs+(eax-1)*4], not MEM_BLOCK_DONT_FREE
|
||||
stdcall user_free, ebx
|
||||
mov [esp+32], eax
|
||||
and [bgrlockpid], 0
|
||||
|
Loading…
Reference in New Issue
Block a user