Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 357 → Rev 356

/kernel/trunk/core/heap.inc
1,9 → 1,12
 
HEAP_BASE equ 0x00C00000
;HEAP_SIZE equ 0x01000000
 
struc MEM_BLOCK
{ .next_block dd ?
.prev_block dd ? ;+4
.list_fd dd ? ;+8
.list_bk dd ? ;+12
.list_next dd ? ;+8
.list_prev dd ? ;+12
.base dd ? ;+16
.size dd ? ;+20
.flags dd ? ;+24
10,7 → 13,6
.handle dd ? ;+28
}
 
MEM_LIST_OFFSET equ 8
FREE_BLOCK equ 4
USED_BLOCK equ 8
 
22,8 → 24,8
 
block_next equ MEM_BLOCK.next_block
block_prev equ MEM_BLOCK.prev_block
list_fd equ MEM_BLOCK.list_fd
list_bk equ MEM_BLOCK.list_bk
list_next equ MEM_BLOCK.list_next
list_prev equ MEM_BLOCK.list_prev
block_base equ MEM_BLOCK.base
block_size equ MEM_BLOCK.size
block_flags equ MEM_BLOCK.flags
38,18 → 40,18
}
 
macro remove_from_list op
{ mov edx, [op+list_fd]
mov ecx, [op+list_bk]
{ mov edx, [op+list_next]
mov ecx, [op+list_prev]
test edx, edx
jz @f
mov [edx+list_bk], ecx
mov [edx+list_prev], ecx
@@:
test ecx, ecx
jz @f
mov [ecx+list_fd], edx
mov [ecx+list_next], edx
@@:
mov [op+list_fd],0
mov [op+list_bk],0
mov [op+list_next],0
mov [op+list_prev],0
}
 
macro remove_from_free op
70,12 → 72,11
 
macro remove_from_used op
{
mov edx, [op+list_fd]
mov ecx, [op+list_bk]
mov [edx+list_bk], ecx
mov [ecx+list_fd], edx
mov [op+list_fd], 0
mov [op+list_bk], 0
remove_from_list op
cmp [mem_used_list], op
jne @f
mov [mem_used_list], edx
@@:
}
 
align 4
96,10 → 97,6
mov [mem_block_end], mem_block_map+512
mov [mem_block_arr], HEAP_BASE
 
mov eax, mem_used.fd-MEM_LIST_OFFSET
mov [mem_used.fd], eax
mov [mem_used.bk], eax
 
stdcall alloc_pages, dword 32
mov ecx, 32
mov edx, eax
112,12 → 109,13
jnz .l1
 
mov edi, HEAP_BASE
mov ebx, HEAP_BASE+MEM_BLOCK_SIZE
mov ebx, edi
add ebx, MEM_BLOCK_SIZE
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+list_next], eax
mov [edi+list_prev], eax
mov [edi+block_base], HEAP_BASE
mov [edi+block_size], 4096*MEM_BLOCK_SIZE
mov [edi+block_flags], USED_BLOCK
124,8 → 122,7
 
mov [ebx+block_next], eax
mov [ebx+block_prev], eax
mov [ebx+list_fd], eax
mov [ebx+list_bk], eax
mov [ebx+list_next], eax
mov [ebx+block_base], HEAP_BASE+4096*MEM_BLOCK_SIZE
 
mov ecx, [MEM_AMOUNT]
138,6 → 135,7
mov [mem_block_mask], eax
mov [mem_block_mask+4],0x80000000
 
mov [mem_used_list], eax
mov [mem_block_list+63*4], ebx
mov byte [mem_block_map], 0xFC
and [heap_mutex], 0
222,15 → 220,6
endp
 
proc free_mem_block
mov dword [eax], 0
mov dword [eax+4], 0
mov dword [eax+8], 0
mov dword [eax+12], 0
mov dword [eax+16], 0
; mov dword [eax+20], 0
mov dword [eax+24], 0
mov dword [eax+28], 0
 
sub eax, [mem_block_arr]
shr eax, 5
 
296,8 → 285,8
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 [esi+list_next], 0
mov [esi+list_prev], 0
and eax, eax
jz @f
mov [eax+block_next], esi
329,22 → 318,22
btr [mem_block_mask], ecx
@@:
mov edx, [mem_block_list+eax*4]
mov [edi+list_fd], edx
mov [edi+list_next], edx
test edx, edx
jz @f
mov [edx+list_bk], edi
mov [edx+list_prev], edi
@@:
mov [mem_block_list+eax*4], edi
bts [mem_block_mask], eax
.m_eq_ind:
mov ecx, mem_used.fd-MEM_LIST_OFFSET
mov edx, [ecx+list_fd]
mov [esi+list_fd], edx
mov [esi+list_bk], ecx
mov [ecx+list_fd], esi
mov [edx+list_bk], esi
 
mov ebx, [mem_used_list]
mov [esi+list_next], ebx
test ebx, ebx
jz @f
mov [ebx+list_prev], esi
@@:
mov [esi+block_flags], USED_BLOCK
mov [mem_used_list], esi
mov eax, [esi+block_base]
mov ebx, [size]
sub [heap_free], ebx
357,13 → 346,13
jnz @f
btr [mem_block_mask], ebx
@@:
mov ecx, mem_used.fd-MEM_LIST_OFFSET
mov edx, [ecx+list_fd]
mov [edi+list_fd], edx
mov [edi+list_bk], ecx
mov [ecx+list_fd], edi
mov [edx+list_bk], edi
 
mov ecx, [mem_used_list]
mov [edi+list_next], ecx
test ecx, ecx
jnz @f
mov [ecx+list_prev], edi
@@:
mov [mem_used_list], edi
mov [edi+block_flags], USED_BLOCK
mov eax, [edi+block_base]
mov ebx, [size]
383,14 → 372,14
call wait_mutex ;ebx
 
mov eax, [base]
mov esi, [mem_used.fd]
mov esi, [mem_used_list]
@@:
cmp esi, mem_used.fd-MEM_LIST_OFFSET
je .fail
test esi, esi
jz .fail
 
cmp [esi+block_base], eax
je .found
mov esi, [esi+list_fd]
mov esi, [esi+list_next]
jmp @b
.found:
cmp [esi+block_flags], USED_BLOCK
463,10 → 452,10
@@:
mov esi, [mem_block_list+eax*4]
mov [mem_block_list+eax*4], edi
mov [edi+list_fd], esi
mov [edi+list_next], esi
test esi, esi
jz @f
mov [esi+list_bk], edi
mov [esi+list_prev], edi
@@:
bts [mem_block_mask], eax
.m_eq:
482,10 → 471,10
 
mov edi, [mem_block_list+eax*4]
mov [mem_block_list+eax*4], esi
mov [esi+list_fd], edi
mov [esi+list_next], edi
test edi, edi
jz @f
mov [edi+list_bk], esi
mov [edi+list_prev], esi
@@:
bts [mem_block_mask], eax
mov [esi+block_flags],FREE_BLOCK
511,14 → 500,14
and eax, not 4095;
mov [size], eax
and eax, eax
jz .err
jz .error
mov ebx, eax
shr ebx, 12
mov [pages_count], ebx
 
stdcall alloc_kernel_space, eax
test eax, eax
jz .err
and eax, eax
jz .error
mov [lin_addr], eax
 
mov ecx, [pages_count]
533,7 → 522,7
stdcall alloc_pages, ebx
pop ecx ; yes ecx!!!
and eax, eax
jz .err
jz .error
 
mov edi, eax
mov edx, [lin_addr]
547,12 → 536,12
mov ecx, [pages_count]
and ecx, 7
jz .end
@@:
push ecx
 
@@: push ecx
call alloc_page
pop ecx
test eax, eax
jz .err
jz .error
 
stdcall map_page,edx,eax,dword PG_SW
add edx, 0x1000
561,7 → 550,7
.end:
mov eax, [lin_addr]
ret
.err:
.error:
xor eax, eax
ret
endp
574,14 → 563,14
call wait_mutex ;ebx
 
mov eax, [base]
mov esi, [mem_used.fd]
mov esi, [mem_used_list]
@@:
cmp esi, mem_used.fd-MEM_LIST_OFFSET
je .fail
test esi, esi
jz .fail
 
cmp [esi+block_base], eax
je .found
mov esi, [esi+list_fd]
mov esi, [esi+list_next]
jmp @b
.found:
cmp [esi+block_flags], USED_BLOCK