Fixed kstdlib.c:vector_push(), added modules.c:dispatch_message()
This commit is contained in:
parent
92b0eb9fcf
commit
402f4f5593
|
|
@ -39,6 +39,7 @@ void sysinit(){
|
|||
vfs_detect_partitions(dir_data[i]);
|
||||
}
|
||||
printf("Bleh\n");
|
||||
//why did i stop working on this? what was wrong with this?
|
||||
for(;;);
|
||||
}
|
||||
extern void kmain(kernel_info_t *kernel_info){
|
||||
|
|
|
|||
|
|
@ -61,17 +61,30 @@ void vector_set(uint32_t pos, vector_t *vector, void *new_element){
|
|||
((uint8_t *)(vector->ptr))[i] = ((uint8_t *)new_element)[i];
|
||||
}
|
||||
}
|
||||
// void vector_push(vector_t *vector, void *new_element){
|
||||
// if((vector->size * vector->sizeof_elements)/4096 > ((vector->size + 1) * vector->sizeof_elements)/4096){
|
||||
// vector->size++;
|
||||
// void *newptr = kmalloc((vector->size * vector->sizeof_elements)/4096);
|
||||
// for(uint8_t i = 0; i < (vector->size - 1) * vector->sizeof_elements; i++){
|
||||
// ((uint8_t *)(newptr))[i] = ((uint8_t *)vector->ptr)[i * vector->size];
|
||||
// }
|
||||
// }
|
||||
// for(uint32_t i = 0; i < vector->sizeof_elements; i++){
|
||||
// ((uint8_t *)(vector->ptr))[vector->size + i] = ((uint8_t *)new_element)[vector->size + i];
|
||||
// }
|
||||
// printf(" (vector push ) %d", vector->size);
|
||||
// }
|
||||
void vector_push(vector_t *vector, void *new_element){
|
||||
if((vector->size * vector->sizeof_elements)/4096 + 1> ((vector->size + 1) * vector->sizeof_elements)/4096 + 1){
|
||||
vector->size++;
|
||||
if(((vector->size + 1) * vector->sizeof_elements) >> 12 != (vector->size * vector->sizeof_elements)){
|
||||
void *newptr = kmalloc((vector->size * vector->sizeof_elements)/4096);
|
||||
for(uint8_t i = 0; i < (vector->size - 1) * vector->sizeof_elements; i++){
|
||||
((uint8_t *)(newptr))[i] = ((uint8_t *)vector->ptr)[i * vector->size];
|
||||
}
|
||||
}
|
||||
for(uint32_t i = 0; i < vector->sizeof_elements; i++){
|
||||
((uint8_t *)(vector->ptr))[vector->size + i] = ((uint8_t *)new_element)[vector->size + i];
|
||||
((uint8_t *)(vector->ptr))[vector->size + i] = ((uint8_t *)new_element)[i];
|
||||
}
|
||||
vector->size++;
|
||||
}
|
||||
void vector_pop(uint32_t pos, vector_t *vector, void *element){
|
||||
for(uint32_t i = 0; i < vector->sizeof_elements; i++){
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ typedef struct vector{
|
|||
void *ptr;
|
||||
uint32_t size;
|
||||
uint32_t sizeof_elements;
|
||||
uint32_t pages;
|
||||
}vector_t;
|
||||
|
||||
vector_t *init_vector(void *vecptr, uint32_t sizeof_elements, uint32_t elements, void *initializer);
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ void initrc_read(vfile_t *file){
|
|||
}
|
||||
if(!strcmp(statement, "ECHO")){
|
||||
//this is purely for testing purposes.
|
||||
printf("[ INITRC ]");
|
||||
i++;
|
||||
while(ptr[i] != '\n' && ptr[i]){
|
||||
if(ptr[i] != '\"'){
|
||||
|
|
|
|||
|
|
@ -21,14 +21,15 @@ uint32_t module_api(uint32_t func, ...){
|
|||
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;
|
||||
vector_push(modules, structure);
|
||||
pm_free(tmp);
|
||||
return_value = 0;
|
||||
printf("vector size -> %d", structure->key);
|
||||
break;
|
||||
case MODULE_API_ADDINT:
|
||||
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 *);
|
||||
|
|
@ -124,16 +125,19 @@ uint32_t module_api(uint32_t func, ...){
|
|||
uint32_t size = va_arg(vars, uint32_t);
|
||||
return_value = (uint32_t)kmalloc_page_paddr((uint32_t)paddr, size);
|
||||
break;
|
||||
case MODULE_ADD_FS_HANDLER:
|
||||
void *handler = va_arg(vars, void (*)(void *, uint32_t, ...));
|
||||
case MODULE_MESSAGE_HANDLER:
|
||||
key = va_arg(vars, uint32_t);
|
||||
vfs_add_mount_handler(handler, key);
|
||||
void *handler = va_arg(vars, void (*)());
|
||||
for(int i = 0; i < modules->size; i++){
|
||||
module_t* module = ((module_t *)vector_get(i, modules));
|
||||
if(module->key == key){
|
||||
module->message_handler = handler;
|
||||
return_value = 0;
|
||||
break;
|
||||
}
|
||||
return_value = -1;
|
||||
}
|
||||
break;
|
||||
case MODULE_DEL_FS_HANDLER:
|
||||
key = va_arg(vars, uint32_t);
|
||||
vfs_del_mount_handler(key);
|
||||
break;
|
||||
|
||||
}
|
||||
va_end(vars);
|
||||
return return_value;
|
||||
|
|
|
|||
|
|
@ -31,8 +31,7 @@ enum MODULE_API_FUNCS{
|
|||
MODULE_API_FREE, //free memory allocated by malloc
|
||||
MODULE_API_PMALLOC64K,
|
||||
MODULE_API_KMALLOC_PADDR,
|
||||
MODULE_ADD_FS_HANDLER,
|
||||
MODULE_DEL_FS_HANDLER,
|
||||
MODULE_MESSAGE_HANDLER,
|
||||
};
|
||||
|
||||
typedef struct module{
|
||||
|
|
@ -42,6 +41,7 @@ typedef struct module{
|
|||
uint8_t flags;
|
||||
uint16_t interrupts;
|
||||
uint32_t key;
|
||||
void (*message_handler)(uint32_t message, ...);
|
||||
void (*fini)(void);
|
||||
}module_t;
|
||||
|
||||
|
|
|
|||
|
|
@ -69,25 +69,25 @@ void vfs_detect_partitions(vfile_t *file){
|
|||
return;
|
||||
}
|
||||
|
||||
void vfs_add_mount_handler(int (*mount_handler)(vfile_t *device, MOUNT_OPERATION op, ...), uint32_t key){
|
||||
if(mount_handler == 0){
|
||||
return;
|
||||
}
|
||||
for(uint32_t i = 0; i < 32; i++){
|
||||
if(mount_handlers[i].callback == 0){
|
||||
mount_handlers[i].callback = mount_handler;
|
||||
mount_handlers[i].key = key;
|
||||
}
|
||||
}
|
||||
}
|
||||
void vfs_del_mount_handler(uint32_t key){
|
||||
for(uint32_t i = 0; i < 32; i++){
|
||||
if(mount_handlers[i].key == key){
|
||||
mount_handlers[i].callback = 0;
|
||||
mount_handlers[i].key = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
// void vfs_add_mount_handler(int (*mount_handler)(vfile_t *device, MOUNT_OPERATION op, ...), uint32_t key){
|
||||
// if(mount_handler == 0){
|
||||
// return;
|
||||
// }
|
||||
// for(uint32_t i = 0; i < 32; i++){
|
||||
// if(mount_handlers[i].callback == 0){
|
||||
// mount_handlers[i].callback = mount_handler;
|
||||
// mount_handlers[i].key = key;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// void vfs_del_mount_handler(uint32_t key){
|
||||
// for(uint32_t i = 0; i < 32; i++){
|
||||
// if(mount_handlers[i].key == key){
|
||||
// mount_handlers[i].callback = 0;
|
||||
// mount_handlers[i].key = 0;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
void vfs_init(){
|
||||
mlog(MODULE_NAME, "Initializing VFS\n", MLOG_PRINT);
|
||||
|
|
|
|||
|
|
@ -82,6 +82,6 @@ int fwrite(vfile_t *file_entry, void *byte_array, uint32_t offset, uint32_t coun
|
|||
int fread(vfile_t *file_entry, void *byte_array, uint32_t offset, uint32_t count);
|
||||
vfile_t *search_dir(char *name, vfile_t dir);
|
||||
vfile_t *fopen(char *name);
|
||||
void vfs_del_mount_handler(uint32_t key);
|
||||
void vfs_add_mount_handler(int (*mount_handler)(vfile_t *device, MOUNT_OPERATION op, ...), uint32_t key);
|
||||
// void vfs_del_mount_handler(uint32_t key);
|
||||
// void vfs_add_mount_handler(int (*mount_handler)(vfile_t *device, MOUNT_OPERATION op, ...), uint32_t key);
|
||||
void vfs_detect_partitions(vfile_t *file);
|
||||
|
|
@ -21,8 +21,7 @@ enum MODULE_API_FUNCS{
|
|||
MODULE_API_FREE, //free memory allocated by malloc
|
||||
MODULE_API_PMALLOC64K,
|
||||
MODULE_API_KMALLOC_PADDR,
|
||||
MODULE_ADD_FS_HANDLER,
|
||||
MODULE_DEL_FS_HANDLER,
|
||||
MODULE_MESSAGE_HANDLER
|
||||
};
|
||||
|
||||
typedef uint32_t (*KOS_MAPI_FP)(unsigned int function, ...);
|
||||
|
|
@ -33,6 +32,7 @@ typedef struct module{
|
|||
uint8_t flags;
|
||||
uint16_t interrupts;
|
||||
uint32_t key;
|
||||
void (*message_handler)(uint32_t message, ...);
|
||||
void (*fini)(void);
|
||||
}module_t;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue