From ad768d039226971521f20412dec58bf247ce8aaf Mon Sep 17 00:00:00 2001 From: Matheus Date: Sat, 24 Sep 2022 00:45:51 -0300 Subject: [PATCH] pseudodevices: initial null, zero and full implementations --- src/arch/x86_64/main.c | 4 +++- src/include/kernel/devman.h | 4 ++++ src/sys/Makefile | 2 +- src/sys/pseudodevs/Makefile | 12 ++++++++++++ src/sys/pseudodevs/full.c | 28 ++++++++++++++++++++++++++++ src/sys/pseudodevs/null.c | 27 +++++++++++++++++++++++++++ src/sys/pseudodevs/pseudodevs.c | 11 +++++++++++ src/sys/pseudodevs/zero.c | 28 ++++++++++++++++++++++++++++ src/video/consoledev.c | 4 +--- 9 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 src/sys/pseudodevs/Makefile create mode 100644 src/sys/pseudodevs/full.c create mode 100644 src/sys/pseudodevs/null.c create mode 100644 src/sys/pseudodevs/pseudodevs.c create mode 100644 src/sys/pseudodevs/zero.c diff --git a/src/arch/x86_64/main.c b/src/arch/x86_64/main.c index 5c24ac59..0ab4c114 100644 --- a/src/arch/x86_64/main.c +++ b/src/arch/x86_64/main.c @@ -63,6 +63,8 @@ void kmain(){ consoledev_init(); + pseudodevs_init(); + pci_enumerate(); cpu_state_init(); @@ -74,7 +76,7 @@ void kmain(){ keyboard_init(); ps2kbd_init(); - + sched_runinit(); _panic("End of kmain()", 0); diff --git a/src/include/kernel/devman.h b/src/include/kernel/devman.h index e0ccfddf..926580a1 100644 --- a/src/include/kernel/devman.h +++ b/src/include/kernel/devman.h @@ -3,6 +3,10 @@ #include +#define MAJOR_CONSOLE 1 +#define MAJOR_ZERO 2 +#define MAJOR_NULL 3 +#define MAJOR_FULL 4 typedef struct{ int (*read)(int* error, int minor, void* buff, size_t count, size_t offset); diff --git a/src/sys/Makefile b/src/sys/Makefile index b479712e..faa2490a 100644 --- a/src/sys/Makefile +++ b/src/sys/Makefile @@ -1,5 +1,5 @@ objects := $(patsubst %.c,%.o,$(wildcard *.c)) -subdirs := mm sched syscalls +subdirs := mm sched syscalls pseudodevs OBJPATH=$(OBJDIR) export diff --git a/src/sys/pseudodevs/Makefile b/src/sys/pseudodevs/Makefile new file mode 100644 index 00000000..e587c7aa --- /dev/null +++ b/src/sys/pseudodevs/Makefile @@ -0,0 +1,12 @@ +objects := $(patsubst %.c,%.o,$(wildcard *.c)) +subdirs := +OBJPATH=$(OBJDIR) +export + +all: $(subdirs) $(objects) + for subdir in $(subdirs) ; do $(MAKE) -C $${subdir} ; done + +%.o: %.c + $(CC) $(CFLAGS) -o $@ $< + mkdir -p $(OBJPATH) + cp $@ $(OBJPATH)/$@ diff --git a/src/sys/pseudodevs/full.c b/src/sys/pseudodevs/full.c new file mode 100644 index 00000000..9f885989 --- /dev/null +++ b/src/sys/pseudodevs/full.c @@ -0,0 +1,28 @@ +#include +#include +#include +#include + +static int read(int* error, int minor, void* buff, size_t count, size_t offset){ + *error = 0; + memset(buff, 0, count); + return count; +} +static int write(int* error, int minor, void* buff, size_t count, size_t offset){ + *error = ENOSPC; + return -1; +} + +static int isatty(int minor){ + return ENOTTY; +} + +static devcalls calls = { + read, write, isatty +}; + +void fulldev_init(){ + if(devman_newdevice("full", TYPE_CHARDEV, MAJOR_FULL, 0, &calls)){ + _panic("/dev/full init failed", NULL); + } +} diff --git a/src/sys/pseudodevs/null.c b/src/sys/pseudodevs/null.c new file mode 100644 index 00000000..6eca12b5 --- /dev/null +++ b/src/sys/pseudodevs/null.c @@ -0,0 +1,27 @@ +#include +#include +#include +#include + +static int read(int* error, int minor, void* buff, size_t count, size_t offset){ + *error = 0; + return 0; +} +static int write(int* error, int minor, void* buff, size_t count, size_t offset){ + *error = 0; + return count; +} + +static int isatty(int minor){ + return ENOTTY; +} + +static devcalls calls = { + read, write, isatty +}; + +void nulldev_init(){ + if(devman_newdevice("null", TYPE_CHARDEV, MAJOR_NULL, 0, &calls)){ + _panic("/dev/null init failed", NULL); + } +} diff --git a/src/sys/pseudodevs/pseudodevs.c b/src/sys/pseudodevs/pseudodevs.c new file mode 100644 index 00000000..8e73f495 --- /dev/null +++ b/src/sys/pseudodevs/pseudodevs.c @@ -0,0 +1,11 @@ + +void nulldev_init(); +void zerodev_init(); +void fulldev_init(); + +void pseudodevs_init(){ + + nulldev_init(); + zerodev_init(); + fulldev_init(); +} diff --git a/src/sys/pseudodevs/zero.c b/src/sys/pseudodevs/zero.c new file mode 100644 index 00000000..d93e7e8b --- /dev/null +++ b/src/sys/pseudodevs/zero.c @@ -0,0 +1,28 @@ +#include +#include +#include +#include + +static int read(int* error, int minor, void* buff, size_t count, size_t offset){ + *error = 0; + memset(buff, 0, count); + return count; +} +static int write(int* error, int minor, void* buff, size_t count, size_t offset){ + *error = 0; + return count; +} + +static int isatty(int minor){ + return ENOTTY; +} + +static devcalls calls = { + read, write, isatty +}; + +void zerodev_init(){ + if(devman_newdevice("zero", TYPE_CHARDEV, MAJOR_ZERO, 0, &calls)){ + _panic("/dev/zero init failed", NULL); + } +} diff --git a/src/video/consoledev.c b/src/video/consoledev.c index 11a0d8df..6dc052c2 100644 --- a/src/video/consoledev.c +++ b/src/video/consoledev.c @@ -8,8 +8,6 @@ #include #include -#define CONSOLE_MAJOR 1 - static ringbuffer_t input; static thread_t* thread; static event_t outputevent; @@ -129,7 +127,7 @@ devcalls calls = { void consoledev_init(){ - if(devman_newdevice("console", TYPE_CHARDEV, CONSOLE_MAJOR, 0, &calls)) + if(devman_newdevice("console", TYPE_CHARDEV, MAJOR_CONSOLE, 0, &calls)) _panic("Failed to create console device", 0); if(ringbuffer_init(&input, THREAD_BUFF_MAX))