sel4_shared_ring_buffer/
descriptor.rs

1//
2// Copyright 2023, Colias Group, LLC
3//
4// SPDX-License-Identifier: BSD-2-Clause
5//
6
7use 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}