Skip to content

Commit 3c2eabf

Browse files
committed
feat: 移除不必要的上下文信息,简化属性迭代器和 reg 属性结构
1 parent d2946a9 commit 3c2eabf

File tree

5 files changed

+11
-123
lines changed

5 files changed

+11
-123
lines changed

fdt-raw/src/data.rs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,6 @@ impl<'a> Bytes<'a> {
2626
range: 0..all.len(),
2727
}
2828
}
29-
30-
pub(crate) fn new_at(all: &'a [u8], start: usize, len: usize) -> Self {
31-
assert!(start + len <= all.len());
32-
Self {
33-
all,
34-
range: start..start + len,
35-
}
36-
}
37-
3829
pub fn slice(&self, range: Range<usize>) -> Self {
3930
assert!(range.end <= self.len());
4031
Self {

fdt-raw/src/node/mod.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,7 @@ impl<'a> NodeBase<'a> {
6868

6969
/// 获取节点属性迭代器
7070
pub fn properties(&self) -> PropIter<'a> {
71-
PropIter::new(
72-
self.data.reader(),
73-
self.strings.clone(),
74-
self.context.clone(),
75-
)
71+
PropIter::new(self.data.reader(), self.strings.clone())
7672
}
7773

7874
/// 查找指定名称的属性

fdt-raw/src/node/prop/mod.rs

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@ use core::fmt;
77

88
use log::error;
99

10-
pub use reg::{Reg, RegInfo, RegIter};
10+
pub use reg::{RegInfo, RegIter};
1111

12-
use super::NodeContext;
1312
use crate::{
1413
FdtError, Phandle, Status, Token,
1514
data::{Bytes, Reader, StrIter, U32Iter},
@@ -172,15 +171,6 @@ impl<'a> Property<'a> {
172171
}
173172
}
174173

175-
/// 获取为 reg 属性(需要 context 信息)
176-
pub fn as_reg(&self, address_cells: u32, size_cells: u32) -> Option<Reg<'a>> {
177-
if self.name == "reg" {
178-
Some(Reg::new(self.data.as_slice(), address_cells as u8, size_cells as u8))
179-
} else {
180-
None
181-
}
182-
}
183-
184174
/// 是否为 dma-coherent 属性
185175
pub fn is_dma_coherent(&self) -> bool {
186176
self.name == "dma-coherent" && self.data.is_empty()
@@ -294,16 +284,15 @@ fn format_bytes(f: &mut fmt::Formatter<'_>, data: &[u8]) -> fmt::Result {
294284
pub struct PropIter<'a> {
295285
reader: Reader<'a>,
296286
strings: Bytes<'a>,
297-
context: NodeContext,
298287
finished: bool,
299288
}
300289

301290
impl<'a> PropIter<'a> {
302-
pub(crate) fn new(reader: Reader<'a>, strings: Bytes<'a>, context: NodeContext) -> Self {
291+
pub(crate) fn new(reader: Reader<'a>, strings: Bytes<'a>) -> Self {
303292
Self {
304293
reader,
305294
strings,
306-
context,
295+
307296
finished: false,
308297
}
309298
}

fdt-raw/src/node/prop/reg.rs

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,6 @@
11
//! Reg 属性相关类型
22
3-
use crate::data::{Bytes, Reader, U32Iter};
4-
5-
/// Reg 属性包装器
6-
#[derive(Clone)]
7-
pub struct Reg<'a> {
8-
data: &'a [u8],
9-
address_cells: u8,
10-
size_cells: u8,
11-
}
12-
13-
impl<'a> Reg<'a> {
14-
pub(crate) fn new(data: &'a [u8], address_cells: u8, size_cells: u8) -> Self {
15-
Self {
16-
data,
17-
address_cells,
18-
size_cells,
19-
}
20-
}
21-
22-
/// 获取 reg 数据的原始字节
23-
pub fn as_slice(&self) -> &[u8] {
24-
self.data
25-
}
26-
27-
/// 获取 u32 迭代器
28-
pub fn as_u32_iter(&self) -> U32Iter<'a> {
29-
Bytes::new(self.data).as_u32_iter()
30-
}
31-
32-
/// 获取 reg 信息迭代器
33-
pub fn iter(&self) -> RegIter<'a> {
34-
let bytes = Bytes::new(self.data);
35-
RegIter::new(bytes.reader(), self.address_cells, self.size_cells)
36-
}
37-
}
3+
use crate::data::Reader;
384

395
/// Reg 条目信息
406
#[derive(Debug, Clone, Copy, PartialEq, Eq)]

fdt-raw/tests/node.rs

Lines changed: 6 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,10 @@ fn test_memory_in_fdt(raw: &[u8], name: &str) {
731731
for node in fdt.all_nodes() {
732732
if node.name().starts_with("memory@") || node.name() == "memory" {
733733
memory_nodes_found += 1;
734+
735+
let reg = node.reg().expect("Memory node should have reg property");
736+
let reg_infos: Vec<_> = reg.collect();
737+
734738
info!(
735739
"[{}] Found memory node: {} (level={})",
736740
name,
@@ -763,28 +767,14 @@ fn test_memory_in_fdt(raw: &[u8], name: &str) {
763767
s
764768
);
765769
info!("[{}] device_type = \"{}\"", name, s);
766-
} else if let Some(reg) = prop.as_reg(
767-
node.context.parent_address_cells.into(),
768-
node.context.parent_size_cells.into(),
769-
) {
770+
770771
found_reg = true;
771-
let reg_infos: Vec<_> = reg.iter().collect();
772-
let u32_values: Vec<_> = reg.as_u32_iter().collect();
773772

774773
info!("[{}] reg property found:", name);
775774
info!(
776775
"[{}] address_cells={}, size_cells={}",
777-
name,
778-
node.context.parent_address_cells,
779-
node.context.parent_size_cells
780-
);
781-
info!(
782-
"[{}] raw data ({} bytes): {:02x?}",
783-
name,
784-
reg.as_slice().len(),
785-
reg.as_slice()
776+
name, node.context.parent_address_cells, node.context.parent_size_cells
786777
);
787-
info!("[{}] u32 values: {:x?}", name, u32_values);
788778

789779
// 平台特定验证
790780
if name == "QEMU" {
@@ -809,23 +799,6 @@ fn test_memory_in_fdt(raw: &[u8], name: &str) {
809799
reg_info.size
810800
);
811801

812-
// 验证 u32 值格式
813-
assert_eq!(
814-
u32_values.len(),
815-
4,
816-
"QEMU memory reg should have 4 u32 values"
817-
);
818-
assert_eq!(u32_values[0], 0x0, "QEMU memory high address should be 0");
819-
assert_eq!(
820-
u32_values[1], 0x40000000,
821-
"QEMU memory low address should be 0x40000000"
822-
);
823-
assert_eq!(u32_values[2], 0x0, "QEMU memory high size should be 0");
824-
assert_eq!(
825-
u32_values[3], 0x8000000,
826-
"QEMU memory low size should be 0x8000000"
827-
);
828-
829802
info!(
830803
"[{}] QEMU memory validated: address={:#x}, size={} bytes",
831804
name,
@@ -841,36 +814,9 @@ fn test_memory_in_fdt(raw: &[u8], name: &str) {
841814
"[{}] reg[{}]: address={:#x}, size={:?}",
842815
name, i, reg_info.address, reg_info.size
843816
);
844-
845-
// RPi 4B 的特殊情况 - 当前测试数据显示地址和大小为0
846-
// 这可能是测试数据的特殊情况,我们只验证基本结构
847-
if node.context.parent_size_cells == 1 {
848-
assert_eq!(
849-
reg.as_slice().len() % 12,
850-
0,
851-
"RPi 4B reg data should be multiple of 12 bytes (2+1 cells)"
852-
);
853-
} else {
854-
assert_eq!(
855-
reg.as_slice().len() % 16,
856-
0,
857-
"RPi 4B reg data should be multiple of 16 bytes (2+2 cells)"
858-
);
859-
}
860817
}
861818
}
862819

863-
// 验证 reg 数据长度的一致性
864-
let expected_entry_size =
865-
(node.context.parent_address_cells + node.context.parent_size_cells) * 4;
866-
assert_eq!(
867-
reg.as_slice().len() % expected_entry_size as usize,
868-
0,
869-
"Reg data length should be multiple of entry size {} for node {}",
870-
expected_entry_size,
871-
node.name()
872-
);
873-
874820
for (i, reg_info) in reg_infos.iter().enumerate() {
875821
info!(
876822
"[{}] reg[{}]: address={:#x}, size={:?}",

0 commit comments

Comments
 (0)