diff options
| author | Richard Qin <richard.qin.x@gmail.com> | 2026-01-04 18:09:57 +0800 |
|---|---|---|
| committer | Richard Qin <richard.qin.x@gmail.com> | 2026-01-04 18:09:57 +0800 |
| commit | 92ca8063f354d515e500b7cf99fb9cdca98c39d3 (patch) | |
| tree | 142e6d9ada3d511663c6c0540196d270c69c0227 /src/fs/file.cc | |
| parent | a64d25c07b31d57f8706073e11cd774d0880d6dd (diff) | |
| parent | 3886749b1c8d79d4701bf6b8e66249c4e1491648 (diff) | |
| download | lume-92ca8063f354d515e500b7cf99fb9cdca98c39d3.tar.gz lume-92ca8063f354d515e500b7cf99fb9cdca98c39d3.tar.xz | |
Merge pull request #6 from Richard-Qin-001/dev/shell
A basically complete operating system has been implemented
Diffstat (limited to 'src/fs/file.cc')
| -rw-r--r-- | src/fs/file.cc | 41 |
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) { |
