#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(); }