Interrupts aren't working anymore

This commit is contained in:
2026-03-15 10:48:41 +01:00
parent de6ef959ce
commit b1aac20b57
17 changed files with 455 additions and 89 deletions

View File

@@ -5,7 +5,6 @@ use io::{IoBase, Read, Seek, Write};
use crate::{
data_structures::circular_buffer::CircularBuffer,
println,
virtual_fs::{VirtualFileSystem, VirtualNode},
};
@@ -55,15 +54,15 @@ impl IoBase for KeyboardBufferNode<'_> {
impl Read for KeyboardBufferNode<'_> {
fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> {
let mut buffer = self.buffer.buffer.borrow_mut();
for i in 0..buf.len() {
(0..buf.len()).for_each(|i| {
buf[i] = buffer.pop().unwrap();
}
});
Ok(buf.len())
}
}
impl Seek for KeyboardBufferNode<'_> {
fn seek(&mut self, pos: io::SeekFrom) -> Result<u64, Self::Error> {
fn seek(&mut self, _pos: io::SeekFrom) -> Result<u64, Self::Error> {
todo!()
}
}

View File

@@ -3,19 +3,22 @@
// use alloc::boxed::Box;
// use io::{IoBase, Read, Seek, Write};
// use crate::virtual_fs::{VirtualFileSystem, VirtualNode};
// use crate::{
// data_structures::circular_buffer::CircularBuffer,
// virtual_fs::{VirtualFileSystem, VirtualNode},
// };
// pub const STDIN_BUFFER_SIZE: usize = 4096; // 4Ko
// #[derive(Debug)]
// pub struct Stdin {
// buffer: RefCell<[u8; STDIN_BUFFER_SIZE]>,
// buffer: RefCell<CircularBuffer<u8, STDIN_BUFFER_SIZE>>,
// }
// impl Stdin {
// pub fn new() -> Self {
// Self {
// buffer: RefCell::new([0; _]),
// buffer: RefCell::new(CircularBuffer::new()),
// }
// }
// }
@@ -44,7 +47,11 @@
// impl Read for StdinNode<'_> {
// fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> {
// todo!()
// let mut buffer = self.stdin.buffer.borrow_mut();
// for i in 0..buf.len() {
// buf[i] = buffer.pop().unwrap();
// }
// Ok(buf.len())
// }
// }

View File

@@ -0,0 +1 @@
pub struct SymbolicLink {}

View File

@@ -0,0 +1,84 @@
use alloc::{boxed::Box, format};
use io::{IoBase, Read, Seek, Write};
use crate::{
scheduler::ACTIVE_PID,
virtual_fs::{FILE_SYSTEM, VirtualFileSystem, VirtualNode},
};
#[derive(Debug)]
pub struct VirtualStdin {}
#[derive(Debug)]
pub struct VirtualStdinNode {}
impl VirtualStdin {
pub fn new() -> Self {
Self {}
}
}
impl VirtualFileSystem for VirtualStdin {
fn open(
&mut self,
path: &bffs::path::Path,
) -> Result<alloc::boxed::Box<dyn crate::virtual_fs::VirtualNode + '_>, ()> {
if !path.is_empty() {
Err(())
} else {
Ok(Box::new(VirtualStdinNode {}))
}
}
}
impl IoBase for VirtualStdinNode {
type Error = ();
}
impl Read for VirtualStdinNode {
fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> {
let pid = ACTIVE_PID.load(core::sync::atomic::Ordering::Relaxed);
unsafe {
FILE_SYSTEM
.open(format!("/proc/{pid}/0").as_ref())
.unwrap()
.read(buf)
}
}
}
impl Seek for VirtualStdinNode {
fn seek(&mut self, pos: io::SeekFrom) -> Result<u64, Self::Error> {
let pid = ACTIVE_PID.load(core::sync::atomic::Ordering::Relaxed);
unsafe {
FILE_SYSTEM
.open(format!("/proc/{pid}/0").as_ref())
.unwrap()
.seek(pos)
}
}
}
impl Write for VirtualStdinNode {
fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> {
let pid = ACTIVE_PID.load(core::sync::atomic::Ordering::Relaxed);
unsafe {
FILE_SYSTEM
.open(format!("/proc/{pid}/0").as_ref())
.unwrap()
.write(buf)
}
}
fn flush(&mut self) -> Result<(), Self::Error> {
let pid = ACTIVE_PID.load(core::sync::atomic::Ordering::Relaxed);
unsafe {
FILE_SYSTEM
.open(format!("/proc/{pid}/0").as_ref())
.unwrap()
.flush()
}
}
}
impl VirtualNode for VirtualStdinNode {}