sel4/
message_info.rs

1//
2// Copyright 2023, Colias Group, LLC
3//
4// SPDX-License-Identifier: MIT
5//
6
7use crate::{newtype_methods, sys, Word};
8
9/// Corresponds to `seL4_MessageInfo_t`.
10#[derive(Debug, Clone, PartialEq, Eq)]
11pub struct MessageInfo(sys::seL4_MessageInfo);
12
13impl MessageInfo {
14    newtype_methods!(pub sys::seL4_MessageInfo);
15
16    pub fn new(label: Word, caps_unwrapped: usize, extra_caps: usize, length: usize) -> Self {
17        Self::from_inner(sys::seL4_MessageInfo::new(
18            label,
19            caps_unwrapped.try_into().unwrap(),
20            extra_caps.try_into().unwrap(),
21            length.try_into().unwrap(),
22        ))
23    }
24
25    pub fn label(&self) -> Word {
26        self.inner().get_label()
27    }
28
29    pub const fn label_width() -> usize {
30        sys::seL4_MessageInfo::width_of_label()
31    }
32
33    pub fn caps_unwrapped(&self) -> usize {
34        self.inner().get_capsUnwrapped().try_into().unwrap()
35    }
36
37    pub fn extra_caps(&self) -> usize {
38        self.inner().get_extraCaps().try_into().unwrap()
39    }
40
41    pub fn length(&self) -> usize {
42        self.inner().get_length().try_into().unwrap()
43    }
44}
45
46impl From<MessageInfoBuilder> for MessageInfo {
47    fn from(builder: MessageInfoBuilder) -> Self {
48        builder.build()
49    }
50}
51
52/// Helper for constructing [`MessageInfo`].
53#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)]
54pub struct MessageInfoBuilder {
55    label: Word,
56    caps_unwrapped: usize,
57    extra_caps: usize,
58    length: usize,
59}
60
61impl MessageInfoBuilder {
62    pub fn build(self) -> MessageInfo {
63        MessageInfo::new(
64            self.label,
65            self.caps_unwrapped,
66            self.extra_caps,
67            self.length,
68        )
69    }
70
71    #[must_use]
72    pub fn label(mut self, label: Word) -> Self {
73        self.label = label;
74        self
75    }
76
77    #[must_use]
78    pub fn caps_unwrapped(mut self, caps_unwrapped: usize) -> Self {
79        self.caps_unwrapped = caps_unwrapped;
80        self
81    }
82
83    #[must_use]
84    pub fn extra_caps(mut self, extra_caps: usize) -> Self {
85        self.extra_caps = extra_caps;
86        self
87    }
88
89    #[must_use]
90    pub fn length(mut self, length: usize) -> Self {
91        self.length = length;
92        self
93    }
94}