fdt_raw/
define.rs

1use core::{
2    ffi::FromBytesUntilNulError,
3    fmt::{Debug, Display},
4    ops::Deref,
5};
6
7pub const FDT_MAGIC: u32 = 0xd00dfeed;
8
9/// Memory reservation block entry
10#[derive(Clone, Debug, Default)]
11pub struct MemoryReservation {
12    pub address: u64,
13    pub size: u64,
14}
15
16#[derive(Debug, PartialEq, Eq, Clone, Copy)]
17pub enum Token {
18    BeginNode,
19    EndNode,
20    Prop,
21    Nop,
22    End,
23    Data(u32),
24}
25
26impl From<u32> for Token {
27    fn from(value: u32) -> Self {
28        match value {
29            0x1 => Token::BeginNode,
30            0x2 => Token::EndNode,
31            0x3 => Token::Prop,
32            0x4 => Token::Nop,
33            0x9 => Token::End,
34            _ => Token::Data(value),
35        }
36    }
37}
38
39impl From<Token> for u32 {
40    fn from(value: Token) -> Self {
41        match value {
42            Token::BeginNode => 0x1,
43            Token::EndNode => 0x2,
44            Token::Prop => 0x3,
45            Token::Nop => 0x4,
46            Token::End => 0x9,
47            Token::Data(v) => v,
48        }
49    }
50}
51
52#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
53pub enum Status {
54    Okay,
55    Disabled,
56}
57
58impl Deref for Status {
59    type Target = str;
60
61    fn deref(&self) -> &Self::Target {
62        match self {
63            Status::Okay => "okay",
64            Status::Disabled => "disabled",
65        }
66    }
67}
68
69impl core::fmt::Display for Status {
70    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
71        write!(f, "{}", self.deref())
72    }
73}
74
75#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
76#[repr(transparent)]
77pub struct Phandle(u32);
78
79impl From<u32> for Phandle {
80    fn from(value: u32) -> Self {
81        Self(value)
82    }
83}
84impl Phandle {
85    pub fn as_usize(&self) -> usize {
86        self.0 as usize
87    }
88
89    pub fn raw(&self) -> u32 {
90        self.0
91    }
92}
93
94impl Display for Phandle {
95    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
96        write!(f, "<{:#x}>", self.0)
97    }
98}
99
100#[derive(thiserror::Error, Debug, Clone)]
101pub enum FdtError {
102    #[error("not found")]
103    NotFound,
104    #[error("buffer too small at position {pos}")]
105    BufferTooSmall { pos: usize },
106    #[error("invalid magic number {0:#x} != {FDT_MAGIC:#x}")]
107    InvalidMagic(u32),
108    #[error("invalid pointer")]
109    InvalidPtr,
110    #[error("invalid input")]
111    InvalidInput,
112    #[error("data provided does not contain a nul")]
113    FromBytesUntilNull,
114    #[error("failed to parse UTF-8 string")]
115    Utf8Parse,
116    #[error("no aliase `{0}` found")]
117    NoAlias(&'static str),
118    #[error("system out of memory")]
119    NoMemory,
120    #[error("node `{0}` not found")]
121    NodeNotFound(&'static str),
122    #[error("property `{0}` not found")]
123    PropertyNotFound(&'static str),
124}
125
126impl From<core::str::Utf8Error> for FdtError {
127    fn from(_: core::str::Utf8Error) -> Self {
128        FdtError::Utf8Parse
129    }
130}
131impl From<FromBytesUntilNulError> for FdtError {
132    fn from(_: FromBytesUntilNulError) -> Self {
133        FdtError::FromBytesUntilNull
134    }
135}