Scanning for useful mem for heap
This commit is contained in:
parent
77d791f177
commit
50d9e63041
1 changed files with 53 additions and 0 deletions
53
lboot.S
53
lboot.S
|
|
@ -29,6 +29,10 @@ _start: cli
|
||||||
call print
|
call print
|
||||||
call getmap
|
call getmap
|
||||||
|
|
||||||
|
mov $msg_mkheap, %si
|
||||||
|
call print
|
||||||
|
call makeheap
|
||||||
|
|
||||||
mov $msg_paging, %si
|
mov $msg_paging, %si
|
||||||
call print
|
call print
|
||||||
call paging
|
call paging
|
||||||
|
|
@ -130,6 +134,51 @@ _pgnext: mov %ecx, %eax
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
// makeheap: find a memory range suitable for heap usage
|
||||||
|
makeheap: mov $memmap-24, %si
|
||||||
|
_mhnext: add $24, %si
|
||||||
|
cmp memmap_end, %si
|
||||||
|
jae _mhdone
|
||||||
|
|
||||||
|
cmpl $1, 16(%si)
|
||||||
|
jne _mhnext
|
||||||
|
|
||||||
|
cmpl $0, 4(%si)
|
||||||
|
ja _mhnext
|
||||||
|
|
||||||
|
mov 0(%si), %ebx
|
||||||
|
mov 8(%si), %ecx
|
||||||
|
|
||||||
|
// find end of range, clip to 4Gb
|
||||||
|
add %ebx, %ecx
|
||||||
|
jnc 1f
|
||||||
|
mov $0xFFFFFFFF, %ecx
|
||||||
|
|
||||||
|
// handle wraparound if length > 4Gb
|
||||||
|
1: cmpl $0, 12(%si)
|
||||||
|
je 1f
|
||||||
|
mov $0xFFFFFFFF, %ecx
|
||||||
|
|
||||||
|
// adjust base to above 1Mb, above the bootloader
|
||||||
|
1: cmp $0x10000, %ebx
|
||||||
|
jae 1f
|
||||||
|
mov $0x10000, %ebx
|
||||||
|
|
||||||
|
// align to 4Kb boundaries
|
||||||
|
1: add $0xFFF, %ebx
|
||||||
|
and $0xFFFFF000, %ebx
|
||||||
|
and $0xFFFFF000, %ecx
|
||||||
|
|
||||||
|
sub %ebx, %ecx
|
||||||
|
cmp heap_size, %ecx
|
||||||
|
jbe _mhnext
|
||||||
|
|
||||||
|
mov %ebx, heap_start
|
||||||
|
mov %ecx, heap_size
|
||||||
|
jmp _mhnext
|
||||||
|
|
||||||
|
_mhdone: ret
|
||||||
|
|
||||||
// alloc: take ECX bytes from usable space in memmap
|
// alloc: take ECX bytes from usable space in memmap
|
||||||
// No realignment is performed, so only alloc aligned sizes.
|
// No realignment is performed, so only alloc aligned sizes.
|
||||||
alloc: mov $memmap-24, %si
|
alloc: mov $memmap-24, %si
|
||||||
|
|
@ -203,10 +252,14 @@ msg_start: .asciz "Netboot via fernlader v1 ...\r\n"
|
||||||
msg_a20: .asciz " * Enabling A20\r\n"
|
msg_a20: .asciz " * Enabling A20\r\n"
|
||||||
msg_unreal: .asciz " * Unreal Mode\r\n"
|
msg_unreal: .asciz " * Unreal Mode\r\n"
|
||||||
msg_getmap: .asciz " * Memory Map\r\n"
|
msg_getmap: .asciz " * Memory Map\r\n"
|
||||||
|
msg_mkheap: .asciz " * Making Space\r\n"
|
||||||
msg_paging: .asciz " * Paging\r\n"
|
msg_paging: .asciz " * Paging\r\n"
|
||||||
msg_fin: .asciz "Finished.\r\n"
|
msg_fin: .asciz "Finished.\r\n"
|
||||||
msg_aerr: .asciz "panic: Unable to allocate memory.\r\n"
|
msg_aerr: .asciz "panic: Unable to allocate memory.\r\n"
|
||||||
|
|
||||||
|
heap_start: .long 0
|
||||||
|
heap_size: .long 0
|
||||||
|
|
||||||
// Long mode initial page tables
|
// Long mode initial page tables
|
||||||
pd_ptr: .long 0
|
pd_ptr: .long 0
|
||||||
pdp_ptr: .long 0
|
pdp_ptr: .long 0
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue