feat: kernel/syscall: refactor

This commit is contained in:
Paul Pan 2024-09-02 13:55:00 +08:00
parent 27fdf26cc1
commit 3475bf36cd
2 changed files with 23 additions and 12 deletions

View File

@ -2,17 +2,22 @@ use crate::{objects::*, plat::trap::TrapContextOps};
use log::trace; use log::trace;
use uapi::{error::*, syscall::*}; use uapi::{error::*, syscall::*};
macro_rules! assert_length {
($info:expr, $len:expr) => {
if $info.length() != $len {
return Err(SysError::InvalidArgument);
}
};
}
pub fn handle_syscall(tcb: &mut TcbObject) -> SysResult { pub fn handle_syscall(tcb: &mut TcbObject) -> SysResult {
let info = MessageInfo::try_from(tcb.trapframe.get_reg(0))?; let info = MessageInfo::try_from(tcb.trapframe.get_reg(REG_MESSAGE_INFO))?;
// Invalid, Debug*, Yield will bypass the capability check // Invalid, Debug*, Yield will bypass the capability check
match info.label() { match info.label() {
Syscall::Invalid => return Ok(()), Syscall::Invalid => return Ok(()),
Syscall::DebugPutChar => { Syscall::DebugPutChar => {
if info.length() != 3 { assert_length!(info, 3);
return Err(SysError::InvalidArgument);
}
let c = tcb.trapframe.get_reg(2) as u8 as char; let c = tcb.trapframe.get_reg(2) as u8 as char;
crate::print!("{}", c); crate::print!("{}", c);
return Ok(()); return Ok(());
@ -25,13 +30,16 @@ pub fn handle_syscall(tcb: &mut TcbObject) -> SysResult {
}; };
let cspace = CNodeCap::try_from(tcb.cspace())?; let cspace = CNodeCap::try_from(tcb.cspace())?;
let cap_ptr = tcb.trapframe.get_reg(1); let cap_ptr = tcb.trapframe.get_reg(REG_CAP_PTR);
let cap = cspace.resolve_address_bits(cap_ptr, info.bits()).map_err(SysError::from)?; let cap = cspace.resolve_address_bits(cap_ptr, info.bits()).map_err(SysError::from)?;
trace!("handle_syscall: info={:?} cap={:?}", info, cap); trace!("handle_syscall: info={:?} cap={:?}", info, cap);
match info.label() { match info.label() {
Syscall::Send => Ok(()), Syscall::InvokeNtfn => {
assert_length!(info, 2);
unimplemented!("[Syscall] InvokeNtfn: {:?}", info.label());
},
_ => unimplemented!("handle_syscall: {:?}, {:?}", info.label(), cap), _ => unimplemented!("handle_syscall: {:?}, {:?}", info.label(), cap),
} }
} }

View File

@ -8,11 +8,11 @@ pub enum Syscall {
Invalid = 0, Invalid = 0,
DebugPutChar = 1, DebugPutChar = 1,
Yield = 2, Yield = 2,
Identify = 3, InvokeNtfn = 3,
Send = 4, // Send = 4,
Recv = 5, // Recv = 5,
Call = 6, // Call = 6,
Reply = 7, // Reply = 7,
} }
/* Syscall convention: /* Syscall convention:
@ -26,6 +26,9 @@ pub enum Syscall {
* > TODO: figure out how vanilla seL4 handle reply * > TODO: figure out how vanilla seL4 handle reply
*/ */
pub const REG_MESSAGE_INFO: usize = 0;
pub const REG_CAP_PTR: usize = 1;
/* MessageInfo layout: /* MessageInfo layout:
* > | label | bits | length | * > | label | bits | length |
* > | [63:13] | [12:7] | [6:0] | * > | [63:13] | [12:7] | [6:0] |