Skip to main content

islet_rmm/rmi/rec/
mpidr.rs

1use armv9a::{define_bitfield, define_bits, define_mask};
2
3// B3.4.16 RmiRecMpidr type
4define_bits!(
5    MPIDR,
6    AFF3[31 - 24],
7    AFF2[23 - 16],
8    AFF1[15 - 8],
9    AFF0[3 - 0]
10);
11
12impl From<u64> for MPIDR {
13    fn from(val: u64) -> Self {
14        Self(val)
15    }
16}
17
18impl MPIDR {
19    // B2.30 RecIndex function
20    pub fn index(&self) -> usize {
21        let aff0 = self.get_masked_value(MPIDR::AFF0) as usize;
22        let aff1 = self.get_masked_value(MPIDR::AFF1) as usize;
23        let aff2 = self.get_masked_value(MPIDR::AFF2) as usize;
24        let aff3 = self.get_masked_value(MPIDR::AFF3) as usize;
25
26        aff0 + (16 * aff1) + (16 * 256 * aff2) + (16 * 256 * 256 * aff3)
27    }
28}
29
30pub fn validate(mpidr: u64) -> bool {
31    let must_be_zero = !(MPIDR::AFF0 | MPIDR::AFF1 | MPIDR::AFF2 | MPIDR::AFF3);
32    mpidr & must_be_zero == 0
33}