27 while (curr_module !=
NULL) {
32 curr_module = curr_module->next;
43 LOG_INFO(
"VOXMO",
"module %s already loaded",
50 LOG_INFO(
"VOXMO",
"loaded size %d (%d kb)", loaded_size,
81 LOG_INFO(
"VOXMO",
"voxmo load external symbol count %d",
82 voxmo_load_syms.
size);
83 for (
size_t i = 0; i < voxmo_load_syms.
size; i++) {
84 LOG_INFO(
"VOXMO",
"external symbol [%d] name %s, item count %d",
95 LOG_INFO(
"VOXMO",
"dynamic section found at 0x%x", dyn);
108 &voxmo_load_syms, mmap_table, ehdr.
e_phnum);
115 LOG_INFO(
"VOXMO",
"load : 0x%x", load_addr);
124 LOG2_ERROR(
"VOXMO",
"load symbol not found in module %s",
125 module->name->c_str);
135 for (
size_t i = 0; i < module->dependency_count; i++) {
141 "dependency module %s not found, "
142 "aborting load of %s",
143 module->dependency[i]->c_str,
144 module->name->c_str);
145 kfree2(dependency_workqueue);
150 if (!dep_module->loaded || !dep_module->queue) {
152 "dependency %s not ready (loaded=%d, "
153 "queue=0x%x), aborting load of %s",
154 dep_module->name->c_str, dep_module->loaded,
155 dep_module->queue, module->name->c_str);
156 kfree2(dependency_workqueue);
162 LOG_INFO(
"VOXMO",
"dependency %s added to queue 0x%x",
163 dep_module->name->c_str, dep_module->queue);
166 LOG_INFO(
"VOXMO",
"dependency workqueue size %d",
167 dependency_workqueue->size);
169 void (*load_fn)(
void*) = (
void (*)(
void*))(
void*)load_addr;
171 module->queue = queue;
172 module->loaded = true;
174 LOG_INFO(
"VOXMO",
"module %s task created, queue=0x%x",
175 module->name->c_str, module->queue);
186 LOG_INFO(
"VOXMO",
"installing module from %s",
187 full_path_with_ext->
c_str);
199 LOG_INFO(
"VOXMO",
"allocated at 0x%x for size %d kb",
data,
215 memset(module, 0,
sizeof(*module));
216 module->next = nullptr;
217 module->lock = (spinlock_t){0};
222 module->name = str(module_name);
225 module->path = full_path_with_ext;
226 module->loaded = false;
227 module->queue = nullptr;
237 module->capability_count = cap_count;
238 module->capability = (kstring*)kalloc(sizeof(kstring) * cap_count);
240 for (
uint16_t i = 0; i < cap_count; i++) {
243 LOG_INFO(
"VOXMO",
"capability name %s", cap_name);
244 module->capability[i] = str(cap_name);
247 module->dependency_count = header->dependency.count;
249 (kstring*)kalloc(sizeof(kstring) * module->dependency_count);
252 LOG_INFO(
"VOXMO",
"dependency count %d", dep_count);
256 for (
uint16_t i = 0; i < dep_count; i++) {
259 LOG_INFO(
"VOXMO",
"dependency name %s", dep_name);
260 module->dependency[i] = str(dep_name);
271 LOG_INFO(
"VOXMO",
"file name %s", file_name);
272 LOG_INFO(
"VOXMO",
"main file found at offset 0x%x, size %d",
275 if (
strncmp(file_name, main_file,
header->main_file.length) ==
278 LOG_INFO(
"VOXMO",
"main data buffer allocated at 0x%x",
283 module->main_data = (uintptr_t)main_data;
294 kfree(module,
sizeof(voxmo_loaded_module_t));
304 while (curr_module->next !=
nullptr) {
305 curr_module = curr_module->next;
307 curr_module->next =
module;
312 LOG_INFO(
"VOXMO",
"module %s installed", module->name->c_str);
327 if (module->loaded) {
328 LOG_INFO(
"VOXMO",
"module %s already loaded",
name->c_str);
332 if (module->dependency_count) {
333 for (
size_t i = 0; i < module->dependency_count; i++) {
335 module->dependency[i]->c_str);
341 LOG_INFO(
"VOXMO",
"module %s loaded", module->name->c_str);
349 while (m !=
nullptr) {
351 LOG_INFO(
"VOXMO",
"load module %s", m->name->c_str);
359 LOG_INFO(
"VOXMO",
"all module reloaded");
struct dentry * dentry_ptr
void dentry_put(dentry_ptr dentry)
int resolve_dentry(char *path, dentry_ptr parent, dentry_ptr *out, uint8_t flag)
Resolves a path to a directory entry (dentry) with configurable start point and strictness.
void elf_section_map_all(uint8_t *data, elf_section_map *map)
size_t elf_load(volatile uintptr_t *page, uint8_t *data, uintptr_t temporary_base, uintptr_t base, struct elf_load_mmap_table *table)
uintptr_t elf_find_symbol(const char *name, GnuHashHeader *gnuhash, uintptr_t base, elf_section_map *map, uint8_t *data)
void elf_gnu_hash_parse(GnuHashHeader *gnu_hash, Elf64_Shdr *gnu_hash_sym, uint8_t *data)
void elf_call_init_array(elf_section_map *map, uintptr_t base)
void elf_dyn_map_all(Elf64_Dyn *dyn, uint8_t *data, elf_dynamic_map *map)
Elf64_Dyn * elf_get_phdr_dynamic(uint8_t *data)
void elf_relocate_dyn(elf_dynamic_map *map, uintptr_t kernel_base, uintptr_t user_base, GnuHashHeader *gnu_hash, symbols_ptr_vector_t *external_syms, struct elf_load_mmap_table *table, int table_count)
uintptr_t elf_count_load_size(uint8_t *data)
void kfree(void *ptr, size_t size)
void * kalloc(size_t size)
symbols_ptr kernel_get_symbols()
#define ALIGN_UP(x, align)
page_t paging_get_highest_page_map(void)
#define LOG2_ERROR(mod, fmt,...)
#define LOG_INFO(mod, fmt,...)
void spin_acquire(spinlock_t *lock)
void spin_release(spinlock_t *lock)
int strncmp(const char *s1, const char *s2, size_t n)
void memset(void *ptr, int value, size_t num)
void memcopy(void *dest, void *src, size_t size)
boolean_t stringcmp(kstring s1, kstring s2)
void str_release(kstring str)
void str_trim(kstring str)
kstring str_concat(kstring s, const char *suffix)
kstring str(const char *str)
struct vector_uint64_t needed
struct vector_symbols_item items
struct vector_symbols_ptr symbols_ptr_vector_t
#define vector_push_back(v, val)
uintptr_t vma_lookup_free_vaddr(struct virtual_memory_page *page, mem_vma_region region, size_t size)
struct virtual_memory_page * get_kernel_vmm_page()
static void vxVoxmoProbe(kstring name)
static void proccess_elf(voxmo_loaded_module_t_ptr module)
static voxmo_loaded_module_t_ptr voxmo_modules
void vxVoxmoInstall(const char *path)
static kstring default_voxmo_path
void vxSetDefaultVoxmoPath(const char *path)
static voxmo_loaded_module_t_ptr vxGetVoxmoModule(kstring name)
static spinlock_t voxmo_list_lock
voxmo_loaded_module_t * voxmo_loaded_module_t_ptr
workqueue_t * vxAddWorkqueueTask(void(*task)(void *), void *arg, struct vector_workqueue_ptr_t *dependency)
struct workqueue * workqueue_ptr_t