summaryrefslogtreecommitdiff
path: root/src/fs/file.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/fs/file.cc')
-rw-r--r--src/fs/file.cc41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/fs/file.cc b/src/fs/file.cc
index 623b535..9f12dc1 100644
--- a/src/fs/file.cc
+++ b/src/fs/file.cc
@@ -217,6 +217,16 @@ namespace FileTable
if (f->type == FD_INODE)
{
VFS::ilock(f->ip);
+
+ if (f->ip->type == T_DEVICE)
+ {
+ if (f->ip->major == 1)
+ {
+ VFS::iunlock(f->ip);
+ return Drivers::console_read(addr, n);
+ }
+ }
+
int r = f->ip->read((char*)addr, f->off, n, 1);
if(r > 0)
{
@@ -240,6 +250,37 @@ namespace FileTable
if (f->type == FD_INODE)
{
VFS::ilock(f->ip);
+
+ if (f->ip->type == T_DEVICE)
+ {
+ if (f->ip->major == 1) // Console
+ {
+ VFS::iunlock(f->ip);
+ struct Proc *proc = myproc();
+ constexpr int MAX_WRITE_BUF = 128;
+ char buf[MAX_WRITE_BUF];
+ int i = 0;
+ while (i < n)
+ {
+ int len = n - i;
+ if (len > MAX_WRITE_BUF)
+ len = MAX_WRITE_BUF;
+
+ if (VM::copyin(proc->pagetable, buf, addr + i, static_cast<uint64>(len)) < 0)
+ {
+ return -1;
+ }
+
+ for (int j = 0; j < len; j++)
+ {
+ Drivers::uart_putc(buf[j]);
+ }
+ i += len;
+ }
+ return n;
+ }
+ }
+
int r = f->ip->write((char *)addr, f->off, n, 1);
if (r > 0)
{