mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-02 07:28:21 +00:00
/dev/console
This commit is contained in:
Binary file not shown.
+2
-29
@@ -18,35 +18,6 @@
|
|||||||
#include <arch/smp.h>
|
#include <arch/smp.h>
|
||||||
#include <kernel/timer.h>
|
#include <kernel/timer.h>
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
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(){
|
void kmain(){
|
||||||
|
|
||||||
liminetty_init();
|
liminetty_init();
|
||||||
@@ -89,6 +60,8 @@ void kmain(){
|
|||||||
|
|
||||||
devman_init();
|
devman_init();
|
||||||
|
|
||||||
|
consoledev_init();
|
||||||
|
|
||||||
pci_enumerate();
|
pci_enumerate();
|
||||||
|
|
||||||
cpu_state_init();
|
cpu_state_init();
|
||||||
|
|||||||
@@ -39,6 +39,8 @@ static int devfs_open(dirnode_t* parent, char* name){
|
|||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
node->st = devnode->st;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
#ifndef _CONSOLEDEV_H_INCLUDE
|
||||||
|
#define _CONSOLEDEV_H_INCLUDE
|
||||||
|
|
||||||
|
void consoledev_init();
|
||||||
|
|
||||||
|
#endif
|
||||||
+1
-1
@@ -17,6 +17,7 @@ int devman_newdevice(char* name, int type, int major, int minor, devcalls* calls
|
|||||||
if(!addr)
|
if(!addr)
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
majorcalls = addr;
|
majorcalls = addr;
|
||||||
|
highestmajor = major;
|
||||||
}
|
}
|
||||||
|
|
||||||
majorcalls[major] = calls;
|
majorcalls[major] = calls;
|
||||||
@@ -30,7 +31,6 @@ int devman_write(int *error, int dev, void* buff, size_t count, size_t offset){
|
|||||||
if(major(dev) > highestmajor)
|
if(major(dev) > highestmajor)
|
||||||
return ENODEV;
|
return ENODEV;
|
||||||
|
|
||||||
|
|
||||||
return majorcalls[major(dev)]->write(error, minor(dev), buff, count, offset);
|
return majorcalls[major(dev)]->write(error, minor(dev), buff, count, offset);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -295,31 +295,23 @@ void sched_runinit(){
|
|||||||
fd_t* stdoutfd = &proc->fds[1];
|
fd_t* stdoutfd = &proc->fds[1];
|
||||||
fd_t* stderrfd = &proc->fds[2];
|
fd_t* stderrfd = &proc->fds[2];
|
||||||
|
|
||||||
// dummy file before console actually gets implemented and a devfs node
|
#define CONSOLE_PATH "dev/console"
|
||||||
|
|
||||||
#define CONSOLE_DUMMY "etc/consoledummy"
|
int ret = vfs_open(&stdinfd->node, vfs_root(), CONSOLE_PATH);
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
if(ret){
|
if(ret){
|
||||||
printf("Open failed: %s\n", strerror(ret));
|
printf("Open failed: %s\n", strerror(ret));
|
||||||
_panic("Could not open stdin for init", 0);
|
_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){
|
if(ret){
|
||||||
printf("Open failed: %s\n", strerror(ret));
|
printf("Open failed: %s\n", strerror(ret));
|
||||||
_panic("Could not open stdout for init", 0);
|
_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){
|
if(ret){
|
||||||
printf("Open failed: %s\n", strerror(ret));
|
printf("Open failed: %s\n", strerror(ret));
|
||||||
|
|||||||
@@ -59,6 +59,9 @@ syscallret syscall_write(int ifd, void* buff, size_t count){
|
|||||||
|
|
||||||
fd->offset += writec;
|
fd->offset += writec;
|
||||||
|
|
||||||
|
if(fd->node->st.st_size < fd->offset)
|
||||||
|
fd->offset = fd->node->st.st_size;
|
||||||
|
|
||||||
retv.errno = 0;
|
retv.errno = 0;
|
||||||
retv.ret = writec;
|
retv.ret = writec;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
#include <kernel/consoledev.h>
|
||||||
|
#include <kernel/devman.h>
|
||||||
|
#include <kernel/liminetty.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <arch/panic.h>
|
||||||
|
|
||||||
|
#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);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user