Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 7964 → Rev 7965

/kernel/trunk/core/dll.inc
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
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
/kernel/trunk/core/heap.inc
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,19 → 18,11
handle dd ? ;+28
ends
 
FREE_BLOCK = 4
USED_BLOCK = 8
DONT_FREE_BLOCK = 10h
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
 
 
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
 
macro calc_index op
{ shr op, 12
dec op
43,8 → 35,8
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
 
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
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
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
 
;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,25 → 132,25
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
165,8 → 157,8
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
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
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
 
align 4
free_mem_block:
 
mov ebx, [next_memblock]
mov [eax], ebx
mov [next_memblock], eax
 
xor ebx, ebx
 
mov dword [eax+4], ebx
mov dword [eax+8], ebx
mov dword [eax+12], ebx
261,7 → 254,9
; 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
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
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
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
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
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
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
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
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,7 → 576,7
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
595,15 → 583,18
 
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
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,11 → 611,11
 
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
631,7 → 622,7
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
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
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
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,7 → 733,7
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
749,7 → 740,7
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
.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
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
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
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
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
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
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
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
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
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
.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
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
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
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
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
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
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
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
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
.fail:
ret
endp