From e6d6a2ee214637f105237be293739a05f89cc60e Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Wed, 4 Sep 2024 16:14:12 +0800 Subject: [PATCH] feat: kernel/syscall: wire up endpoint operations --- kernel/src/syscall.rs | 35 ++++++++++++++++++++++++++++------- uapi/src/syscall.rs | 11 ++++++----- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/kernel/src/syscall.rs b/kernel/src/syscall.rs index e943c50..8b9d675 100644 --- a/kernel/src/syscall.rs +++ b/kernel/src/syscall.rs @@ -3,11 +3,16 @@ use log::trace; use uapi::{error::*, syscall::*}; macro_rules! assert_length { - ($info:expr, $len:expr) => { + ($info:ident, $len:expr) => { if $info.length() != $len { return Err(SysError::InvalidArgument); } }; + ($info:ident >= $len:expr) => { + if $info.length() >= $len { + return Err(SysError::InvalidArgument); + } + }; } pub fn handle_syscall(tcb: &mut TcbObject) -> SysResult { @@ -29,17 +34,33 @@ pub fn handle_syscall(tcb: &mut TcbObject) -> SysResult { _ => (), }; - let cspace = tcb.cspace()?; + assert_length!(info >= 2); + + // workaround ownership check + let tcb_cspace = unsafe { &mut *(tcb as *mut TcbObject) }; + let cspace = tcb_cspace.cspace()?; + let cap_ptr = tcb.trapframe.get_reg(REG_CAP_PTR); let cap = cspace.resolve_address_bits(cap_ptr, info.bits()).map_err(SysError::from)?; - trace!("handle_syscall: info={:?} cap={:?}", info, cap); + trace!("[Syscall] info={:?} cap={:?}", info, cap); match info.label() { - Syscall::InvokeNtfn => { - assert_length!(info, 2); - unimplemented!("[Syscall] InvokeNtfn: {:?}", info.label()); + // Endpoint + Syscall::EpSend => { + let mut cap = EndpointCap::try_from(cap)?; + cap.do_send(tcb) }, - _ => unimplemented!("handle_syscall: {:?}, {:?}", info.label(), cap), + Syscall::EpRecv => { + let mut cap = EndpointCap::try_from(cap)?; + cap.do_recv(tcb) + }, + Syscall::IrqSet => { + unimplemented!("[Syscall] IrqSet: {:?}", info.label()) + }, + Syscall::IrqAck => { + unimplemented!("[Syscall] IrqAck: {:?}", info.label()) + }, + _ => todo!("[Syscall] unhandled syscall: {:?}, {:?}", info.label(), cap), } } diff --git a/uapi/src/syscall.rs b/uapi/src/syscall.rs index 8d530c6..4c65158 100644 --- a/uapi/src/syscall.rs +++ b/uapi/src/syscall.rs @@ -8,11 +8,12 @@ pub enum Syscall { Invalid = 0, DebugPutChar = 1, Yield = 2, - InvokeNtfn = 3, - // Send = 4, - // Recv = 5, - // Call = 6, - // Reply = 7, + + // endpoint + EpSend = 3, + EpRecv = 4, + IrqSet = 5, + IrqAck = 6, } #[derive(Clone, Copy, Debug, Eq, PartialEq, FromPrimitive, ToPrimitive)]