devman initial implementation

This commit is contained in:
Matheus
2022-08-07 17:53:31 -03:00
parent 7ec69a219c
commit b2d8e5a166
6 changed files with 122 additions and 14 deletions
+72
View File
@@ -0,0 +1,72 @@
#include <kernel/devman.h>
#include <kernel/vfs.h>
#include <kernel/devfs.h>
#include <stdio.h>
#include <kernel/alloc.h>
#include <sys/sysmacros.h>
#include <arch/panic.h>
#include <sys/stat.h>
static devcalls** majorcalls;
static size_t highestmajor = 0;
int devman_newdevice(char* name, int type, int major, int minor, devcalls* calls){
if(major > highestmajor){
void* addr = realloc(majorcalls, major*sizeof(devcalls*)+1);
if(!addr)
return ENOMEM;
majorcalls = addr;
}
majorcalls[major] = calls;
return devfs_newdevice(name, type, makedev(major, minor), 0777);
}
int devman_write(int *error, int dev, void* buff, size_t count, size_t offset){
if(major(dev) > highestmajor)
return ENODEV;
return majorcalls[major(dev)]->write(error, minor(dev), buff, count, offset);
}
int devman_read(int *error, int dev, void* buff, size_t count, size_t offset){
if(major(dev) > highestmajor)
return ENODEV;
return majorcalls[major(dev)]->read(error, minor(dev), buff, count, offset);
}
void devman_init(){
devfs_init();
size_t err = vfs_mkdir(vfs_root(), "dev", 0777);
if(err && err != EEXIST){
printf("Failed to mkdir /dev: %lu\n", err);
_panic("Devman initialization failed", 0);
}
err = vfs_mount(vfs_root(), NULL, "dev", "devfs", 0, NULL);
if(err){
printf("Failed to mount devfs in /dev: %lu\n", err);
_panic("Devman initialization failed", 0);
}
printf("devfs mounted in /dev\n");
majorcalls = alloc(sizeof(devcalls*));
}
+14
View File
@@ -1,5 +1,6 @@
#include <kernel/alloc.h>
#include <kernel/slab.h>
#include <string.h>
void* alloc(size_t size){
return slab_alloc(size);
@@ -12,3 +13,16 @@ void free(void* addr){
void alloc_init(){
slab_init();
}
void* realloc(void* addr, size_t size){
void* tmp = alloc(size);
if(!tmp)
return NULL;
memcpy(tmp, addr, size);
free(addr);
return tmp;
}