From 9c6ce452f816292003098e162ed9d8838693cc52 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sat, 20 Aug 2022 15:15:10 -0300 Subject: [PATCH] /dev/console --- initrd/sbin/init | Bin 4352 -> 4352 bytes src/arch/x86_64/main.c | 31 ++------------------------ src/fs/devfs.c | 2 ++ src/include/kernel/consoledev.h | 6 ++++++ src/sys/devman.c | 4 ++-- src/sys/sched/scheduler.c | 16 ++++---------- src/sys/syscalls/write.c | 3 +++ src/video/consoledev.c | 37 ++++++++++++++++++++++++++++++++ 8 files changed, 56 insertions(+), 43 deletions(-) create mode 100644 src/include/kernel/consoledev.h create mode 100644 src/video/consoledev.c diff --git a/initrd/sbin/init b/initrd/sbin/init index a6923ad8e710de085fa1779746fa1422854e58da..85da71093b8f6d5818d8c5904a795b24f454d1f6 100755 GIT binary patch delta 348 zcmZorYEarx!pO)txlurT@&{I#$s5>MCa+->VPu0FTV(P#D|961oV-Kh4@yoY>mGa9wOn%RNmroSLbL10fV{+zY3z&S1 z#f(vUvLI_bqw?lLR&M6WQ#eFqzXFvAGVwAnuqvQf#Kg$JAT)U*qc9`;RJ~jtxOjhI+mox#X20H&NGsO8|mjG?DoE!+0wFm1JV8~!YwbN~JBPXM5 ze0+$nbG)mcOME;-e7sADe-M-d^7`flTndbn_i;Z0`e7l@e`ZGS$qNO{IUjR@yvo2Z Jd-6kWc>w${L<9f; delta 333 zcmZorYEarx!pO)lxlurP@&|5#$rBg_CU0P4nY@NkWU>Jt%j6@BBJyGk3=9Gc91Ihf zfD|$)D9X$$Nt^tYQE{^b(>_MY9U#dU6aM}G4`#(4PUDwv0f|k1&wQ6p3dC~c6KG>{ z=4A_=e2c}5QFgK*YdoXs=0a9(W{_2qAAm{(nFJUz*c4E#`ZIYVhd3kW #include -/* - -static volatile struct limine_terminal_request liminettyr = { - .id = LIMINE_TERMINAL_REQUEST, - .revision = 0 -}; - -struct limine_terminal_response* liminetty; - -int ttylock = 0; - -static vmm_context* liminettyctx; - -void liminewrite(char* str, size_t c){ - - vmm_context* old = arch_getcls()->context; - - if(liminettyctx) - vmm_switchcontext(liminettyctx); - - liminetty->write(liminetty->terminals[0], str, c); - - if(liminettyctx) - vmm_switchcontext(old); - -} - -*/ - void kmain(){ liminetty_init(); @@ -88,6 +59,8 @@ void kmain(){ initrd_parse(); devman_init(); + + consoledev_init(); pci_enumerate(); diff --git a/src/fs/devfs.c b/src/fs/devfs.c index d1e20012..4c53e629 100644 --- a/src/fs/devfs.c +++ b/src/fs/devfs.c @@ -39,6 +39,8 @@ static int devfs_open(dirnode_t* parent, char* name){ return ENOMEM; } + node->st = devnode->st; + return 0; } diff --git a/src/include/kernel/consoledev.h b/src/include/kernel/consoledev.h new file mode 100644 index 00000000..ffbb5807 --- /dev/null +++ b/src/include/kernel/consoledev.h @@ -0,0 +1,6 @@ +#ifndef _CONSOLEDEV_H_INCLUDE +#define _CONSOLEDEV_H_INCLUDE + +void consoledev_init(); + +#endif diff --git a/src/sys/devman.c b/src/sys/devman.c index e7c05459..4f35a889 100644 --- a/src/sys/devman.c +++ b/src/sys/devman.c @@ -17,6 +17,7 @@ int devman_newdevice(char* name, int type, int major, int minor, devcalls* calls if(!addr) return ENOMEM; majorcalls = addr; + highestmajor = major; } majorcalls[major] = calls; @@ -26,10 +27,9 @@ int devman_newdevice(char* name, int type, int major, int minor, devcalls* calls } 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); diff --git a/src/sys/sched/scheduler.c b/src/sys/sched/scheduler.c index 16b8d1b3..1009e559 100644 --- a/src/sys/sched/scheduler.c +++ b/src/sys/sched/scheduler.c @@ -295,31 +295,23 @@ void sched_runinit(){ fd_t* stdoutfd = &proc->fds[1]; fd_t* stderrfd = &proc->fds[2]; - // dummy file before console actually gets implemented and a devfs node - - #define CONSOLE_DUMMY "etc/consoledummy" + #define CONSOLE_PATH "dev/console" - size_t ret = vfs_create(vfs_root(), CONSOLE_DUMMY, 0777); - - if(ret){ - printf("Create failed: %s\n", strerror(ret)); - _panic("Failed to create dummy console", 0); - } - ret = vfs_open(&stdinfd->node, vfs_root(), CONSOLE_DUMMY); + int ret = vfs_open(&stdinfd->node, vfs_root(), CONSOLE_PATH); if(ret){ printf("Open failed: %s\n", strerror(ret)); _panic("Could not open stdin for init", 0); } - ret = vfs_open(&stdoutfd->node, vfs_root(), CONSOLE_DUMMY); + ret = vfs_open(&stdoutfd->node, vfs_root(), CONSOLE_PATH); if(ret){ printf("Open failed: %s\n", strerror(ret)); _panic("Could not open stdout for init", 0); } - ret = vfs_open(&stderrfd->node, vfs_root(), CONSOLE_DUMMY); + ret = vfs_open(&stderrfd->node, vfs_root(), CONSOLE_PATH); if(ret){ printf("Open failed: %s\n", strerror(ret)); diff --git a/src/sys/syscalls/write.c b/src/sys/syscalls/write.c index 3a73a489..b8e40052 100644 --- a/src/sys/syscalls/write.c +++ b/src/sys/syscalls/write.c @@ -59,6 +59,9 @@ syscallret syscall_write(int ifd, void* buff, size_t count){ fd->offset += writec; + if(fd->node->st.st_size < fd->offset) + fd->offset = fd->node->st.st_size; + retv.errno = 0; retv.ret = writec; diff --git a/src/video/consoledev.c b/src/video/consoledev.c new file mode 100644 index 00000000..861a9a88 --- /dev/null +++ b/src/video/consoledev.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include +#include + +#define CONSOLE_MAJOR 1 + +static int isatty(int minor){ + return 0; +} + +static int read(int *error, int dev, void* buff, size_t count, size_t offset){ + *error = ENOSYS; + return -1; +} + +static int write(int *error, int dev, void* buff, size_t count, size_t offset){ + *error = 0; + + liminetty_writeuser(buff, count); + + return count; +} + +devcalls calls = { + read, write, isatty +}; + + +void consoledev_init(){ + + if(devman_newdevice("console", TYPE_CHARDEV, CONSOLE_MAJOR, 0, &calls)) + _panic("Failed to create console device", 0); + + +}