648,9 → 648,6 |
or ecx, FREE_BLOCK |
mov [page_tabs+esi], ecx |
ret |
.exit: |
xor eax, eax |
ret |
endp |
|
align 4 |
670,7 → 667,7 |
mov ebx, esi |
shr ebx, 12 |
mov eax, [page_tabs+ebx*4] |
test eax, FREE_BLOCK |
test al, FREE_BLOCK |
jz test_used |
and eax, 0xFFFFF000 |
cmp eax, ecx ;alloc_size |
677,10 → 674,9 |
jb m_next |
jz @f |
|
mov edx, esi |
add edx, ecx |
sub eax, ecx; |
or eax, FREE_BLOCK |
lea edx, [esi+ecx] |
sub eax, ecx |
or al, FREE_BLOCK |
shr edx, 12 |
mov [page_tabs+edx*4], eax |
@@: |
687,13 → 683,15 |
or ecx, USED_BLOCK |
mov [page_tabs+ebx*4], ecx |
shr ecx, 12 |
inc ebx |
dec ecx |
inc ebx |
jz .no |
@@: |
mov dword [page_tabs+ebx*4], 2 |
inc ebx |
dec ecx |
jnz @B |
.no: |
|
mov edx, [current_slot] |
mov ebx, [alloc_size] |
702,17 → 700,14 |
add ebx, [edx+APPDATA.mem_size] |
call update_mem_size |
|
mov eax, esi |
add eax, 4096 |
lea eax, [esi+4096] |
ret |
m_next: |
add esi, eax |
jmp l_0 |
test_used: |
test eax, USED_BLOCK |
test al, USED_BLOCK |
jz m_exit |
|
and eax, 0xFFFFF000 |
m_next: |
add esi, eax |
jmp l_0 |
m_exit: |
728,26 → 723,25 |
jz .exit |
|
xor ebx, ebx |
sub esi, 4096 |
shr esi, 12 |
mov eax, [page_tabs+esi*4] |
mov eax, [page_tabs+(esi-1)*4] |
test al, USED_BLOCK |
jz .not_used |
jz .cantfree |
test al, DONT_FREE_BLOCK |
jnz .cantfree |
|
and eax, not 4095 |
mov ecx, eax |
or eax, FREE_BLOCK |
mov [page_tabs+esi*4], eax |
inc esi |
or al, FREE_BLOCK |
mov [page_tabs+(esi-1)*4], eax |
sub ecx, 4096 |
mov ebx, ecx |
shr ecx, 12 |
mov ebx, ecx |
jz .released |
.release: |
xor eax, eax |
xchg eax, [page_tabs+esi*4] |
test eax, 1 |
test al, 1 |
jz @F |
call free_page |
mov eax, esi |
757,7 → 751,7 |
inc esi |
dec ecx |
jnz .release |
.not_used: |
.released: |
mov edx, [current_slot] |
mov esi, dword [edx+APPDATA.heap_base] |
mov edi, dword [edx+APPDATA.heap_top] |
783,13 → 777,13 |
shr edi, 12 |
@@: |
mov eax, [page_tabs+esi*4] |
test eax, USED_BLOCK |
test al, USED_BLOCK |
jz .test_free |
shr eax, 12 |
add esi, eax |
jmp @B |
.test_free: |
test eax, FREE_BLOCK |
test al, FREE_BLOCK |
jz .err |
mov edx, eax |
shr edx, 12 |
798,7 → 792,7 |
jae .exit |
|
mov ebx, [page_tabs+edx*4] |
test ebx, USED_BLOCK |
test bl, USED_BLOCK |
jz .next_free |
|
shr ebx, 12 |
806,7 → 800,7 |
mov esi, edx |
jmp @B |
.next_free: |
test ebx, FREE_BLOCK |
test bl, FREE_BLOCK |
jz .err |
and dword [page_tabs+edx*4], 0 |
add eax, ebx |
836,7 → 830,7 |
lea ecx, [eax - 0x1000] |
shr ecx, 12 |
mov edx, [page_tabs+ecx*4] |
test edx, USED_BLOCK |
test dl, USED_BLOCK |
jnz @f |
; attempt to realloc invalid pointer |
.ret0: |
844,7 → 838,7 |
xor eax, eax |
ret |
@@: |
test edx, DONT_FREE_BLOCK |
test dl, DONT_FREE_BLOCK |
jnz .ret0 |
add ebx, 0x1FFF |
shr edx, 12 |
938,11 → 932,12 |
cmp edx, eax |
jae .cant_inplace |
mov eax, [page_tabs+edx*4] |
test al, FREE_BLOCK |
jz .cant_inplace |
shr eax, 12 |
add eax, edx |
cmp eax, ebx |
sub eax, ebx |
jb .cant_inplace |
sub eax, ebx |
jz @f |
shl eax, 12 |
or al, FREE_BLOCK |
1000,7 → 995,7 |
sub eax, ebx |
jz @f |
push esi |
add esi, eax |
add esi, ebx |
shl eax, 12 |
or al, FREE_BLOCK |
mov [page_tabs+esi*4], eax |
1020,6 → 1015,9 |
sub edx, ecx |
mov [page_tabs+ecx*4], eax |
inc ecx |
dec ebx |
dec edx |
jz .no |
@@: |
xor eax, eax |
xchg eax, [page_tabs+ecx*4] |
1027,11 → 1025,12 |
mov eax, ecx |
shl eax, 12 |
invlpg [eax] |
inc esi |
inc ecx |
inc esi |
dec ebx |
dec edx |
jnz @b |
.no: |
push ebx |
mov edx, [current_slot] |
shl ebx, 12 |