sel4_sys/
ipc_buffer.rs
1use 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}