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 |