0,0 → 1,720 |
DWORD equ dword |
WORD equ word |
BYTE equ byte |
|
PTR equ |
|
_mem_counter equ (BOOT_VAR + 0x9100) |
_mem_table equ (BOOT_VAR + 0x9104) |
|
_spinlock_initialize: |
mov eax, DWORD PTR [esp+4] |
mov DWORD PTR [eax], 0 |
ret |
|
_buddy_find_block: |
push ebx |
mov eax, DWORD PTR [eax+12] |
mov ebx, ecx |
sub edx, eax |
sar edx, 2 |
imul ecx, edx, -858993459 |
lea eax, [eax+edx*4] |
.L4: |
cmp DWORD PTR [eax+12], ebx |
jne .L7 |
sub ecx, 1 |
sub eax, 20 |
cmp ecx, -1 |
jne .L4 |
xor eax, eax |
.L7: |
pop ebx |
ret |
|
@buddy_system_free@8: |
push ebp |
mov ebp, edx |
push edi |
push esi |
mov esi, edx |
push ebx |
sub esp, 8 |
mov ebx, DWORD PTR [edx+12] |
mov DWORD PTR [esp+4], ecx |
cmp BYTE PTR [ecx+24], bl |
mov edi, ebx |
je .L17 |
mov edx, DWORD PTR [ecx+12] |
mov DWORD PTR [esp], edx |
jmp .L15 |
.L30: |
mov eax, 1 |
sal eax, cl |
add edx, eax |
mov eax, DWORD PTR [esp+4] |
cmp edx, DWORD PTR [eax+8] |
jae .L17 |
.L31: |
lea eax, [edx+edx*4] |
mov edx, DWORD PTR [esp] |
lea ecx, [edx+eax*4] |
cmp ebx, DWORD PTR [ecx+12] |
jne .L17 |
mov eax, DWORD PTR [ecx+8] |
test eax, eax |
jne .L17 |
mov eax, DWORD PTR [ecx+4] |
cmp esi, ecx |
mov edx, DWORD PTR [ecx] |
mov DWORD PTR [esi+12], 255 |
mov DWORD PTR [ecx+12], 255 |
mov DWORD PTR [eax], edx |
mov edx, DWORD PTR [ecx] |
mov DWORD PTR [ecx], 0 |
mov DWORD PTR [edx+4], eax |
mov edx, ebp |
mov DWORD PTR [ecx+4], 0 |
jb .L26 |
mov edx, ecx |
.L26: |
mov ecx, edi |
mov esi, edx |
movzx eax, cl |
mov ebp, edx |
lea ebx, [eax+1] |
mov eax, DWORD PTR [esp+4] |
mov DWORD PTR [edx+12], ebx |
movzx edi, BYTE PTR [eax+24] |
mov edx, edi |
cmp dl, bl |
je .L17 |
mov edi, ebx |
.L15: |
mov eax, esi |
mov ecx, ebx |
sub eax, DWORD PTR [esp] |
sar eax, 2 |
imul edx, eax, -858993459 |
mov eax, edx |
shr eax, cl |
test al, 1 |
je .L30 |
mov eax, 1 |
mov ecx, ebx |
sal eax, cl |
sub edx, eax |
mov eax, DWORD PTR [esp+4] |
cmp edx, DWORD PTR [eax+8] |
jb .L31 |
.L17: |
mov ecx, edi |
movzx edx, cl |
mov ecx, DWORD PTR [esp+4] |
mov eax, DWORD PTR [ecx+28+edx*8] |
mov DWORD PTR [ebp], eax |
lea eax, [ecx+28+edx*8] |
mov DWORD PTR [ebp+4], eax |
mov eax, DWORD PTR [ecx+28+edx*8] |
mov DWORD PTR [ecx+28+edx*8], ebp |
mov DWORD PTR [eax+4], ebp |
add esp, 8 |
pop ebx |
pop esi |
pop edi |
pop ebp |
ret |
|
@buddy_system_alloc_block@8: |
push ebp |
mov ebp, ecx |
push edi |
mov ecx, 255 |
push esi |
mov eax, ebp |
push ebx |
sub esp, 4 |
mov DWORD PTR [esp], edx |
call _buddy_find_block |
mov ebx, eax |
mov eax, DWORD PTR [eax+4] |
mov edx, DWORD PTR [ebx] |
mov DWORD PTR [eax], edx |
mov edx, DWORD PTR [ebx] |
mov DWORD PTR [ebx], 0 |
mov DWORD PTR [edx+4], eax |
mov eax, DWORD PTR [ebx+12] |
mov DWORD PTR [ebx+4], 0 |
test eax, eax |
jne .L38 |
jmp .L34 |
.L35: |
mov DWORD PTR [ebx+8], 1 |
mov edx, esi |
mov ecx, ebp |
call @buddy_system_free@8 |
mov eax, DWORD PTR [ebx+12] |
mov DWORD PTR [ebx+8], 0 |
test eax, eax |
je .L34 |
.L38: |
lea ecx, [eax-1] |
mov edx, DWORD PTR [esp] |
mov eax, 20 |
sal eax, cl |
lea edi, [ebx+eax] |
mov eax, ebp |
mov DWORD PTR [ebx+12], ecx |
mov esi, edi |
mov DWORD PTR [edi+12], ecx |
mov ecx, 255 |
call _buddy_find_block |
cmp edi, eax |
jne .L35 |
mov esi, ebx |
mov ebx, edi |
jmp .L35 |
.L34: |
mov DWORD PTR [ebx+8], 1 |
mov eax, ebx |
add esp, 4 |
pop ebx |
pop esi |
pop edi |
pop ebp |
ret |
|
_zone_release: |
push edi |
push esi |
push ebx |
mov esi, DWORD PTR [esp+16] |
mov eax, DWORD PTR [esp+20] |
mov edi, DWORD PTR [esp+24] |
mov edx, DWORD PTR [esi+4] |
add edi, eax |
cmp edi, edx |
jb .L48 |
mov ebx, edx |
add ebx, DWORD PTR [esi+8] |
cmp eax, ebx |
ja .L48 |
cmp eax, edx |
mov ecx, eax |
jae .L44 |
mov ecx, edx |
.L44: |
cmp edi, ebx |
jbe .L45 |
mov edi, ebx |
.L45: |
cmp ecx, edi |
jae .L48 |
mov ebx, ecx |
.L47: |
mov edx, DWORD PTR [esi+12] |
mov eax, ecx |
add ebx, 1 |
sub eax, DWORD PTR [esi+4] |
lea eax, [eax+eax*4] |
mov DWORD PTR [edx+8+eax*4], 0 |
sub ecx, DWORD PTR [esi+4] |
lea edx, [ecx+ecx*4] |
mov ecx, esi |
sal edx, 2 |
add edx, DWORD PTR [esi+12] |
call @buddy_system_free@8 |
cmp edi, ebx |
mov ecx, ebx |
ja .L47 |
.L48: |
pop ebx |
pop esi |
pop edi |
ret |
|
_zone_reserve: |
push edi |
push esi |
push ebx |
mov esi, DWORD PTR [esp+16] |
mov eax, DWORD PTR [esp+20] |
mov ebx, DWORD PTR [esp+24] |
mov edx, DWORD PTR [esi+4] |
add ebx, eax |
cmp ebx, edx |
jb .L61 |
mov ecx, edx |
add ecx, DWORD PTR [esi+8] |
cmp eax, ecx |
ja .L61 |
cmp eax, edx |
jae .L54 |
mov eax, edx |
.L54: |
cmp ebx, ecx |
mov edi, ebx |
jbe .L55 |
mov edi, ecx |
.L55: |
cmp eax, edi |
jae .L61 |
mov ebx, eax |
jmp .L57 |
.L58: |
add ebx, 1 |
cmp edi, ebx |
mov eax, ebx |
jbe .L61 |
.L62: |
mov edx, DWORD PTR [esi+4] |
.L57: |
sub eax, edx |
lea eax, [eax+eax*4] |
lea edx, [0+eax*4] |
add edx, DWORD PTR [esi+12] |
mov ecx, DWORD PTR [edx+8] |
test ecx, ecx |
jne .L58 |
add ebx, 1 |
mov ecx, esi |
call @buddy_system_alloc_block@8 |
mov eax, ebx |
sub DWORD PTR [esi+16], 1 |
cmp edi, ebx |
ja .L62 |
.L61: |
pop ebx |
pop esi |
pop edi |
ret |
|
@buddy_system_alloc@8: |
sub esp, 12 |
mov DWORD PTR [esp], ebx |
lea eax, [ecx+28+edx*8] |
mov ebx, edx |
mov DWORD PTR [esp+4], esi |
mov esi, ecx |
mov DWORD PTR [esp+8], edi |
cmp DWORD PTR [ecx+32+edx*8], eax |
je .L64 |
mov ecx, DWORD PTR [ecx+32+edx*8] |
mov eax, DWORD PTR [ecx+4] |
mov edx, DWORD PTR [ecx] |
mov DWORD PTR [ecx+8], 1 |
mov DWORD PTR [eax], edx |
mov edx, DWORD PTR [ecx] |
mov DWORD PTR [ecx], 0 |
mov DWORD PTR [edx+4], eax |
mov DWORD PTR [ecx+4], 0 |
.L66: |
mov ebx, DWORD PTR [esp] |
mov eax, ecx |
mov esi, DWORD PTR [esp+4] |
mov edi, DWORD PTR [esp+8] |
add esp, 12 |
ret |
.L64: |
movzx eax, BYTE PTR [ecx+24] |
cmp eax, edx |
jne .L71 |
.L67: |
xor ecx, ecx |
jmp .L66 |
.L71: |
lea edx, [edx+1] |
call @buddy_system_alloc@8 |
test eax, eax |
mov edi, eax |
je .L67 |
mov ecx, DWORD PTR [eax+12] |
mov edx, 20 |
mov DWORD PTR [eax+12], ebx |
mov DWORD PTR [eax+8], 1 |
sub ecx, 1 |
sal edx, cl |
mov ecx, esi |
add edx, eax |
mov DWORD PTR [edx+12], ebx |
call @buddy_system_free@8 |
mov ecx, edi |
jmp .L66 |
|
_zone_frame_alloc: |
sub esp, 8 |
mov ecx, eax |
mov DWORD PTR [esp], ebx |
mov ebx, eax |
mov DWORD PTR [esp+4], esi |
mov esi, edx |
call @buddy_system_alloc@8 |
mov ecx, esi |
mov edx, 1 |
sal edx, cl |
mov esi, DWORD PTR [esp+4] |
sub DWORD PTR [ebx+16], edx |
sub eax, DWORD PTR [ebx+12] |
add DWORD PTR [ebx+20], edx |
mov ebx, DWORD PTR [esp] |
add esp, 8 |
sar eax, 2 |
imul eax, eax, -858993459 |
ret |
|
_frame_set_parent: |
mov eax, DWORD PTR [esp+4] |
sub eax, DWORD PTR [_z_core+4] |
mov ecx, DWORD PTR [esp+8] |
mov edx, DWORD PTR [_z_core+12] |
lea eax, [eax+eax*4] |
mov DWORD PTR [edx+16+eax*4], ecx |
ret |
|
@zone_free@8: |
sub esp, 8 |
lea edx, [edx+edx*4] |
mov DWORD PTR [esp], ebx |
sal edx, 2 |
mov ebx, ecx |
mov DWORD PTR [esp+4], esi |
add edx, DWORD PTR [ecx+12] |
mov eax, DWORD PTR [edx+8] |
mov esi, DWORD PTR [edx+12] |
sub eax, 1 |
test eax, eax |
mov DWORD PTR [edx+8], eax |
jne .L79 |
call @buddy_system_free@8 |
mov eax, 1 |
mov ecx, esi |
sal eax, cl |
add DWORD PTR [ebx+16], eax |
sub DWORD PTR [ebx+20], eax |
.L79: |
mov ebx, DWORD PTR [esp] |
mov esi, DWORD PTR [esp+4] |
add esp, 8 |
ret |
|
|
@zone_alloc@8: |
sub esp, 8 |
mov DWORD PTR [esp], ebx |
mov ebx, ecx |
mov DWORD PTR [esp+4], esi |
|
pushf |
pop esi |
cli |
|
@@: |
pause |
mov eax, [_z_core] |
test eax, eax |
jnz @b |
inc eax |
xchg [_z_core], eax |
test eax, eax |
jnz @b |
|
mov eax, ecx |
call _zone_frame_alloc |
mov edx, DWORD PTR [ebx+4] |
mov DWORD PTR [ebx], 0 |
|
push esi |
popf |
|
mov ebx, DWORD PTR [esp] |
add eax, edx |
mov esi, DWORD PTR [esp+4] |
sal eax, 12 |
add esp, 8 |
ret |
|
alloc_page: |
_alloc_page: |
push ebx |
|
pushf |
pop ebx |
cli |
@@: |
pause |
mov eax, [_z_core] |
test eax, eax |
jnz @b |
inc eax |
xchg [_z_core], eax |
test eax, eax |
jnz @b |
|
push edx |
xor edx, edx |
mov eax, _z_core |
call _zone_frame_alloc |
pop edx |
mov [_z_core], 0 |
|
push ebx |
popf |
|
pop ebx |
sal eax, 12 |
ret |
|
alloc_pages: |
_alloc_pages@4: |
push ebx |
|
pushf |
pop ebx |
cli |
@@: |
pause |
mov eax, [_z_core] |
test eax, eax |
jnz @b |
inc eax |
xchg [_z_core], eax |
test eax, eax |
jnz @b |
|
mov eax, DWORD PTR [esp+8] |
add eax, 7 |
and eax, -8 |
|
xor ecx, ecx |
bsr ecx, eax |
inc ecx |
|
push edx |
|
mov edx, ecx |
mov eax, _z_core |
call _zone_frame_alloc |
pop edx |
|
mov [_z_core], 0 |
push ebx |
popf |
|
pop ebx |
sal eax, 12 |
ret 4 |
|
_zone_create: |
push esi |
push ebx |
sub esp, 4 |
mov ebx, DWORD PTR [esp+16] |
mov esi, DWORD PTR [esp+24] |
mov DWORD PTR [esp], ebx |
call _spinlock_initialize |
mov eax, DWORD PTR [esp+20] |
mov DWORD PTR [ebx+8], esi |
mov DWORD PTR [ebx+16], esi |
mov DWORD PTR [ebx+20], 0 |
mov DWORD PTR [ebx+4], eax |
|
xor eax, eax |
bsr eax, esi |
|
xor edx, edx |
mov BYTE PTR [ebx+24], al |
.L81: |
lea eax, [ebx+28+edx*8] |
mov DWORD PTR [ebx+28+edx*8], eax |
mov DWORD PTR [ebx+32+edx*8], eax |
movzx eax, BYTE PTR [ebx+24] |
add edx, 1 |
cmp eax, edx |
jae .L81 |
lea ecx, [esi+esi*4] |
sal ecx, 2 |
call @balloc@4 |
test esi, esi |
mov DWORD PTR [ebx+12], eax |
je .L83 |
xor ecx, ecx |
xor edx, edx |
.L85: |
mov eax, edx |
add ecx, 1 |
add eax, DWORD PTR [ebx+12] |
add edx, 20 |
cmp ecx, esi |
mov DWORD PTR [eax+8], 1 |
mov DWORD PTR [eax+12], 0 |
jne .L85 |
.L83: |
add esp, 4 |
mov eax, 1 |
pop ebx |
pop esi |
ret |
|
_init_mm: |
push esi |
xor eax, eax |
push ebx |
xor esi, esi |
sub esp, 20 |
mov ebx, DWORD PTR [_mem_counter] |
test ebx, ebx |
jle .L93 |
xor ecx, ecx |
xor edx, edx |
jmp .L94 |
.L95: |
add ecx, 1 |
add edx, 20 |
cmp ecx, ebx |
je .L103 |
.L94: |
cmp DWORD PTR [_mem_table+edx+16], 1 |
jne .L95 |
mov eax, DWORD PTR [_mem_table+edx] |
add eax, DWORD PTR [_mem_table+edx+8] |
and eax, -4096 |
cmp esi, eax |
jae .L95 |
add ecx, 1 |
add edx, 20 |
cmp ecx, ebx |
mov esi, eax |
jne .L94 |
.L103: |
cmp esi, 268435456 |
mov eax, esi |
ja .L104 |
mov esi, eax |
shr esi, 12 |
.L93: |
mov DWORD PTR [_mem_amount], eax |
mov [pg_data.mem_amount], eax |
mov [pg_data.pages_count], esi |
|
mov DWORD PTR [esp+8], esi |
mov DWORD PTR [esp+4], eax |
mov DWORD PTR [esp], .LC1 |
call _printf |
|
mov DWORD PTR [esp+8], esi |
mov DWORD PTR [esp+4], 0 |
mov DWORD PTR [esp], _z_core |
|
call _zone_create |
mov DWORD PTR [esp+8], esi |
mov DWORD PTR [esp+4], 0 |
mov DWORD PTR [esp], _z_core |
call _zone_release |
mov eax, DWORD PTR [_pg_balloc] |
mov DWORD PTR [esp+4], 0 |
mov DWORD PTR [esp], _z_core |
shr eax, 12 |
mov DWORD PTR [esp+8], eax |
call _zone_reserve |
add esp, 20 |
pop ebx |
pop esi |
ret |
.L104: |
mov eax, 268435456 |
mov esi, eax |
shr esi, 12 |
jmp .L93 |
.LC1: |
db 'memory size = %x total pages = %x',10,0 |
|
_frame_free: |
push ebx |
mov edx, DWORD PTR [esp+8] |
|
pushf |
pop ebx |
cli |
@@: |
pause |
mov eax, [_z_core] |
test eax, eax |
jnz @b |
inc eax |
xchg [_z_core], eax |
test eax, eax |
jnz @b |
|
mov ecx, _z_core |
shr edx, 12 |
call @zone_free@8 |
mov [_z_core], 0 |
|
push ebx |
popf |
|
pop ebx |
ret |
|
_core_free: |
push ebx |
mov edx, DWORD PTR [esp+8] |
|
pushf |
pop ebx |
cli |
@@: |
pause |
mov eax, [_z_core] |
test eax, eax |
jnz @b |
inc eax |
xchg [_z_core], eax |
test eax, eax |
jnz @b |
|
mov ecx, _z_core |
shr edx, 12 |
call @zone_free@8 |
mov [_z_core], 0 |
|
push ebx |
popf |
|
pop ebx |
ret |
|
_core_alloc: |
push ebx |
pushf |
pop ebx |
cli |
@@: |
pause |
mov eax, [_z_core] |
test eax, eax |
jnz @b |
inc eax |
xchg [_z_core], eax |
test eax, eax |
jnz @b |
|
mov edx, DWORD PTR [esp+8] |
mov eax, _z_core |
call _zone_frame_alloc |
mov [_z_core], 0 |
|
push ebx |
popf |
|
pop ebx |
sal eax, 12 |
ret |
|
|
restore DWORD |
restore WORD |
restore BYTE |
|
restore PTR |
|