use crate::{BasicKernelInterface, FileDescriptor, errors::IOResult, riscv64::syscall};
#[derive(Debug)]
pub(crate) struct RiscV64IO;
#[repr(usize)]
pub(crate) enum SyscallNumber {
Exit = 93,
Read = 63,
Write = 64,
}
impl BasicKernelInterface for RiscV64IO {
fn write(fd: FileDescriptor, buf: &[u8]) -> IOResult<usize> {
unsafe {
crate::linux::from_ret(syscall::syscall3(
SyscallNumber::Write as usize,
fd.into(),
buf.as_ptr() as usize,
buf.len(),
))
}
}
fn read(fd: FileDescriptor, buf: &mut [u8]) -> IOResult<usize> {
unsafe {
crate::linux::from_ret(syscall::syscall3(
SyscallNumber::Read as usize,
fd.into(),
buf.as_ptr() as usize,
buf.len(),
))
}
}
fn exit(code: usize) -> ! {
unsafe {
let _ = syscall::syscall1(SyscallNumber::Exit as usize, code);
panic!()
}
}
}