mirror of
https://github.com/panpaul/tiny_os
synced 2024-09-20 09:45:19 +08:00
feat: kernel/syscall: refactor
This commit is contained in:
parent
27fdf26cc1
commit
3475bf36cd
@ -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),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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] |
|
||||||
|
Loading…
Reference in New Issue
Block a user