summaryrefslogtreecommitdiffstats
path: root/boot/limine/modules.c
diff options
context:
space:
mode:
Diffstat (limited to 'boot/limine/modules.c')
-rw-r--r--boot/limine/modules.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/boot/limine/modules.c b/boot/limine/modules.c
new file mode 100644
index 0000000..669883e
--- /dev/null
+++ b/boot/limine/modules.c
@@ -0,0 +1,64 @@
+#include "boot/boot.h"
+#include "limine.h"
+#include "hal/obj.h"
+#include "hal/memory.h"
+#include "lib/printf.h"
+#include "lib/string.h"
+#include "proc/init.h"
+#include "panic/panic.h"
+
+static jove_objdir_t s_kmodules_objdir;
+extern struct limine_module_response *_limine_module_resp;
+
+static struct kernel_module s_modules[BOOT_MAX_MODULES];
+
+jove_owned_obj_t*
+boot_getmodule(const char *key) {
+ for(size_t i = 0; i < BOOT_MAX_MODULES; i++) {
+ if(strncmp(s_modules[i].path, key, 128) == 0)
+ return obj_take(s_modules[i].shmem);
+ }
+ errno = ENOTFOUND;
+ return NULL;
+}
+
+void
+mem_setup_modules(void)
+{
+ jove_owned_obj_t *modules_objdir = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_MODULES_I);
+ obj_settype(modules_objdir, JOVE_OBJ_OBJDIR);
+ obj_setvalue(modules_objdir, (uintptr_t)&s_kmodules_objdir);
+ jove_obj_t *modules_objdir_obj = obj_release(modules_objdir);
+
+ if(_limine_module_resp == NULL) {
+ kpanic("Limine failed to provide modules.\n");
+ }
+
+ kprintf("%s: Modules provided by Limine:\n", __func__);
+ for(size_t i = 0; i < _limine_module_resp->module_count; i++) {
+ struct limine_file *module = _limine_module_resp->modules[i];
+ if(i >= BOOT_MAX_MODULES) {
+ klogf("Maximum number of modules exceeded (%i). Some modules will be inaccessable\n", BOOT_MAX_MODULES);
+ return;
+ }
+
+ klogf("%p File %s at %p size %x\n", module, module->path, module->address, module->size);
+
+ physaddr_t module_base = phys_fromvirt((virtaddr_t)module->address);
+ size_t module_pages = (module->size + 0xFFF) / 0x1000;
+ if(module_pages > SHMEMORY_MAX_PAGES) {
+ klogf("Module exceeds length maximum (%i vs %i). Some data will be non-addressable\n",
+ module_pages, SHMEMORY_MAX_PAGES);
+ module_pages = 0xFFF;
+ }
+
+ jove_owned_obj_t *module_shmem = objdir_getlocal(modules_objdir_obj, i);
+ obj_settype(module_shmem, JOVE_OBJ_SHMEMORY);
+ obj_setvalue(module_shmem, module_base | module_pages);
+
+ s_modules[i] = (struct kernel_module) {
+ .shmem = obj_release(module_shmem)
+ };
+ strncpy(128, s_modules[i].path, module->path);
+ }
+}