uefi_raw/
status.rs

1use core::fmt::Debug;
2
3newtype_enum! {
4/// UEFI uses status codes in order to report successes, errors, and warnings.
5///
6/// The spec allows implementation-specific status codes, so the `Status`
7/// constants are not a comprehensive list of all possible values.
8#[must_use]
9pub enum Status: usize => {
10    /// The operation completed successfully.
11    SUCCESS                 =  0,
12
13    /// The string contained characters that could not be rendered and were skipped.
14    WARN_UNKNOWN_GLYPH      =  1,
15    /// The handle was closed, but the file was not deleted.
16    WARN_DELETE_FAILURE     =  2,
17    /// The handle was closed, but the data to the file was not flushed properly.
18    WARN_WRITE_FAILURE      =  3,
19    /// The resulting buffer was too small, and the data was truncated.
20    WARN_BUFFER_TOO_SMALL   =  4,
21    /// The data has not been updated within the timeframe set by local policy.
22    WARN_STALE_DATA         =  5,
23    /// The resulting buffer contains UEFI-compliant file system.
24    WARN_FILE_SYSTEM        =  6,
25    /// The operation will be processed across a system reset.
26    WARN_RESET_REQUIRED     =  7,
27
28    /// The image failed to load.
29    LOAD_ERROR              = Self::ERROR_BIT |  1,
30    /// A parameter was incorrect.
31    INVALID_PARAMETER       = Self::ERROR_BIT |  2,
32    /// The operation is not supported.
33    UNSUPPORTED             = Self::ERROR_BIT |  3,
34    /// The buffer was not the proper size for the request.
35    BAD_BUFFER_SIZE         = Self::ERROR_BIT |  4,
36    /// The buffer is not large enough to hold the requested data.
37    /// The required buffer size is returned in the appropriate parameter.
38    BUFFER_TOO_SMALL        = Self::ERROR_BIT |  5,
39    /// There is no data pending upon return.
40    NOT_READY               = Self::ERROR_BIT |  6,
41    /// The physical device reported an error while attempting the operation.
42    DEVICE_ERROR            = Self::ERROR_BIT |  7,
43    /// The device cannot be written to.
44    WRITE_PROTECTED         = Self::ERROR_BIT |  8,
45    /// A resource has run out.
46    OUT_OF_RESOURCES        = Self::ERROR_BIT |  9,
47    /// An inconstency was detected on the file system.
48    VOLUME_CORRUPTED        = Self::ERROR_BIT | 10,
49    /// There is no more space on the file system.
50    VOLUME_FULL             = Self::ERROR_BIT | 11,
51    /// The device does not contain any medium to perform the operation.
52    NO_MEDIA                = Self::ERROR_BIT | 12,
53    /// The medium in the device has changed since the last access.
54    MEDIA_CHANGED           = Self::ERROR_BIT | 13,
55    /// The item was not found.
56    NOT_FOUND               = Self::ERROR_BIT | 14,
57    /// Access was denied.
58    ACCESS_DENIED           = Self::ERROR_BIT | 15,
59    /// The server was not found or did not respond to the request.
60    NO_RESPONSE             = Self::ERROR_BIT | 16,
61    /// A mapping to a device does not exist.
62    NO_MAPPING              = Self::ERROR_BIT | 17,
63    /// The timeout time expired.
64    TIMEOUT                 = Self::ERROR_BIT | 18,
65    /// The protocol has not been started.
66    NOT_STARTED             = Self::ERROR_BIT | 19,
67    /// The protocol has already been started.
68    ALREADY_STARTED         = Self::ERROR_BIT | 20,
69    /// The operation was aborted.
70    ABORTED                 = Self::ERROR_BIT | 21,
71    /// An ICMP error occurred during the network operation.
72    ICMP_ERROR              = Self::ERROR_BIT | 22,
73    /// A TFTP error occurred during the network operation.
74    TFTP_ERROR              = Self::ERROR_BIT | 23,
75    /// A protocol error occurred during the network operation.
76    PROTOCOL_ERROR          = Self::ERROR_BIT | 24,
77    /// The function encountered an internal version that was
78    /// incompatible with a version requested by the caller.
79    INCOMPATIBLE_VERSION    = Self::ERROR_BIT | 25,
80    /// The function was not performed due to a security violation.
81    SECURITY_VIOLATION      = Self::ERROR_BIT | 26,
82    /// A CRC error was detected.
83    CRC_ERROR               = Self::ERROR_BIT | 27,
84    /// Beginning or end of media was reached
85    END_OF_MEDIA            = Self::ERROR_BIT | 28,
86    /// The end of the file was reached.
87    END_OF_FILE             = Self::ERROR_BIT | 31,
88    /// The language specified was invalid.
89    INVALID_LANGUAGE        = Self::ERROR_BIT | 32,
90    /// The security status of the data is unknown or compromised and
91    /// the data must be updated or replaced to restore a valid security status.
92    COMPROMISED_DATA        = Self::ERROR_BIT | 33,
93    /// There is an address conflict address allocation
94    IP_ADDRESS_CONFLICT     = Self::ERROR_BIT | 34,
95    /// A HTTP error occurred during the network operation.
96    HTTP_ERROR              = Self::ERROR_BIT | 35,
97}}
98
99impl Status {
100    /// Bit indicating that an UEFI status code is an error.
101    pub const ERROR_BIT: usize = 1 << (core::mem::size_of::<usize>() * 8 - 1);
102
103    /// Returns true if status code indicates success.
104    #[inline]
105    #[must_use]
106    pub fn is_success(self) -> bool {
107        self == Self::SUCCESS
108    }
109
110    /// Returns true if status code indicates a warning.
111    #[inline]
112    #[must_use]
113    pub fn is_warning(self) -> bool {
114        (self != Self::SUCCESS) && (self.0 & Self::ERROR_BIT == 0)
115    }
116
117    /// Returns true if the status code indicates an error.
118    #[inline]
119    #[must_use]
120    pub const fn is_error(self) -> bool {
121        self.0 & Self::ERROR_BIT != 0
122    }
123}
124
125impl core::fmt::Display for Status {
126    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
127        Debug::fmt(self, f)
128    }
129}