qemu_virt/
qemu-virt.rs

1use dtb_walker::{utils::indent, Dtb, DtbObj, HeaderError, WalkOperation};
2
3const DEVICE_TREE: &[u8] = include_bytes!("qemu-virt.dtb");
4const INDENT_WIDTH: usize = 4;
5
6fn main() {
7    let mut aligned = vec![0usize; DEVICE_TREE.len() / core::mem::size_of::<usize>()];
8    unsafe {
9        aligned
10            .as_mut_ptr()
11            .copy_from_nonoverlapping(DEVICE_TREE.as_ptr() as _, aligned.len());
12    }
13
14    let dtb = unsafe {
15        Dtb::from_raw_parts_filtered(aligned.as_ptr() as _, |e| {
16            matches!(
17                e,
18                HeaderError::Misaligned(4) | HeaderError::LastCompVersion(16)
19            )
20        })
21    }
22    .unwrap();
23    dtb.walk(|path, obj| match obj {
24        DtbObj::SubNode { name } => {
25            println!("{}{path}/{}", indent(path.level(), INDENT_WIDTH), unsafe {
26                core::str::from_utf8_unchecked(name)
27            });
28            WalkOperation::StepInto
29        }
30        DtbObj::Property(prop) => {
31            let indent = indent(path.level(), INDENT_WIDTH);
32            println!("{indent}{prop:?}");
33            WalkOperation::StepOver
34        }
35    });
36    println!("ok");
37}