@@ -61,6 +61,8 @@ pub enum Error {
61
61
CommandLineCopy ,
62
62
/// Command line overflowed guest memory.
63
63
CommandLineOverflow ,
64
+ /// Device tree binary too big.
65
+ DtbTooBig ,
64
66
/// Invalid ELF magic number
65
67
InvalidElfMagicNumber ,
66
68
/// Invalid program header size.
@@ -93,6 +95,8 @@ pub enum Error {
93
95
ReadBzImageCompressedKernel ,
94
96
/// Unable to read Image header
95
97
ReadImageHeader ,
98
+ /// Unable to read DTB image
99
+ ReadDtbImage ,
96
100
/// Unable to seek to kernel start.
97
101
SeekKernelStart ,
98
102
/// Unable to seek to ELF start.
@@ -109,6 +113,10 @@ pub enum Error {
109
113
SeekImageEnd ,
110
114
/// Unable to seek to Image header.
111
115
SeekImageHeader ,
116
+ /// Unable to seek to DTB start.
117
+ SeekDtbStart ,
118
+ /// Unable to seek to DTB end.
119
+ SeekDtbEnd ,
112
120
/// Unable to seek to note header.
113
121
SeekNoteHeader ,
114
122
/// Unable to read note header.
@@ -128,6 +136,7 @@ impl error::Error for Error {
128
136
}
129
137
Error :: CommandLineCopy => "Failed writing command line to guest memory" ,
130
138
Error :: CommandLineOverflow => "Command line overflowed guest memory" ,
139
+ Error :: DtbTooBig => "Device tree image too big" ,
131
140
Error :: InvalidElfMagicNumber => "Invalid Elf magic number" ,
132
141
Error :: InvalidProgramHeaderSize => "Invalid program header size" ,
133
142
Error :: InvalidProgramHeaderOffset => "Invalid program header offset" ,
@@ -143,6 +152,7 @@ impl error::Error for Error {
143
152
Error :: ReadProgramHeader => "Unable to read program header" ,
144
153
Error :: ReadBzImageHeader => "Unable to read bzImage header" ,
145
154
Error :: ReadImageHeader => "Unable to read Image header" ,
155
+ Error :: ReadDtbImage => "Unable to read DTB image" ,
146
156
Error :: ReadBzImageCompressedKernel => "Unable to read bzImage compressed kernel" ,
147
157
Error :: SeekKernelStart => "Unable to seek to kernel start" ,
148
158
Error :: SeekElfStart => "Unable to seek to elf start" ,
@@ -155,6 +165,8 @@ impl error::Error for Error {
155
165
Error :: InvalidPvhNote => "Invalid PVH note header" ,
156
166
Error :: SeekImageEnd => "Unable to seek Image end" ,
157
167
Error :: SeekImageHeader => "Unable to seek image header" ,
168
+ Error :: SeekDtbStart => "Unable to seek DTB start" ,
169
+ Error :: SeekDtbEnd => "Unable to seek DTB end" ,
158
170
}
159
171
}
160
172
}
@@ -538,6 +550,36 @@ fn align_up(addr: u64, align: u64) -> usize {
538
550
}
539
551
}
540
552
553
+ /// Writes the device tree to the given memory slice.
554
+ ///
555
+ /// # Arguments
556
+ ///
557
+ /// * `guest_mem` - A u8 slice that will be partially overwritten by the device tree blob.
558
+ /// * `guest_addr` - The address in `guest_mem` at which to load the device tree blob.
559
+ /// * `dtb_image` - The device tree blob.
560
+ #[ cfg( target_arch = "aarch64" ) ]
561
+ pub fn load_dtb < F , M : GuestMemory > (
562
+ guest_mem : & M ,
563
+ guest_addr : GuestAddress ,
564
+ dtb_image : & mut F ,
565
+ ) -> Result < ( ) >
566
+ where
567
+ F : Read + Seek ,
568
+ {
569
+ let dtb_size = dtb_image
570
+ . seek ( SeekFrom :: End ( 0 ) )
571
+ . map_err ( |_| Error :: SeekDtbEnd ) ? as usize ;
572
+ if dtb_size > 0x200000 {
573
+ return Err ( Error :: DtbTooBig ) ;
574
+ }
575
+ dtb_image
576
+ . seek ( SeekFrom :: Start ( 0 ) )
577
+ . map_err ( |_| Error :: SeekDtbStart ) ?;
578
+ guest_mem
579
+ . read_exact_from ( guest_addr, dtb_image, dtb_size)
580
+ . map_err ( |_| Error :: ReadDtbImage )
581
+ }
582
+
541
583
#[ cfg( feature = "image" ) ]
542
584
#[ cfg( target_arch = "aarch64" ) ]
543
585
/// ARM64 Image (PE) format support
0 commit comments