diff options
author | Marvin Borner | 2020-05-01 20:50:49 +0200 |
---|---|---|
committer | Marvin Borner | 2020-05-01 20:50:49 +0200 |
commit | 21106945c4a28d45334824c02f8b139d1db91c45 (patch) | |
tree | f215128167a17fa476ad32350c2b81fc4ebb0395 /src/kernel/fs | |
parent | f0439a5dbfe2cfed3d629027d4b54b5f77f4e6de (diff) |
Added devfs and basic standard devices
Diffstat (limited to 'src/kernel/fs')
-rw-r--r-- | src/kernel/fs/dev.c | 114 | ||||
-rw-r--r-- | src/kernel/fs/dev.h | 25 | ||||
-rw-r--r-- | src/kernel/fs/vfs.c | 1 | ||||
-rw-r--r-- | src/kernel/fs/vfs.h | 1 |
4 files changed, 141 insertions, 0 deletions
diff --git a/src/kernel/fs/dev.c b/src/kernel/fs/dev.c new file mode 100644 index 0000000..968dcfe --- /dev/null +++ b/src/kernel/fs/dev.c @@ -0,0 +1,114 @@ +#include <stdint.h> +#include <stddef.h> +#include <kernel/system.h> +#include <kernel/fs/dev.h> +#include <kernel/fs/vfs.h> +#include <kernel/fs/ext2.h> +#include <kernel/memory/alloc.h> +#include <kernel/lib/stdlib.h> +#include <kernel/lib/stdio.h> + +void dev_make(char *name, read read, write write) +{ + struct fs_node *dev_node = (struct fs_node *)kmalloc(sizeof(struct fs_node)); + strcpy(dev_node->name, "/dev"); + ext2_root->open(dev_node); + + if (dev_node->inode == 0) { + warn("Can't make device, no path for /dev"); + return; + } + + ext2_root->close(dev_node); + + char *path = (char *)kmalloc(strlen(name) + strlen("/dev/") + 2); + strcpy(path, "/dev/"); + strcpy(&path[strlen("/dev/")], name); + + // TODO: Touch dev files in the vfs instead of opening it via ext2 + struct fs_node *node = (struct fs_node *)kmalloc(sizeof(struct fs_node)); + strcpy(node->name, path); + ext2_root->open(node); + kfree(path); + + if (node->inode == 0) { + warn("Couldn't resolve path"); + return; + } + + node->read = read; + node->write = write; + + node->dev = (struct dev *)kmalloc(sizeof(struct dev)); + node->dev->read = read; + node->dev->write = write; + node->dev->block_size = 512; +} + +uint32_t dev_read(struct fs_node *dev, uint32_t offset, uint32_t size, char *buffer) +{ + if (dev->read == NULL) { + warn("Can't read from device"); + return (uint32_t)-1; + } + + return dev->read(dev, offset, size, buffer); +} + +uint32_t dev_write(struct fs_node *dev, uint32_t offset, uint32_t size, char *buffer) +{ + if (dev->write == NULL) { + warn("Can't write to device"); + return (uint32_t)-1; + } + + return dev->write(dev, offset, size, buffer); +} + +// Standard devices + +uint32_t stdin_read(struct fs_node *node, uint32_t offset, uint32_t size, uint8_t *buffer) +{ + // Do something + return 0; +} + +void dev_stdin() +{ + dev_make("stdout", (read)stdin_read, NULL); + struct fs_node *node = (struct fs_node *)kmalloc(sizeof(struct fs_node)); + strcpy(node->name, "/dev/stdin"); + ext2_root->open(node); + node->dev->block_size = 0; + node->length = 0xFFFFFFFF; +} + +uint32_t stdout_write(struct fs_node *node, uint32_t offset, uint32_t size, uint8_t *buffer) +{ + //putch(*buffer); + return 0; +} + +void dev_stdout() +{ + dev_make("stdout", NULL, (write)stdout_write); + struct fs_node *node = (struct fs_node *)kmalloc(sizeof(struct fs_node)); + strcpy(node->name, "/dev/stdout"); + ext2_root->open(node); + node->dev->block_size = 0; +} + +uint32_t stderr_write(struct fs_node *node, uint32_t offset, uint32_t size, uint8_t *buffer) +{ + //putch(*buffer); + return 0; +} + +void dev_stderr() +{ + dev_make("stderr", NULL, (write)stderr_write); + struct fs_node *node = (struct fs_node *)kmalloc(sizeof(struct fs_node)); + strcpy(node->name, "/dev/stderr"); + ext2_root->open(node); + node->dev->block_size = 0; +}
\ No newline at end of file diff --git a/src/kernel/fs/dev.h b/src/kernel/fs/dev.h new file mode 100644 index 0000000..40263e6 --- /dev/null +++ b/src/kernel/fs/dev.h @@ -0,0 +1,25 @@ +#ifndef MELVIX_DEV_H +#define MELVIX_DEV_H + +#include <stdint.h> +#include <kernel/fs/vfs.h> + +struct dev { + char name[128]; + uint32_t block_size; + read read; + write write; + + uint8_t bus; + uint8_t drive; +}; + +void dev_make(char *name, read read, write write); +uint32_t dev_read(struct fs_node *dev, uint32_t offset, uint32_t size, char *buffer); +uint32_t dev_write(struct fs_node *dev, uint32_t offset, uint32_t size, char *buffer); + +void dev_stdout(); +void dev_stdin(); +void dev_stderr(); + +#endif
\ No newline at end of file diff --git a/src/kernel/fs/vfs.c b/src/kernel/fs/vfs.c index 68944c7..fd44f30 100644 --- a/src/kernel/fs/vfs.c +++ b/src/kernel/fs/vfs.c @@ -1,6 +1,7 @@ #include <stdint.h> #include <stddef.h> #include <kernel/fs/vfs.h> +#include <kernel/lib/stdlib.h> struct fs_node *fs_root = NULL; diff --git a/src/kernel/fs/vfs.h b/src/kernel/fs/vfs.h index 6a26c07..867fae2 100644 --- a/src/kernel/fs/vfs.h +++ b/src/kernel/fs/vfs.h @@ -34,6 +34,7 @@ struct fs_node { uint32_t gid; enum node_type type; + struct dev *dev; struct fs_node *node_ptr; void *impl; |