KimisOS/src/kernel/system/modules.c

155 lines
5.5 KiB
C

#include "modules.h"
#include "../shared/kstdlib.h"
#include "elf.h"
#include "vfs.h"
#include "../shared/memory.h"
#include <stdarg.h>
#define MODULE_NAME "MLOADER"
vector_t *modules;
vector_t *module_deps;
uint32_t module_api(uint32_t func, ...){
va_list vars;
va_start(vars, func);
uint32_t return_value = 0;
switch(func){
case MODULE_API_REGISTER:
//do something
module_t *structure = va_arg(vars, void *);
if(structure == 0){
return_value = -1;
}
vector_push(modules, structure);
uint32_t tmp = pm_alloc();
(structure->key) = (modules->size ^ 190507) + tmp << 12 ^ 4405648937 ^ 8592807313 >> 5;
structure->key & 0xffffff00 | modules->size;
pm_free(tmp);
return_value = 0;
break;
case MODULE_API_ADDINT:
uint32_t int_index = va_arg(vars, uint32_t);
uint32_t key = va_arg(vars, uint32_t);
void *interrupt_handler = va_arg(vars, void *);
if(int_index >= 16 || int_index < 0 /* || get_irq_handler(int_index)*/){
return_value = -1;
break;
}
// printf("installed %d", int_index);
install_irq_handler(interrupt_handler, int_index);
module_t *tmpmodule = vector_get(key & 0xff, modules);
tmpmodule->interrupts |= 1 << int_index;
return_value = 0;
// printf("Added key\n");
break;
case MODULE_API_DELINT:
int_index = va_arg(vars, uint32_t);
key = va_arg(vars, uint32_t);
tmpmodule = vector_get(key & 0xff, modules);
if(key == tmpmodule->key){
install_irq_handler(0, int_index);
tmpmodule->interrupts &= ~(1 << int_index);
}
else{
return_value = -1;
break;
}
return_value = 0;
break;
case MODULE_API_PRINT:
// vmlog(MODULE_NAME, "Testing modules calling kernel functions\n", MLOG_PRINT, vars);
char *name = va_arg(vars, char *);
char *string = va_arg(vars, char *);
vmlog(name, string, MLOG_PRINT, vars);
break;
case MODULE_API_READ:
vfile_t *file = va_arg(vars, vfile_t *);
char *buffer = va_arg(vars, char *);
uint32_t offset = va_arg(vars, uint32_t), count = va_arg(vars, uint32_t);
return_value = fread(file, buffer, offset, count);
break;
case MODULE_API_WRITE:
file = va_arg(vars, vfile_t *);
buffer = va_arg(vars, char *);
offset = va_arg(vars, uint32_t), count = va_arg(vars, uint32_t);
return_value = fwrite(file, buffer, offset, count);
break;
case MODULE_API_CREAT:
name = va_arg(vars, char *);
VFILE_TYPE ftype = va_arg(vars, VFILE_TYPE);
void *arg1, *arg2;
arg1 = va_arg(vars, void *);
arg2 = va_arg(vars, void *);
return_value = (uint32_t)fcreate(name, ftype, arg1, arg2);
break;
case MODULE_API_DELET:
return_value = -1;
break;
case MODULE_API_OPEN:
name = va_arg(vars, char *);
return_value = (uint32_t)fopen(name);
break;
case MODULE_API_MAP:
return_value = 0;
void *vaddr = va_arg(vars, void *);
void *paddr = va_arg(vars, void *);
uint32_t flags = va_arg(vars, uint32_t);
map(vaddr, paddr, flags);
break;
case MODULE_API_UNMAP:
vaddr = va_arg(vars, void *);
unmap(vaddr);
break;
case MODULE_API_PADDR:
void *addr = va_arg(vars, void *);
return_value = get_paddr(addr);
break;
case MODULE_API_MALLOC:
uint32_t sz_pgs = va_arg(vars, uint32_t);
return_value = (uint32_t)kmalloc(sz_pgs);
break;
case MODULE_API_FREE:
void *ptr = va_arg(vars, void *);
kfree(ptr);
return_value = 0;
break;
case MODULE_API_PMALLOC64K:
return_value = pm_alloc_64kaligned();
break;
case MODULE_API_KMALLOC_PADDR:
paddr = (void *)va_arg(vars, uint32_t);
uint32_t size = va_arg(vars, uint32_t);
return_value = (uint32_t)kmalloc_page_paddr((uint32_t)paddr, size);
break;
}
va_end(vars);
return return_value;
}
void module_start(void *ptr){
void (*entry)(void* api, uint32_t version) = load_elf(ptr, PT_SYS);
(*entry)(module_api, 0);
}
void modules_init(){
mlog(MODULE_NAME, "Initializing Boot-Time Modules\n", MLOG_PRINT);
// kernel_module_t *module = kernel_info->loaded_modules;
// uint32_t i = 0;
modules = init_vector(0, sizeof(module_t), 0, 0);
// while(module){
// if(!module->ptr){
// continue;
// }
// if(module->flags & MODULE_INITRC){
// fcreate("initrc", VFILE_POINTER, module->ptr, 1);
// continue;
// }
// void (*entry)(void* api, uint32_t version) = load_elf(module->ptr, PT_SYS);
// mlog(MODULE_NAME, "Loaded module with ID %x\n", MLOG_PRINT, module->id);
// // module->type |= 0x8000;//set present flag in type
// module->flags |= MODULE_PRESENT;
// module = module->link;
// (*entry)(module_api, 0);
// }
}