@@ -6,12 +6,16 @@ pub mod string_block;
6
6
use crate :: common:: * ;
7
7
use crate :: ser:: patch:: Patch ;
8
8
9
+ const RSVMAP_LEN : usize = 16 ;
10
+
9
11
/// We do run-twice on convert, first time to generate string block, second time todo real
10
12
/// structure.
11
13
pub fn to_dtb < ' se , T > ( data : & T , list : & ' se [ Patch < ' se > ] , writer : & ' se mut [ u8 ] ) -> Result < ( ) , Error >
12
14
where
13
15
T : serde:: ser:: Serialize ,
14
16
{
17
+ writer. iter_mut ( ) . for_each ( |x| * x = 0 ) ;
18
+
15
19
let mut offset: usize = 0 ;
16
20
{
17
21
let mut dst = crate :: ser:: pointer:: Pointer :: new ( None ) ;
@@ -22,24 +26,37 @@ where
22
26
data. serialize ( & mut ser) ?;
23
27
} ;
24
28
list. iter ( ) . for_each ( |patch| patch. init ( ) ) ;
25
- {
26
- // Write from bottom to top, to avoid overlap.
27
- for i in ( 0 ..offset) . rev ( ) {
28
- writer[ writer. len ( ) - offset + i] = writer[ i] ;
29
- writer[ i] = 0 ;
30
- }
31
- // TODO: make sure no out of bound.
29
+ // Write from bottom to top, to avoid overlap.
30
+ for i in ( 0 ..offset) . rev ( ) {
31
+ writer[ writer. len ( ) - offset + i] = writer[ i] ;
32
+ writer[ i] = 0 ;
33
+ }
34
+ // TODO: make sure no out of bound.
32
35
33
- // -1 for end zero.
34
- let ( data_block, string_block) = writer. split_at_mut ( writer. len ( ) - offset) ;
35
- let ( _, data_block) = data_block. split_at_mut ( size_of :: < crate :: common:: Header > ( ) ) ;
36
+ let writer_len = writer. len ( ) ;
37
+ let ( data_block, string_block) = writer. split_at_mut ( writer. len ( ) - offset) ;
38
+ let ( header, data_block) = data_block. split_at_mut ( HEADER_LEN as usize + RSVMAP_LEN ) ;
39
+ {
36
40
let mut patch_list = crate :: ser:: patch:: PatchList :: new ( list) ;
37
41
let mut block = crate :: ser:: string_block:: StringBlock :: new ( string_block, & mut offset) ;
38
42
let mut dst = crate :: ser:: pointer:: Pointer :: new ( Some ( data_block) ) ;
39
43
let mut ser =
40
44
crate :: ser:: serializer:: Serializer :: new ( & mut dst, & mut block, & mut patch_list) ;
41
- ser. dst . step_by_u32 ( FDT_END ) ;
42
45
data. serialize ( & mut ser) ?;
46
+ ser. dst . step_by_u32 ( FDT_END ) ;
47
+ }
48
+ {
49
+ let header = unsafe { & mut * ( header. as_mut_ptr ( ) as * mut Header ) } ;
50
+ header. magic = u32:: from_be ( DEVICE_TREE_MAGIC ) ;
51
+ header. total_size = u32:: from_be ( writer_len as u32 ) ;
52
+ header. off_dt_struct = u32:: from_be ( HEADER_LEN + RSVMAP_LEN as u32 ) ;
53
+ header. off_dt_strings = u32:: from_be ( ( writer_len - offset) as u32 ) ;
54
+ header. off_mem_rsvmap = u32:: from_be ( HEADER_LEN ) ;
55
+ header. version = u32:: from_be ( SUPPORTED_VERSION ) ;
56
+ header. last_comp_version = u32:: from_be ( SUPPORTED_VERSION ) ; // TODO: maybe 16
57
+ header. boot_cpuid_phys = 0 ; // TODO: wtf is this prop
58
+ header. size_dt_strings = u32:: from_be ( offset as u32 ) ;
59
+ header. size_dt_struct = u32:: from_be ( data_block. len ( ) as u32 ) ; // TODO: correct?
43
60
}
44
61
Ok ( ( ) )
45
62
}
0 commit comments