twizzler_abi/syscall/
kaction.rs

1use twizzler_rt_abi::Result;
2
3use super::{convert_codes_to_result, twzerr, Syscall};
4use crate::{
5    arch::syscall::raw_syscall,
6    kso::{KactionCmd, KactionFlags, KactionValue},
7    object::ObjID,
8};
9
10/// Execute a kaction on an object.
11pub fn sys_kaction(
12    cmd: KactionCmd,
13    id: Option<ObjID>,
14    arg: u64,
15    arg2: u64,
16    flags: KactionFlags,
17) -> Result<KactionValue> {
18    let [hi, lo] = id.map_or([0, 0], |id| id.parts());
19    let (code, val) = unsafe {
20        raw_syscall(
21            Syscall::Kaction,
22            &[cmd.into(), hi, lo, arg, flags.bits(), arg2],
23        )
24    };
25    convert_codes_to_result(
26        code,
27        val,
28        |c, _| c == 0,
29        |c, v| KactionValue::from((c, v)),
30        twzerr,
31    )
32}
33
34#[derive(Clone, Copy, Debug, Hash, PartialEq, PartialOrd, Ord, Eq)]
35#[repr(C)]
36pub struct PinnedPage {
37    phys: u64,
38}
39
40impl PinnedPage {
41    pub fn new(phys: u64) -> Self {
42        Self { phys }
43    }
44
45    pub fn physical_address(&self) -> u64 {
46        self.phys
47    }
48}