45,81 → 45,7 |
ret |
endp |
|
align 4 |
proc kernel_alloc stdcall, size:dword |
locals |
lin_addr dd ? |
pages_count dd ? |
endl |
|
push ebx |
push edi |
|
mov eax, [size] |
add eax, 4095 |
and eax, not 4095; |
mov [size], eax |
test eax, eax |
jz .err |
|
mov ebx, eax |
shr ebx, 12 |
mov [pages_count], ebx |
|
stdcall alloc_kernel_space, eax |
test eax, eax |
jz .err |
mov [lin_addr], eax |
|
mov ecx, [pages_count] |
mov edx, eax |
mov ebx, ecx |
|
shr ecx, 3 |
jz .next |
|
and ebx, not 7 |
push ebx |
stdcall _alloc_pages, ebx |
pop ecx ; yes ecx!!! |
test eax, eax |
jz .err |
|
mov edi, eax |
mov edx, [lin_addr] |
@@: |
stdcall map_page,edx,edi,dword PG_SW |
add edx, 0x1000 |
add edi, 0x1000 |
dec ecx |
jnz @B |
.next: |
mov ecx, [pages_count] |
and ecx, 7 |
jz .end |
@@: |
push ecx |
call _alloc_page |
pop ecx |
test eax, eax |
jz .err |
|
stdcall map_page,edx,eax,dword PG_SW |
add edx, 0x1000 |
dec ecx |
jnz @B |
.end: |
mov eax, [lin_addr] |
pop edi |
pop ebx |
ret |
.err: |
xor eax, eax |
pop edi |
pop ebx |
ret |
endp |
|
align 4 |
proc kernel_free stdcall, base:dword |
|