lboot now sets up an initial bootboot struct
This commit is contained in:
parent
1ba17d852b
commit
51502e07d4
3 changed files with 73 additions and 9 deletions
|
|
@ -1,3 +1,4 @@
|
||||||
|
ENTRY(_start)
|
||||||
PHDRS {
|
PHDRS {
|
||||||
all PT_LOAD;
|
all PT_LOAD;
|
||||||
}
|
}
|
||||||
|
|
@ -7,6 +8,7 @@ SECTIONS {
|
||||||
*(.text, .rodata*)
|
*(.text, .rodata*)
|
||||||
*(.data)
|
*(.data)
|
||||||
*(.bss, COMMON)
|
*(.bss, COMMON)
|
||||||
|
. = ALIGN(4K);
|
||||||
|
lboot.o(.data.bootboot)
|
||||||
} :all
|
} :all
|
||||||
memmap = ALIGN(8);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
66
lboot.S
66
lboot.S
|
|
@ -165,7 +165,7 @@ _urunreal: pop %es
|
||||||
ret
|
ret
|
||||||
|
|
||||||
// get_map: Retrieve memory map using e820 BIOS function
|
// get_map: Retrieve memory map using e820 BIOS function
|
||||||
get_map: mov $memmap, %di
|
get_map: mov $bb_memmap, %edi
|
||||||
xor %ebx, %ebx
|
xor %ebx, %ebx
|
||||||
mov $0x534D4150, %edx // e820 magic number
|
mov $0x534D4150, %edx // e820 magic number
|
||||||
_gmnext: movl $0, 20(%di)
|
_gmnext: movl $0, 20(%di)
|
||||||
|
|
@ -178,7 +178,8 @@ _gmnext: movl $0, 20(%di)
|
||||||
add $24, %di
|
add $24, %di
|
||||||
jmp _gmnext
|
jmp _gmnext
|
||||||
_gmdone: add $24, %di
|
_gmdone: add $24, %di
|
||||||
mov %di, memmap_end
|
sub $bootboot, %edi
|
||||||
|
mov %edi, bb_size
|
||||||
ret
|
ret
|
||||||
|
|
||||||
// paging: Set up initial page tables for long mode
|
// paging: Set up initial page tables for long mode
|
||||||
|
|
@ -236,9 +237,11 @@ _pgnext: mov %ecx, %eax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
// make_heap: find a memory range suitable for heap usage
|
// make_heap: find a memory range suitable for heap usage
|
||||||
make_heap: mov $memmap-24, %si
|
make_heap: mov $bb_memmap-24, %si
|
||||||
_mhnext: add $24, %si
|
_mhnext: add $24, %si
|
||||||
cmp memmap_end, %si
|
mov $bootboot, %eax
|
||||||
|
add bb_size, %eax
|
||||||
|
cmp %ax, %si
|
||||||
jae _mhdone
|
jae _mhdone
|
||||||
|
|
||||||
cmpl $1, 16(%si)
|
cmpl $1, 16(%si)
|
||||||
|
|
@ -508,7 +511,7 @@ pdp_ptr: .long 0
|
||||||
pml4_ptr: .long 0
|
pml4_ptr: .long 0
|
||||||
|
|
||||||
// Points to the end of the memory map
|
// Points to the end of the memory map
|
||||||
memmap_end: .word 0
|
memmap_end: .short 0
|
||||||
|
|
||||||
tx_buf: .space PACKET_SIZE
|
tx_buf: .space PACKET_SIZE
|
||||||
|
|
||||||
|
|
@ -523,11 +526,62 @@ trampo64:
|
||||||
mov %eax, %gs
|
mov %eax, %gs
|
||||||
mov %eax, %ss
|
mov %eax, %ss
|
||||||
|
|
||||||
mov initrd_ptr, %edi
|
// Mangle e820 memmap into bootboot's format
|
||||||
|
mov $bb_memmap, %rsi
|
||||||
|
mov $bb_memmap, %rdi
|
||||||
|
mov $bootboot, %edx
|
||||||
|
add bb_size, %edx
|
||||||
|
1:
|
||||||
|
mov 0(%rsi), %rax
|
||||||
|
mov 8(%rsi), %rcx
|
||||||
|
mov 16(%rsi), %ebx
|
||||||
|
|
||||||
|
cmp $6, %ebx
|
||||||
|
jb 2f
|
||||||
|
mov $2, %ebx
|
||||||
|
2: mov type_table(%rbx), %bl
|
||||||
|
|
||||||
|
and $-16, %rax
|
||||||
|
or %rbx, %rax
|
||||||
|
|
||||||
|
mov %rax, 0(%rdi)
|
||||||
|
mov %rcx, 8(%rdi)
|
||||||
|
|
||||||
|
add $24, %rsi
|
||||||
|
add $16, %rdi
|
||||||
|
|
||||||
|
cmp %rdx, %rsi
|
||||||
|
jb 1b
|
||||||
|
sub $bootboot, %edi
|
||||||
|
mov %edi, bb_size
|
||||||
|
|
||||||
|
mov $bootboot, %edi
|
||||||
jmp loader_main
|
jmp loader_main
|
||||||
|
|
||||||
|
type_table: .byte 0
|
||||||
|
.byte 1
|
||||||
|
.byte 0
|
||||||
|
.byte 2
|
||||||
|
.byte 2
|
||||||
|
.byte 0
|
||||||
|
|
||||||
// ToDo List:
|
// ToDo List:
|
||||||
// - Sorting the memmap
|
// - Sorting the memmap
|
||||||
// - Sanitizing the memmap
|
// - Sanitizing the memmap
|
||||||
// - Translating the memmap to bootboot format
|
// - Translating the memmap to bootboot format
|
||||||
// - Parsing a config file
|
// - Parsing a config file
|
||||||
|
|
||||||
|
.section .data.bootboot
|
||||||
|
bootboot: .ascii "BOOT"
|
||||||
|
bb_size: .long 128
|
||||||
|
.byte 1
|
||||||
|
.byte 0
|
||||||
|
.short 1
|
||||||
|
.short 0
|
||||||
|
.space 10, 0
|
||||||
|
bb_ird_ptr: .quad 0
|
||||||
|
bb_ird_size:.quad 0
|
||||||
|
.space 24, 0
|
||||||
|
.space 64, 0
|
||||||
|
bb_memmap:
|
||||||
|
.space 4096-128, 0
|
||||||
|
|
|
||||||
12
loader.c
12
loader.c
|
|
@ -185,11 +185,19 @@ load_elf(file_t file, uintptr_t *entry)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
static void *
|
||||||
|
alloc(size_t size, size_t align)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
loader_main(void *initrd)
|
loader_main(BOOTBOOT *bootboot_ptr)
|
||||||
{
|
{
|
||||||
uint64_t entry = 0;
|
uint64_t entry = 0;
|
||||||
file_t elf = { initrd, MEG(2) };
|
file_t elf = { (void *)bootboot_ptr->initrd_ptr, MEG(2) };
|
||||||
if (load_elf(elf, &entry) < 0) {
|
if (load_elf(elf, &entry) < 0) {
|
||||||
panic("panic: Malformed ELF64 executable");
|
panic("panic: Malformed ELF64 executable");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue