sel4_sys/
ipc_buffer.rs

1//
2// Copyright 2023, Colias Group, LLC
3//
4// SPDX-License-Identifier: BSD-2-Clause
5//
6
7use core::mem;
8use core::ops::Range;
9use core::slice;
10
11use sel4_bitfield_ops::{get_bits, set_bits, set_bits_from_slice, PrimInt, UnsignedPrimInt};
12
13use crate::{seL4_CPtr, seL4_IPCBuffer, seL4_Word};
14
15impl seL4_IPCBuffer {
16    pub(crate) fn get_mr(&self, i: usize) -> seL4_Word {
17        self.msg[i]
18    }
19
20    pub(crate) fn set_mr(&mut self, i: usize, value: seL4_Word) {
21        self.msg[i] = value;
22    }
23
24    pub(crate) fn get_mr_bits<T>(&self, range: Range<usize>) -> T
25    where
26        T: PrimInt,
27        T::Unsigned: TryFrom<seL4_Word>,
28    {
29        T::cast_from_unsigned(get_bits(&self.msg, range))
30    }
31
32    pub(crate) fn set_mr_bits<T>(&mut self, range: Range<usize>, value: T)
33    where
34        T: PrimInt,
35        T::Unsigned: TryInto<seL4_Word>,
36    {
37        set_bits(&mut self.msg, range, T::cast_to_unsigned(value))
38    }
39
40    pub(crate) fn set_mr_bits_from_slice<T>(&mut self, range: Range<usize>, value: &[T])
41    where
42        T: UnsignedPrimInt,
43        usize: TryFrom<T>,
44    {
45        set_bits_from_slice(&mut self.msg, range, value, 0)
46    }
47
48    #[allow(dead_code)]
49    pub(crate) fn msg_bytes_mut(&mut self) -> &'static mut [u8] {
50        let msg = &mut self.msg;
51        unsafe {
52            slice::from_raw_parts_mut(
53                msg.as_mut_ptr().cast::<u8>(),
54                msg.len() * mem::size_of::<seL4_Word>(),
55            )
56        }
57    }
58
59    #[allow(dead_code)]
60    pub(crate) fn get_cap(&self, i: usize) -> seL4_CPtr {
61        self.caps_or_badges[i]
62    }
63
64    pub(crate) fn set_cap(&mut self, i: usize, cptr: seL4_CPtr) {
65        self.caps_or_badges[i] = cptr;
66    }
67}