From d1ff7bcc91886626dc9060ec5fb67ee102ab7c1d Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Mon, 11 Mar 2024 21:30:31 -0400 Subject: usermode capable kernel with logging syscall --- boot/limine/limine.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 boot/limine/limine.c (limited to 'boot/limine/limine.c') diff --git a/boot/limine/limine.c b/boot/limine/limine.c new file mode 100644 index 0000000..7cc50d0 --- /dev/null +++ b/boot/limine/limine.c @@ -0,0 +1,89 @@ +#include "limine.h" +#include "boot/boot.h" + +static char s_kernel_stack[KERNEL_INITIAL_STACK_WIDTH]; + +struct MemoryMap boot_memorymap; + +struct BootModule boot_modules[BOOT_MODULE_MAX_ENTRIES]; +struct BootModule boot_kernel_file; +size_t boot_module_count = 0; + +uintptr_t boot_kernel_physical_address; +void *boot_kernel_initial_stack_base = &s_kernel_stack; +const char *boot_kernel_cmdline = NULL; + +struct limine_memmap_request s_mmap_request = { + .id = LIMINE_MEMMAP_REQUEST +}; +struct limine_kernel_address_request s_kaddr_request = { + .id = LIMINE_KERNEL_ADDRESS_REQUEST +}; +struct limine_kernel_file_request s_kfile_request = { + .id = LIMINE_KERNEL_FILE_REQUEST +}; +struct limine_module_request s_module_request = { + .id = LIMINE_MODULE_REQUEST +}; + +static void +s_load_memorymap(void) +{ + struct limine_memmap_response *response = s_mmap_request.response; + if(response == NULL) return; + boot_memorymap.count = response->entry_count; + for(size_t i = 0; i < response->entry_count; i++) { + struct limine_memmap_entry *e = response->entries[i]; + struct MemoryMapEntry *bme = &boot_memorymap.entries[i]; + + bme->base = e->base; + bme->length = e->length; + bme->usable = e->type == LIMINE_MEMMAP_USABLE || + e->type == LIMINE_MEMMAP_ACPI_RECLAIMABLE || + e->type == LIMINE_MEMMAP_BOOTLOADER_RECLAIMABLE; + } +} + +static void +s_load_modules(void) +{ + struct limine_module_response *response = s_module_request.response; + if(response->module_count > 4) response->module_count = 4; + boot_module_count = response->module_count; + for(size_t i = 0; i < response->module_count; i++) { + boot_modules[i] = (struct BootModule){ + .path = response->modules[i]->path, + .cmdline = response->modules[i]->cmdline, + .size = response->modules[i]->size, + .addr = (uintptr_t)response->modules[i]->address + }; + } +} + +static void +s_load_kernel_file(void) +{ + struct limine_kernel_file_response *response = s_kfile_request.response; + boot_kernel_file = (struct BootModule) { + .path = response->kernel_file->path, + .cmdline = response->kernel_file->cmdline, + .size = response->kernel_file->size, + .addr = (uintptr_t)response->kernel_file->address + }; + boot_kernel_cmdline = response->kernel_file->cmdline; +} + +void _start(void) +{ + boot_kernel_physical_address = s_kaddr_request.response->physical_base; + s_load_memorymap(); + + s_load_kernel_file(); + s_load_modules(); + + char *kernel_stack_entry = s_kernel_stack + (KERNEL_INITIAL_STACK_WIDTH - 1); + __asm__ volatile("movq %0, %%rsp":: "r"(kernel_stack_entry)); + + extern void kernel_main(void); + kernel_main(); +} -- cgit v1.2.1