Change io crate & add a small shell

This commit is contained in:
2026-03-25 20:45:11 +01:00
parent f966a1239e
commit ae0593c972
98 changed files with 11102 additions and 810 deletions

View File

@@ -5,7 +5,7 @@ edition = "2024"
[dependencies]
bffs = { path = "../bffs" }
io = { path = "../io" }
io = { package = "no-std-io", path = "../io" }
[features]
kernel = []

View File

@@ -1,4 +1,4 @@
use io::{IoBase, Read, Write};
use io::{Read, Write};
use crate::syscall;
@@ -19,22 +19,18 @@ impl File {
}
}
impl IoBase for File {
type Error = ();
}
impl Read for File {
fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> {
fn read(&mut self, buf: &mut [u8]) -> Result<usize, io::Error> {
Ok(syscall::read(self.as_fd(), buf) as usize)
}
}
impl Write for File {
fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> {
fn write(&mut self, buf: &[u8]) -> Result<usize, io::Error> {
Ok(syscall::write(self.as_fd(), buf) as usize)
}
fn flush(&mut self) -> Result<(), Self::Error> {
fn flush(&mut self) -> Result<(), io::Error> {
todo!()
}
}

View File

@@ -13,8 +13,7 @@ pub enum SysCall {
ExecVE = 59,
Exit = 60,
NanoSleep = 101,
WriteIntTemp = 998,
WriteTemp = 999,
WaitPid = 247,
Unimplemented = 1 << 31,
}
@@ -32,8 +31,7 @@ impl From<u64> for SysCall {
59 => SysCall::ExecVE,
60 => SysCall::Exit,
101 => SysCall::NanoSleep,
998 => SysCall::WriteIntTemp,
999 => SysCall::WriteTemp,
247 => SysCall::WaitPid,
_ => SysCall::Unimplemented,
}
}
@@ -110,21 +108,6 @@ pub fn sleep(duration: Duration) {
}
}
pub fn write_string_temp(content: &str) {
unsafe {
syscall!(
SysCall::WriteTemp,
content.as_ptr() as u64,
content.len() as u64
);
}
}
pub fn write_int_temp(content: u64) {
unsafe {
syscall!(SysCall::WriteIntTemp, content);
}
}
#[allow(unknown_lints)]
#[allow(fuzzy_provenance_casts)]
pub fn alloc(layout: Layout) -> *mut u8 {
@@ -177,11 +160,18 @@ pub fn seek(file_descriptor: u64, seek_type: u8, seek: u64) {
syscall!(SysCall::Seek, file_descriptor, seek_type as u64, seek);
}
}
pub fn spawn(path: &str) {
pub fn spawn(path: &str, argc: isize, argv: *const *const u8) -> u64 {
unsafe {
let ptr = path.as_ptr();
let size = path.len();
syscall!(SysCall::Spawn, ptr as u64, size as u64);
let (pid, ..) = syscall!(
SysCall::Spawn,
ptr as u64,
size as u64,
argc as u64,
argv as u64
);
pid
}
}
pub fn execve(path: &str) {
@@ -191,3 +181,9 @@ pub fn execve(path: &str) {
syscall!(SysCall::ExecVE, ptr as u64, size as u64);
}
}
pub fn waitpid(pid: usize) {
unsafe {
syscall!(SysCall::WaitPid, pid as u64);
}
}