Skip to main content

islet_rmm/rmi/
error.rs

1use crate::{measurement::MeasurementError, rsi};
2
3use safe_abstraction::raw_ptr;
4
5// B3.4.1 RmiCommandReturnCode type
6// Default index is 0
7#[derive(Debug)]
8pub enum Error {
9    RmiErrorInput,
10    RmiErrorRealm(usize),
11    RmiErrorRec,
12    RmiErrorRtt(usize),
13    RmiErrorInUse,
14    RmiErrorCount,
15    //// The below are our-defined errors not in TF-RMM
16    RmiErrorOthers(InternalError),
17}
18
19#[derive(Debug)]
20pub enum InternalError {
21    NotExistRealm,
22    MeasurementError,
23    InvalidMeasurementIndex,
24}
25
26impl From<Error> for usize {
27    fn from(err: Error) -> Self {
28        match err {
29            Error::RmiErrorInput => 1,
30            Error::RmiErrorRealm(index) => 2 | (index << 8),
31            Error::RmiErrorRec => 3,
32            Error::RmiErrorRtt(level) => 4 | (level << 8),
33            Error::RmiErrorInUse => 5,
34            Error::RmiErrorCount => 6,
35            Error::RmiErrorOthers(_) => 7,
36        }
37    }
38}
39
40impl From<vmsa::error::Error> for Error {
41    fn from(_e: vmsa::error::Error) -> Self {
42        //error!("MmError occured: {}", <Error as Into<usize>>::into(e));
43        Error::RmiErrorInput
44    }
45}
46
47impl From<MeasurementError> for Error {
48    fn from(_value: MeasurementError) -> Self {
49        Error::RmiErrorOthers(InternalError::MeasurementError)
50    }
51}
52
53impl From<rsi::error::Error> for Error {
54    fn from(value: rsi::error::Error) -> Self {
55        match value {
56            rsi::error::Error::RealmDoesNotExists => {
57                Self::RmiErrorOthers(InternalError::NotExistRealm)
58            }
59            _ => Self::RmiErrorOthers(InternalError::InvalidMeasurementIndex),
60        }
61    }
62}
63
64impl From<raw_ptr::Error> for Error {
65    fn from(error: raw_ptr::Error) -> Self {
66        error!("Failed to convert a raw pointer to the struct. {:?}", error);
67        Error::RmiErrorInput
68    }
69}