We have liftoff!

This commit is contained in:
Thomas Oltmann 2025-07-08 17:22:00 +02:00
parent 5fab4ba6c3
commit 43a0d9017c
3 changed files with 32 additions and 7 deletions

View file

@ -20,4 +20,4 @@ lboot.o: lboot.S
$(CC) $(CFLAGS) -c -o $@ $(@:.o=.S)
loader.o: loader.c bootboot.h fs.h
$(CC) $(CFLAGS) -m64 -Os -c -o $@ $(@:.o=.c)
$(CC) $(CFLAGS) -m64 -O0 -c -o $@ $(@:.o=.c)

13
lboot.S
View file

@ -237,7 +237,7 @@ _pgnext: mov %ecx, %eax
ret
// make_heap: find a memory range suitable for heap usage
make_heap: mov $bb_memmap-24, %si
make_heap: mov $bb_memmap-24, %esi
_mhnext: add $24, %si
mov $bootboot, %eax
add bb_size, %eax
@ -282,6 +282,7 @@ _mhnext: add $24, %si
// If so, switch to it.
mov %eax, heap_ptr
mov %ecx, heap_end
mov %esi, heap_mment
jmp _mhnext
_mhdone: ret
@ -502,6 +503,7 @@ server_ip: .space 4
heap_ptr: .long 0
heap_end: .long 0
heap_mment: .long tx_buf
// Long mode initial page tables
pd_ptr: .long 0
@ -524,6 +526,15 @@ trampo64:
mov %eax, %gs
mov %eax, %ss
// Remove our heap from the memory map so it doesn't get overwritten
mov heap_mment, %esi
mov 8(%rsi), %rcx
add 0(%rsi), %rcx
mov heap_ptr, %eax
sub %rax, %rcx
mov %rax, 0(%rsi)
mov %rcx, 8(%rsi)
// Mangle e820 memmap into bootboot's format
mov $bb_memmap, %rsi
mov $bb_memmap, %rdi

View file

@ -172,10 +172,9 @@ load_elf(file_t file, uintptr_t *entry)
if (file.size < phdr->p_offset + phdr->p_filesz) {
return -1;
}
panic("Loading segment");
memcpy((void *)ADDR_LOAD, file.ptr + phdr->p_offset, phdr->p_filesz);
memcpy((void *)phdr->p_vaddr, file.ptr + phdr->p_offset, phdr->p_filesz);
if (phdr->p_filesz < phdr->p_memsz) {
memset((void *)(ADDR_LOAD + phdr->p_filesz), 0, phdr->p_memsz - phdr->p_filesz);
memset((void *)(phdr->p_vaddr + phdr->p_filesz), 0, phdr->p_memsz - phdr->p_filesz);
}
}
}
@ -207,14 +206,29 @@ alloc(BOOTBOOT *bootboot_ptr, size_t size, size_t align)
void
loader_main(BOOTBOOT *bootboot_ptr)
{
void *backing = alloc(bootboot_ptr, MEG(2), MEG(2));
memset(backing, 0xAE, MEG(2));
uint64_t *pd = alloc(bootboot_ptr, PAGES(1), PAGES(1));
memset(pd, 0, PAGES(1));
uint64_t *pdp = alloc(bootboot_ptr, PAGES(1), PAGES(1));
memset(pdp, 0, PAGES(1));
uint64_t cr3;
__asm__ ("mov\t%%cr3, %%rax" : "=a"(cr3));
uint64_t *pml4 = (uint64_t *)(cr3 & UINT64_C(-0x1000));
pml4[0x1FF] = (uint64_t)pdp | 0x3;
pdp [0x1FF] = (uint64_t)pd | 0x3;
pd [0x1FF] = (uint64_t)backing | 0x3 | 0x180;
memcpy((void *)ADDR_BOOTBOOT, bootboot_ptr, PAGES(1));
uint64_t entry = 0;
file_t elf = { (void *)bootboot_ptr->initrd_ptr, MEG(2) };
if (load_elf(elf, &entry) < 0) {
panic("panic: Malformed ELF64 executable");
}
alloc(bootboot_ptr, PAGES(1), PAGES(1));
uint64_t stack = 0;
__asm__ __volatile__ (