sel4_shared_ring_buffer/
descriptor.rs
1use core::ops::Range;
8
9use zerocopy::{FromBytes, Immutable, IntoBytes};
10
11#[repr(C)]
12#[derive(Copy, Clone, Debug, PartialOrd, Ord, PartialEq, Eq, FromBytes, IntoBytes, Immutable)]
13pub struct Descriptor {
14 encoded_addr: usize,
15 len: u32,
16 _padding: [u8; 4],
17 cookie: usize,
18}
19
20impl Descriptor {
21 pub fn new(encoded_addr: usize, len: u32, cookie: usize) -> Self {
22 Self {
23 encoded_addr,
24 len,
25 _padding: [0; 4],
26 cookie,
27 }
28 }
29
30 pub fn from_encoded_addr_range(encoded_addr_range: Range<usize>, cookie: usize) -> Self {
31 let encoded_addr = encoded_addr_range.start;
32 let len = encoded_addr_range.len().try_into().unwrap();
33 Self::new(encoded_addr, len, cookie)
34 }
35
36 pub fn encoded_addr(&self) -> usize {
37 self.encoded_addr
38 }
39
40 pub fn set_encoded_addr(&mut self, encoded_addr: usize) {
41 self.encoded_addr = encoded_addr;
42 }
43
44 #[allow(clippy::len_without_is_empty)]
45 pub fn len(&self) -> u32 {
46 self.len
47 }
48
49 pub fn set_len(&mut self, len: u32) {
50 self.len = len;
51 }
52
53 pub fn cookie(&self) -> usize {
54 self.cookie
55 }
56
57 pub fn set_cookie(&mut self, cookie: usize) {
58 self.cookie = cookie;
59 }
60
61 pub fn encoded_addr_range(&self) -> Range<usize> {
62 let start = self.encoded_addr();
63 let len = self.len().try_into().unwrap();
64 start..start.checked_add(len).unwrap()
65 }
66}