Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 2150 → Rev 2151

/kernel/branches/Kolibri-acpi/core/heap.inc
7,6 → 7,7
 
$Revision$
 
HASH_IT = 1
 
struc MEM_BLOCK
{
17,6 → 18,7
.size dd ? ;+20
.flags dd ? ;+24
.handle dd ? ;+28
.sizeof:
}
 
FREE_BLOCK equ 4
27,7 → 29,6
MEM_BLOCK MEM_BLOCK
end virtual
 
MEM_BLOCK_SIZE equ 8*4
 
block_next equ MEM_BLOCK.next_block
block_prev equ MEM_BLOCK.prev_block
59,7 → 60,7
;Initial heap state
;
;+heap_size terminator USED_BLOCK
;+4096*MEM_BLOCK_SIZE free space FREE_BLOCK
;+4096*MEM_BLOCK.sizeof free space FREE_BLOCK
;HEAP_BASE heap_descriptors USED_BLOCK
;
 
74,15 → 75,6
stosd
loop @B
 
mov ecx, 512/4
mov edi, mem_block_map
not eax
rep stosd
 
mov [mem_block_start], mem_block_map
mov [mem_block_end], mem_block_map+512
mov [mem_block_arr], HEAP_BASE
 
mov eax, mem_used.fd
mov [mem_used.fd], eax
mov [mem_used.bk], eax
99,8 → 91,8
jnz .l1
 
mov edi, HEAP_BASE ;descriptors
mov ebx, HEAP_BASE+MEM_BLOCK_SIZE ;free space
mov ecx, HEAP_BASE+MEM_BLOCK_SIZE*2 ;terminator
mov ebx, HEAP_BASE+MEM_BLOCK.sizeof ;free space
mov ecx, HEAP_BASE+MEM_BLOCK.sizeof*2 ;terminator
 
xor eax, eax
mov [edi+block_next], ebx
108,7 → 100,7
mov [edi+list_fd], eax
mov [edi+list_bk], eax
mov [edi+block_base], HEAP_BASE
mov [edi+block_size], 4096*MEM_BLOCK_SIZE
mov [edi+block_size], 4096*MEM_BLOCK.sizeof
mov [edi+block_flags], USED_BLOCK
 
mov [ecx+block_next], eax
115,19 → 107,17
mov [ecx+block_prev], ebx
mov [edi+list_fd], eax
mov [edi+list_bk], eax
mov [edi+block_base], 0
mov [edi+block_size], 0
mov [edi+block_base], eax
mov [edi+block_size], eax
mov [edi+block_flags], USED_BLOCK
 
mov [ebx+block_next], ecx
mov [ebx+block_prev], edi
mov [ebx+list_fd], eax
mov [ebx+list_bk], eax
mov [ebx+block_base], HEAP_BASE+4096*MEM_BLOCK_SIZE
mov [ebx+block_base], HEAP_BASE+4096*MEM_BLOCK.sizeof
 
mov ecx, [pg_data.kernel_pages]
shl ecx, 12
sub ecx, HEAP_BASE-OS_BASE+4096*MEM_BLOCK_SIZE
sub ecx, HEAP_BASE-OS_BASE+4096*MEM_BLOCK.sizeof
mov [heap_size], ecx
mov [heap_free], ecx
mov [ebx+block_size], ecx
139,11 → 129,22
mov ecx, mem_block_list+63*8
list_add ebx, ecx
 
mov byte [mem_block_map], 0xFC
mov ecx, 4096-3-1
mov eax, HEAP_BASE+MEM_BLOCK.sizeof*4
 
mov [next_memblock], HEAP_BASE+MEM_BLOCK.sizeof*3
@@:
mov [eax-MEM_BLOCK.sizeof], eax
add eax, MEM_BLOCK.sizeof
loop @B
 
mov [eax-MEM_BLOCK.sizeof], dword 0
 
 
mov ecx, heap_mutex
call mutex_init
mov [heap_blocks], 4095
mov [free_blocks], 4094
mov [heap_blocks], 4094
mov [free_blocks], 4093
ret
endp
 
201,59 → 202,23
mov edx, [esi]
jmp .find
 
align 4
alloc_mem_block:
 
mov ebx, [mem_block_start]
mov ecx, [mem_block_end]
.l1:
bsf eax,[ebx];
jnz found
add ebx,4
cmp ebx, ecx
jb .l1
xor eax,eax
ret
 
found:
btr [ebx], eax
mov [mem_block_start],ebx
sub ebx, mem_block_map
lea eax,[eax+ebx*8]
shl eax, 5
add eax, [mem_block_arr]
dec [free_blocks]
ret
 
align 4
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
mov ebx, [next_memblock]
mov [eax], ebx
mov [next_memblock], eax
xor ebx, ebx
 
sub eax, [mem_block_arr]
shr eax, 5
 
mov ebx, mem_block_map
bts [ebx], eax
mov dword [eax+4], ebx
mov dword [eax+8], ebx
mov dword [eax+12], ebx
mov dword [eax+16], ebx
; mov dword [eax+20], 0 ;don't clear block size
mov dword [eax+24], ebx
mov dword [eax+28], ebx
inc [free_blocks]
shr eax, 3
and eax, not 3
add eax, ebx
cmp [mem_block_start], eax
ja @f
ret
@@:
mov [mem_block_start], eax
ret
.err:
xor eax, eax
ret
 
align 4
proc alloc_kernel_space stdcall, size:dword
291,11 → 256,13
cmp eax, [size]
je .m_eq_size
 
call alloc_mem_block
and eax, eax
mov esi, [next_memblock] ;new memory block
test esi, esi
jz .error_unlock
 
mov esi, eax ;esi - splitted block
dec [free_blocks]
mov eax, [esi]
mov [next_memblock], eax
 
mov [esi+block_next], edi
mov eax, [edi+block_prev]
340,17 → 307,19
mov ebx, [size]
sub [heap_free], ebx
 
; pushad
; mov eax, [esi+block_base]
; mov ebx, [esi+block_base]
; shr ebx, 6
; add eax, ebx
; shr ebx, 6
; add eax, ebx
; shr eax, 12
; and eax, 63
; inc [mem_hash_cnt+eax*4]
; popad
if HASH_IT
pushad
mov eax, [esi+block_base]
mov ebx, [esi+block_base]
shr ebx, 6
add eax, ebx
shr ebx, 6
add eax, ebx
shr eax, 12
and eax, 63
inc [mem_hash_cnt+eax*4]
popad
end if
 
mov ecx, heap_mutex
call mutex_unlock
377,17 → 346,19
mov ebx, [size]
sub [heap_free], ebx
 
; pushad
; mov eax, [edi+block_base]
; mov ebx, [edi+block_base]
; shr ebx, 6
; add eax, ebx
; shr ebx, 6
; add eax, ebx
; shr eax, 12
; and eax, 63
; inc [mem_hash_cnt+eax*4]
; popad
if HASH_IT
pushad
mov eax, [edi+block_base]
mov ebx, [edi+block_base]
shr ebx, 6
add eax, ebx
shr ebx, 6
add eax, ebx
shr eax, 12
and eax, 63
inc [mem_hash_cnt+eax*4]
popad
end if
 
mov ecx, heap_mutex
call mutex_unlock
430,19 → 401,19
cmp [esi+block_flags], USED_BLOCK
jne .fail
 
 
; pushad
; mov eax, [esi+block_base]
; mov ebx, [esi+block_base]
; shr ebx, 6
; add eax, ebx
; shr ebx, 6
; add eax, ebx
; shr eax, 12
; and eax, 63
; dec [mem_hash_cnt+eax*4]
; popad
 
if HASH_IT
pushad
mov eax, [esi+block_base]
mov ebx, [esi+block_base]
shr ebx, 6
add eax, ebx
shr ebx, 6
add eax, ebx
shr eax, 12
and eax, 63
dec [mem_hash_cnt+eax*4]
popad
end if
mov eax, [esi+block_size]
add [heap_free], eax