diff options
author | Jon Santmyer <jon@jonsantmyer.com> | 2025-09-02 11:35:38 -0400 |
---|---|---|
committer | Jon Santmyer <jon@jonsantmyer.com> | 2025-09-02 11:35:38 -0400 |
commit | d26eb8b54969e79d933a8e20f2725343cd42deab (patch) | |
tree | 9b6aaf6e84ed965d146c129028e32e00ef846adc /arch/x86_64/boot/limine/limine.c | |
parent | 8f0ba2fd31408d04175513b8826bf9418ad8b087 (diff) | |
download | jove-kernel-d26eb8b54969e79d933a8e20f2725343cd42deab.tar.gz jove-kernel-d26eb8b54969e79d933a8e20f2725343cd42deab.tar.bz2 jove-kernel-d26eb8b54969e79d933a8e20f2725343cd42deab.zip |
move limine to arch-specific directory.
untie boot code from non-boot code
Diffstat (limited to 'arch/x86_64/boot/limine/limine.c')
-rw-r--r-- | arch/x86_64/boot/limine/limine.c | 81 |
1 files changed, 81 insertions, 0 deletions
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(); +} |