From d26eb8b54969e79d933a8e20f2725343cd42deab Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Tue, 2 Sep 2025 11:35:38 -0400 Subject: move limine to arch-specific directory. untie boot code from non-boot code --- arch/x86_64/boot/limine/limine.c | 81 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 arch/x86_64/boot/limine/limine.c (limited to 'arch/x86_64/boot/limine/limine.c') diff --git a/arch/x86_64/boot/limine/limine.c b/arch/x86_64/boot/limine/limine.c new file mode 100644 index 0000000..4f42491 --- /dev/null +++ b/arch/x86_64/boot/limine/limine.c @@ -0,0 +1,81 @@ +#include "limine.h" +#include "boot.h" +#include "string.h" + +char s_kernel_stack_initial[8192]; + +char *jove_bootargs; +int jove_bootargs_len; + +void *_boot_initrd_base; +size_t _boot_initrd_size; + +uintptr_t _boot_kernel_phys_base; + +struct limine_kernel_file_request s_kernel_file_req = { + .id = LIMINE_KERNEL_FILE_REQUEST +}; + +static struct limine_kernel_address_request s_kaddr_req = { + .id = LIMINE_KERNEL_ADDRESS_REQUEST +}; + +#ifdef ENABLE_INITRD +static struct limine_module_request s_module_request = { + .id = LIMINE_MODULE_REQUEST +}; + +#endif + +static void +e9_putc(char c) +{ + __asm__ volatile("outb %0, %1":: "a"(c), "Nd"(0xe9): "memory"); +} + +static void +e9_puts(char *s) +{ + for(; *s; s++) e9_putc(*s); +} + +void +_start(void) +{ + __asm__ volatile("movq %0, %%rsp":: "r"((uintptr_t)&s_kernel_stack_initial + 8191)); + + struct limine_kernel_file_response *kernel_file_response = s_kernel_file_req.response; + jove_bootargs = kernel_file_response->kernel_file->cmdline; + jove_bootargs_len = strlen(jove_bootargs); + +#ifdef ENABLE_INITRD + struct limine_module_response *initrd_module_response = s_module_request.response; + if(initrd_module_response->module_count == 0) { + e9_puts("Missing kernel modules\n"); + for(;;); + } + + _boot_initrd_base = initrd_module_response->modules[0]->address; + _boot_initrd_size = initrd_module_response->modules[0]->size; +#endif + + _boot_kernel_phys_base = s_kaddr_req.response->physical_base; + + + + //Zero all spaces in bootargs not enclosed with quotes. + for(char *c = jove_bootargs; *c; c++) { + if(*c == '"') { + *c = 0; + for(++c; *c && *c != '"'; c++); + *(c++) = 0; + continue; + } + if(*c == ' ') *c = 0; + } + + extern void _jove_main(void); + + __asm__ volatile("movq $0, %%rbp"::); + _jove_main(); +} -- cgit v1.2.1