Change io crate & add a small shell
This commit is contained in:
@@ -5,7 +5,7 @@ edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
bffs = { path = "../bffs" }
|
||||
io = { path = "../io" }
|
||||
io = { package = "no-std-io", path = "../io" }
|
||||
|
||||
[features]
|
||||
kernel = []
|
||||
|
||||
@@ -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!()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user