From 43a0d9017c380bf3320ae5cb2d62a792422b0736 Mon Sep 17 00:00:00 2001 From: Thomas Oltmann Date: Tue, 8 Jul 2025 17:22:00 +0200 Subject: [PATCH] We have liftoff! --- Makefile | 2 +- lboot.S | 13 ++++++++++++- loader.c | 24 +++++++++++++++++++----- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index e689cd0..edd51a3 100644 --- a/Makefile +++ b/Makefile @@ -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) diff --git a/lboot.S b/lboot.S index 1759edf..5bc8a75 100644 --- a/lboot.S +++ b/lboot.S @@ -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 diff --git a/loader.c b/loader.c index 47a4771..f9479e3 100644 --- a/loader.c +++ b/loader.c @@ -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__ (