Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 2467 → Rev 2987

/kernel/branches/Kolibri-acpi/core/memory.inc
442,72 → 442,83
align 4
proc new_mem_resize stdcall, new_size:dword
 
mov ecx, pg_data.mutex
call mutex_lock
push ebx
push esi
push edi
 
mov edx, [current_slot]
cmp [edx+APPDATA.heap_base], 0
jne .exit
 
mov edi, [new_size]
add edi, 4095
and edi, not 4095
mov [new_size], edi
 
mov edx, [current_slot]
cmp [edx+APPDATA.heap_base], 0
jne .exit
 
mov esi, [edx+APPDATA.mem_size]
add esi, 4095
and esi, not 4095
 
cmp edi, esi
jae .expand
ja .expand
je .exit
 
mov ebx, edi
shr edi, 12
shr esi, 12
 
mov ecx, pg_data.mutex
call mutex_lock
@@:
mov eax, [app_page_tabs+edi*4]
test eax, 1
jz .next
mov dword [app_page_tabs+edi*4], 2
mov ebx, edi
shl ebx, 12
push eax
 
mov dword [app_page_tabs+edi*4], 0
invlpg [ebx]
pop eax
call free_page
 
.next:
add edi, 1
inc edi
add ebx, 0x1000
cmp edi, esi
jb @B
 
mov ecx, pg_data.mutex
call mutex_unlock
 
.update_size:
mov edx, [current_slot]
mov ebx, [new_size]
call update_mem_size
 
mov ecx, pg_data.mutex
call mutex_unlock
 
.exit:
pop edi
pop esi
pop ebx
xor eax, eax
ret
 
.expand:
 
push esi
push edi
mov ecx, pg_data.mutex
call mutex_lock
 
xchg esi, edi
 
push esi ;new size
push edi ;old size
 
add edi, 0x3FFFFF
and edi, not(0x3FFFFF)
add esi, 0x3FFFFF
and esi, not(0x3FFFFF)
 
cmp esi, edi
cmp edi, esi
jae .grow
 
xchg esi, edi
 
@@:
call alloc_page
test eax, eax
jz .exit_pop
jz .exit_fail
 
stdcall map_page_table, edi, eax
 
524,51 → 535,38
cmp edi, esi
jb @B
.grow:
;//-
pop edi
push edi
mov esi, [pg_data.pages_free]
sub esi, 1
shr edi, 12
cmp esi, edi
jle .out_of_memory
;//-
pop edi
pop esi
@@:
call alloc_page
test eax, eax
jz .exit
stdcall map_page, esi, eax, dword PG_UW
pop edi ;old size
pop ecx ;new size
 
push edi
mov edi, esi
xor eax, eax
mov ecx, 1024
cld
shr edi, 10
shr ecx, 10
sub ecx, edi
shr ecx, 2 ;pages count
mov eax, 2
 
add edi, app_page_tabs
rep stosd
pop edi
 
add esi, 0x1000
cmp esi, edi
jb @B
mov ecx, pg_data.mutex
call mutex_unlock
 
jmp .update_size
;//-
.exit_pop:
.out_of_memory:
;//-
pop edi
pop esi
.exit:
 
.exit_fail:
mov ecx, pg_data.mutex
call mutex_unlock
 
add esp, 8
pop edi
pop esi
pop ebx
xor eax, eax
inc eax
ret
endp
 
 
align 4
update_mem_size:
; in: edx = slot base
; ebx = new memory size
1253,7 → 1251,7
cmp ecx, OS_BASE
jae .fail
 
cmp ebx, OS_BASE
cmp edx, OS_BASE
jae .fail
 
mov edi, edx
1459,7 → 1457,7
mov ebx, [size]
dec ebx
mov eax, 0xFFFFFFFF
mov edx, 0x00000000
mov edx, 0x0000000F
sub eax, ebx
sbb edx, 0
or eax, 0x800