@@ -27,13 +27,13 @@ impl<const N: usize> Display for StringInline<N> {
27
27
28
28
/// 解析设备树。
29
29
pub ( crate ) fn parse ( opaque : usize ) -> BoardInfo {
30
- use dtb_walker:: { Dtb , DtbObj , Property , WalkOperation :: * } ;
31
- const CPUS : & [ u8 ] = b "cpus";
32
- const MEMORY : & [ u8 ] = b "memory";
33
- const SOC : & [ u8 ] = b "soc";
34
- const UART : & [ u8 ] = b "uart";
35
- const TEST : & [ u8 ] = b "test";
36
- const CLINT : & [ u8 ] = b "clint";
30
+ use dtb_walker:: { Dtb , DtbObj , HeaderError as E , Property , Str , WalkOperation :: * } ;
31
+ const CPUS : & str = "cpus" ;
32
+ const MEMORY : & str = "memory" ;
33
+ const SOC : & str = "soc" ;
34
+ const UART : & str = "uart" ;
35
+ const TEST : & str = "test" ;
36
+ const CLINT : & str = "clint" ;
37
37
38
38
let mut ans = BoardInfo {
39
39
dtb : opaque..opaque,
@@ -44,37 +44,42 @@ pub(crate) fn parse(opaque: usize) -> BoardInfo {
44
44
test : 0 ..0 ,
45
45
clint : 0 ..0 ,
46
46
} ;
47
- let dtb = unsafe { Dtb :: from_raw_parts ( opaque as _ ) } . unwrap ( ) ;
47
+ let dtb = unsafe {
48
+ Dtb :: from_raw_parts_filtered ( opaque as _ , |e| {
49
+ matches ! ( e, E :: Misaligned ( 4 ) | E :: LastCompVersion ( 16 ) )
50
+ } )
51
+ }
52
+ . unwrap ( ) ;
48
53
ans. dtb . end += dtb. total_size ( ) ;
49
- dtb. walk ( |path , obj| match obj {
54
+ dtb. walk ( |ctx , obj| match obj {
50
55
DtbObj :: SubNode { name } => {
51
- let current = path . last ( ) ;
52
- if current . is_empty ( ) {
53
- if name == CPUS || name == SOC || name. starts_with ( MEMORY ) {
56
+ let current = ctx . name ( ) ;
57
+ if ctx . is_root ( ) {
58
+ if name == Str :: from ( CPUS ) || name == Str :: from ( SOC ) || name. starts_with ( MEMORY ) {
54
59
StepInto
55
60
} else {
56
61
StepOver
57
62
}
58
- } else if current == SOC {
63
+ } else if current == Str :: from ( SOC ) {
59
64
if name. starts_with ( UART ) || name. starts_with ( TEST ) || name. starts_with ( CLINT ) {
60
65
StepInto
61
66
} else {
62
67
StepOver
63
68
}
64
69
} else {
65
- if current == CPUS && name. starts_with ( b "cpu@") {
70
+ if current == Str :: from ( CPUS ) && name. starts_with ( "cpu@" ) {
66
71
ans. smp += 1 ;
67
72
}
68
73
StepOver
69
74
}
70
75
}
71
- DtbObj :: Property ( Property :: Model ( model) ) if path . last ( ) . is_empty ( ) => {
76
+ DtbObj :: Property ( Property :: Model ( model) ) if ctx . is_root ( ) => {
72
77
ans. model . 0 = model. as_bytes ( ) . len ( ) ;
73
78
ans. model . 1 [ ..ans. model . 0 ] . copy_from_slice ( model. as_bytes ( ) ) ;
74
79
StepOver
75
80
}
76
81
DtbObj :: Property ( Property :: Reg ( mut reg) ) => {
77
- let node = path . last ( ) ;
82
+ let node = ctx . name ( ) ;
78
83
if node. starts_with ( UART ) {
79
84
ans. uart = reg. next ( ) . unwrap ( ) ;
80
85
StepOut
0 commit comments