diff options
| author | Jon Santmyer <jon@jonsantmyer.com> | 2026-10-16 16:42:22 -0400 |
|---|---|---|
| committer | Jon Santmyer <jon@jonsantmyer.com> | 2026-10-16 16:42:22 -0400 |
| commit | d8aca3ff2501f9a77e22e5afb7a30380aed205af (patch) | |
| tree | a27db1749a35aea07317406f170a2d9b2a799ce7 /boot/limine/modules.c | |
| parent | 548506392b789f58b1556a6ffca917441e1d89fd (diff) | |
| download | jove-kernel-d8aca3ff2501f9a77e22e5afb7a30380aed205af.tar.gz jove-kernel-d8aca3ff2501f9a77e22e5afb7a30380aed205af.tar.bz2 jove-kernel-d8aca3ff2501f9a77e22e5afb7a30380aed205af.zip | |
remove explicit framebuffer in kernel. reduce locking in syscalls
Diffstat (limited to 'boot/limine/modules.c')
| -rw-r--r-- | boot/limine/modules.c | 64 |
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); + } +} |
