diff --git a/kernel-src/arch/x86-64/main.c b/kernel-src/arch/x86-64/main.c index 2b1e037f..8b14e81b 100644 --- a/kernel-src/arch/x86-64/main.c +++ b/kernel-src/arch/x86-64/main.c @@ -18,6 +18,7 @@ #include #include #include +#include static cpu_t bsp_cpu; @@ -55,5 +56,7 @@ void kernel_entry() { printf("mounting devfs on /dev\n"); __assert(vfs_mount(NULL, vfsroot, "/dev", "devfs", NULL) == 0); + pseudodevices_init(); + __assert(!"kernel entry end"); } diff --git a/kernel-src/include/kernel/devfs.h b/kernel-src/include/kernel/devfs.h index 347d9f8a..364c0a6b 100644 --- a/kernel-src/include/kernel/devfs.h +++ b/kernel-src/include/kernel/devfs.h @@ -3,6 +3,10 @@ #include +#define DEV_MAJOR_NULL 1 +#define DEV_MAJOR_FULL 2 +#define DEV_MAJOR_ZERO 3 + typedef struct { int (*open)(int minor, int flags); int (*close)(int minor, int flags); diff --git a/kernel-src/include/kernel/pseudodevices.h b/kernel-src/include/kernel/pseudodevices.h new file mode 100644 index 00000000..17943c1d --- /dev/null +++ b/kernel-src/include/kernel/pseudodevices.h @@ -0,0 +1,6 @@ +#ifndef _PSEUDODEVICES_H +#define _PSEUDODEVICES_H + +void pseudodevices_init(); + +#endif diff --git a/kernel-src/io/pseudodevices.c b/kernel-src/io/pseudodevices.c new file mode 100644 index 00000000..c96b5132 --- /dev/null +++ b/kernel-src/io/pseudodevices.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include + +static int null_write(int minor, void *buffer, size_t count, uintmax_t offset, int flags, size_t *wcount) { + *wcount = count; + return 0; +} + +static int full_write(int minor, void *buffer, size_t count, uintmax_t offset, int flags, size_t *wcount) { + return ENOSPC; +} + +static int zero_read(int minor, void *buffer, size_t count, uintmax_t offset, int flags, size_t *rcount) { + *rcount = count; + memset(buffer, 0, count); + return 0; +} + +static int null_read(int minor, void *buffer, size_t count, uintmax_t offset, int flags, size_t *rcount) { + *rcount = 0; + return 0; +} + +static devops_t nullops = { + .read = null_read, + .write = null_write +}; + +static devops_t fullops = { + .read = zero_read, + .write = full_write +}; + +static devops_t zeroops = { + .read = zero_read, + .write = null_write +}; + +void pseudodevices_init() { + __assert(devfs_register(&nullops, "null", V_TYPE_CHDEV, DEV_MAJOR_NULL, 0, 0644) == 0); + __assert(devfs_register(&fullops, "full", V_TYPE_CHDEV, DEV_MAJOR_FULL, 0, 0644) == 0); + __assert(devfs_register(&zeroops, "zero", V_TYPE_CHDEV, DEV_MAJOR_ZERO, 0, 0644) == 0); +}