Skip to content

Commit 0de25fa

Browse files
authored
fix(de_mut): now #address-cells and #size-cells will only effect on children node (#20)
fix(de_mut/NodeSeq): use MultiNodeCursor instead of BodyCursor Signed-off-by: Woshiluo Luo <woshiluo.luo@outlook.com>
2 parents 9d48da6 + 0ed070d commit 0de25fa

File tree

7 files changed

+176
-36
lines changed

7 files changed

+176
-36
lines changed

examples/reg-test.dtb

435 Bytes
Binary file not shown.

src/de_mut/data.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ pub(super) enum ValueCursor {
1616
#[derive(Clone, Copy)]
1717
pub(super) struct ValueDeserializer<'de> {
1818
pub dtb: RefDtb<'de>,
19-
pub reg: RegConfig,
19+
pub self_reg: RegConfig,
20+
pub next_reg: RegConfig,
2021
pub cursor: ValueCursor,
2122
}
2223

src/de_mut/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ where
4444
// 从一个跳过根节点名字的光标初始化解析器。
4545
let mut d = ValueDeserializer {
4646
dtb,
47-
reg: RegConfig::DEFAULT,
47+
self_reg: RegConfig::DEFAULT,
48+
next_reg: RegConfig::DEFAULT,
4849
cursor: ValueCursor::NodeIn(MultiNodeCursor {
4950
start_cursor: BodyCursor::STARTER,
5051
skip_cursor: BodyCursor::ROOT, // This item will never be used.

src/de_mut/node.rs

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@ use core::marker::PhantomData;
77
use serde::de::MapAccess;
88
use serde::{Deserialize, Serialize, de};
99

10-
// TODO: Spec 2.3.5 said that we should not inherited from ancestors and the size-cell &
11-
// address-cells should only used for current node's children.
1210
#[allow(unused)]
1311
#[derive(Clone)]
1412
pub struct Node<'de> {
1513
dtb: RefDtb<'de>,
16-
reg: RegConfig,
14+
self_reg: RegConfig,
15+
next_reg: RegConfig,
1716
cursor: BodyCursor,
1817
props_start: Option<BodyCursor>,
1918
nodes_start: Option<BodyCursor>,
@@ -64,7 +63,8 @@ impl<'de> Node<'de> {
6463
};
6564
T::deserialize(&mut ValueDeserializer {
6665
dtb: self.dtb,
67-
reg: self.reg,
66+
self_reg: self.self_reg,
67+
next_reg: self.next_reg,
6868
cursor: ValueCursor::NodeIn(result),
6969
})
7070
.unwrap()
@@ -148,7 +148,7 @@ impl<'de> Iterator for NodeIter<'de, '_> {
148148
let node_cursor = c.take_node_on(dtb, name);
149149
let res = Some(Self::Item {
150150
dtb,
151-
reg: self.node.reg,
151+
reg: self.node.next_reg,
152152
node: node_cursor,
153153
name,
154154
});
@@ -175,7 +175,7 @@ impl<'de> Iterator for PropIter<'de, '_> {
175175
let res = Some(Self::Item {
176176
dtb,
177177
body: *cursor,
178-
reg: self.node.reg,
178+
reg: self.node.self_reg,
179179
prop: c,
180180
name,
181181
});
@@ -212,18 +212,21 @@ impl<'de> Deserialize<'de> for Node<'_> {
212212
// While there are entries remaining in the input, add them
213213
// into our map.
214214
let mut dtb: Option<RefDtb<'b>> = None;
215-
let mut reg: Option<RegConfig> = None;
215+
// Only update reg when props or init, because node's reg is for children.
216+
let mut self_reg: Option<RegConfig> = None;
217+
let mut next_reg: Option<RegConfig> = None;
216218
let mut props_start: Option<BodyCursor> = None;
217219
let mut nodes_start: Option<BodyCursor> = None;
218220
let mut self_cursor: Option<BodyCursor> = None;
219221
while let Some((key, value)) = access.next_entry::<&str, ValueDeserializer<'b>>()? {
220222
dtb = Some(value.dtb);
221-
reg = Some(value.reg);
222223
if key == "/" {
224+
self_reg = Some(value.self_reg);
225+
next_reg = Some(value.next_reg);
223226
self_cursor = match value.cursor {
224227
ValueCursor::NodeIn(result) => Some(result.start_cursor),
225228
_ => {
226-
unreachable!("root of NodeSeq shouble be NodeIn cursor")
229+
unreachable!("root of Node shouble be NodeIn cursor")
227230
}
228231
};
229232
continue;
@@ -233,6 +236,8 @@ impl<'de> Deserialize<'de> for Node<'_> {
233236
if props_start.is_none() {
234237
props_start = Some(cursor);
235238
}
239+
self_reg = Some(value.self_reg);
240+
next_reg = Some(value.next_reg);
236241
}
237242
ValueCursor::NodeIn(cursor) => {
238243
if nodes_start.is_none() {
@@ -245,7 +250,8 @@ impl<'de> Deserialize<'de> for Node<'_> {
245250

246251
Ok(Node {
247252
dtb: dtb.unwrap(),
248-
reg: reg.unwrap(),
253+
self_reg: self_reg.unwrap(),
254+
next_reg: next_reg.unwrap(),
249255
cursor: self_cursor.unwrap(),
250256
nodes_start,
251257
props_start,
@@ -268,7 +274,8 @@ impl<'de> NodeItem<'de> {
268274
pub fn deserialize<T: Deserialize<'de>>(&self) -> T {
269275
T::deserialize(&mut ValueDeserializer {
270276
dtb: self.dtb,
271-
reg: self.reg,
277+
self_reg: self.reg,
278+
next_reg: RegConfig::DEFAULT,
272279
cursor: ValueCursor::NodeIn(self.node),
273280
})
274281
.unwrap()
@@ -304,7 +311,8 @@ impl<'de> PropItem<'de> {
304311
use super::ValueCursor;
305312
T::deserialize(&mut ValueDeserializer {
306313
dtb: self.dtb,
307-
reg: self.reg,
314+
self_reg: self.reg,
315+
next_reg: RegConfig::DEFAULT,
308316
cursor: ValueCursor::Prop(self.body, self.prop),
309317
})
310318
.unwrap()

src/de_mut/node_seq.rs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::{BodyCursor, Cursor, RefDtb, RegConfig, ValueCursor, ValueDeserializer};
1+
use super::{Cursor, MultiNodeCursor, RefDtb, RegConfig, ValueCursor, ValueDeserializer};
22
use core::{fmt::Debug, marker::PhantomData};
33
use serde::de::SeqAccess;
44
use serde::{Deserialize, de};
@@ -25,7 +25,7 @@ pub struct NodeSeqIter<'de, 'b> {
2525
pub struct NodeSeqItem<'de> {
2626
dtb: RefDtb<'de>,
2727
reg: RegConfig,
28-
body: BodyCursor,
28+
body: MultiNodeCursor,
2929
at: &'de str,
3030
}
3131

@@ -75,13 +75,10 @@ impl<'de> Deserialize<'de> for NodeSeq<'_> {
7575
}
7676
}
7777

78-
serde::Deserializer::deserialize_seq(
79-
deserializer,
80-
Visitor {
81-
marker: PhantomData,
82-
lifetime: PhantomData,
83-
},
84-
)
78+
deserializer.deserialize_seq(Visitor {
79+
marker: PhantomData,
80+
lifetime: PhantomData,
81+
})
8582
}
8683
}
8784

@@ -144,8 +141,8 @@ impl<'de> Iterator for NodeSeqIter<'de, '_> {
144141

145142
Some(Self::Item {
146143
dtb: self.de.dtb,
147-
reg: self.de.reg,
148-
body: node_reuslt.data_cursor,
144+
reg: self.de.self_reg,
145+
body: node_reuslt,
149146
at: suf_name,
150147
})
151148
}
@@ -167,8 +164,9 @@ impl<'de> NodeSeqItem<'de> {
167164
pub fn deserialize<T: Deserialize<'de>>(&self) -> T {
168165
T::deserialize(&mut ValueDeserializer {
169166
dtb: self.dtb,
170-
reg: self.reg,
171-
cursor: ValueCursor::Body(self.body),
167+
self_reg: self.reg,
168+
next_reg: RegConfig::DEFAULT,
169+
cursor: ValueCursor::NodeIn(self.body),
172170
})
173171
.unwrap()
174172
}

src/de_mut/reg.rs

Lines changed: 127 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ impl<'de> Deserialize<'de> for Reg<'_> {
4444

4545
let inner = Inner {
4646
dtb: value_deserialzer.dtb,
47-
reg: value_deserialzer.reg,
47+
reg: value_deserialzer.self_reg,
4848
cursor: match value_deserialzer.cursor {
4949
ValueCursor::Prop(_, cursor) => cursor,
5050
_ => {
@@ -85,6 +85,8 @@ impl Iterator for RegIter<'_> {
8585
type Item = RegRegion;
8686

8787
fn next(&mut self) -> Option<Self::Item> {
88+
println!("{:?}", self.config.address_cells);
89+
println!("{:?}", self.config.size_cells);
8890
let len = BLOCK_LEN * (self.config.address_cells + self.config.size_cells);
8991
if self.data.len() >= len {
9092
let (current_block, data) = self.data.split_at(len);
@@ -126,3 +128,127 @@ impl Serialize for Reg<'_> {
126128
serializer.serialize_bytes(self.0.cursor.data_on(self.0.dtb))
127129
}
128130
}
131+
132+
#[cfg(test)]
133+
mod tests {
134+
use crate::buildin::{Node, NodeSeq, Reg};
135+
use crate::{Dtb, DtbPtr, from_raw_mut};
136+
use serde::Deserialize;
137+
138+
const RAW_DEVICE_TREE: &[u8] = include_bytes!("../../examples/reg-test.dtb");
139+
const BUFFER_SIZE: usize = RAW_DEVICE_TREE.len();
140+
#[repr(align(8))]
141+
struct AlignedBuffer {
142+
pub data: [u8; RAW_DEVICE_TREE.len()],
143+
}
144+
145+
/// Memory range.
146+
#[derive(Deserialize)]
147+
#[serde(rename_all = "kebab-case")]
148+
pub struct Memory<'a> {
149+
pub reg: Reg<'a>,
150+
}
151+
#[test]
152+
fn test_normal_reg() {
153+
#[derive(Deserialize)]
154+
pub struct Tree<'a> {
155+
/// Memory information.
156+
pub normal: Memory<'a>,
157+
}
158+
let mut aligned_data: Box<AlignedBuffer> = Box::new(AlignedBuffer {
159+
data: [0; BUFFER_SIZE],
160+
});
161+
aligned_data.data[..BUFFER_SIZE].clone_from_slice(RAW_DEVICE_TREE);
162+
let mut slice = aligned_data.data.to_vec();
163+
let ptr = DtbPtr::from_raw(slice.as_mut_ptr()).unwrap();
164+
let dtb = Dtb::from(ptr).share();
165+
166+
let node: Tree = from_raw_mut(&dtb).unwrap();
167+
assert_eq!(
168+
node.normal.reg.iter().next().unwrap().0,
169+
1342177280..1408237568
170+
);
171+
}
172+
#[test]
173+
fn test_normal_reg_node() {
174+
let mut aligned_data: Box<AlignedBuffer> = Box::new(AlignedBuffer {
175+
data: [0; BUFFER_SIZE],
176+
});
177+
aligned_data.data[..BUFFER_SIZE].clone_from_slice(RAW_DEVICE_TREE);
178+
let mut slice = aligned_data.data.to_vec();
179+
let ptr = DtbPtr::from_raw(slice.as_mut_ptr()).unwrap();
180+
let dtb = Dtb::from(ptr).share();
181+
182+
let node: Node = from_raw_mut(&dtb).unwrap();
183+
let reg = node
184+
.find("/normal")
185+
.unwrap()
186+
.get_prop("reg")
187+
.unwrap()
188+
.deserialize::<Reg>();
189+
assert_eq!(reg.iter().next().unwrap().0, 1342177280..1408237568);
190+
}
191+
#[test]
192+
fn test_depper_normal_reg_node() {
193+
let mut aligned_data: Box<AlignedBuffer> = Box::new(AlignedBuffer {
194+
data: [0; BUFFER_SIZE],
195+
});
196+
aligned_data.data[..BUFFER_SIZE].clone_from_slice(RAW_DEVICE_TREE);
197+
let mut slice = aligned_data.data.to_vec();
198+
let ptr = DtbPtr::from_raw(slice.as_mut_ptr()).unwrap();
199+
let dtb = Dtb::from(ptr).share();
200+
201+
let node: Node = from_raw_mut(&dtb).unwrap();
202+
let reg = node
203+
.find("/seq/node@2/normal")
204+
.unwrap()
205+
.get_prop("reg")
206+
.unwrap()
207+
.deserialize::<Reg>();
208+
assert_eq!(reg.iter().next().unwrap().0, 1342177280..1408237568);
209+
}
210+
#[test]
211+
fn test_seq_reg_node() {
212+
#[derive(Deserialize)]
213+
pub struct Tree<'a> {
214+
pub seq: Seq<'a>,
215+
}
216+
#[derive(Deserialize)]
217+
pub struct Seq<'a> {
218+
pub node: NodeSeq<'a>,
219+
}
220+
let mut aligned_data: Box<AlignedBuffer> = Box::new(AlignedBuffer {
221+
data: [0; BUFFER_SIZE],
222+
});
223+
aligned_data.data[..BUFFER_SIZE].clone_from_slice(RAW_DEVICE_TREE);
224+
let mut slice = aligned_data.data.to_vec();
225+
let ptr = DtbPtr::from_raw(slice.as_mut_ptr()).unwrap();
226+
let dtb = Dtb::from(ptr).share();
227+
228+
let node: Tree = from_raw_mut(&dtb).unwrap();
229+
let mut iter = node.seq.node.iter();
230+
let node1 = iter.next().unwrap();
231+
assert_eq!(
232+
node1.deserialize::<Memory>().reg.iter().next().unwrap().0,
233+
1..4294967298
234+
);
235+
let node2 = iter.next().unwrap();
236+
assert_eq!(
237+
node2.deserialize::<Memory>().reg.iter().next().unwrap().0,
238+
2..4
239+
);
240+
let node3 = iter.next().unwrap();
241+
assert_eq!(
242+
node3
243+
.deserialize::<Node>()
244+
.get_prop("reg")
245+
.unwrap()
246+
.deserialize::<Reg>()
247+
.iter()
248+
.next()
249+
.unwrap()
250+
.0,
251+
3..12884901894
252+
);
253+
}
254+
}

0 commit comments

Comments
 (0)