summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/boot/limine/limine.c
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2025-09-02 11:35:38 -0400
committerJon Santmyer <jon@jonsantmyer.com>2025-09-02 11:35:38 -0400
commitd26eb8b54969e79d933a8e20f2725343cd42deab (patch)
tree9b6aaf6e84ed965d146c129028e32e00ef846adc /arch/x86_64/boot/limine/limine.c
parent8f0ba2fd31408d04175513b8826bf9418ad8b087 (diff)
downloadjove-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.c81
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();
+}