@@ -32,10 +32,18 @@ pub enum Error {
3232 SeekImageEnd ,
3333 /// Unable to seek to Image header.
3434 SeekImageHeader ,
35+ /// Unable to seek to DTB start.
36+ SeekDtbStart ,
37+ /// Unable to seek to DTB end.
38+ SeekDtbEnd ,
39+ /// Device tree binary too big.
40+ DtbTooBig ,
3541 /// Unable to read kernel image.
3642 ReadKernelImage ,
3743 /// Unable to read Image header
3844 ReadImageHeader ,
45+ /// Unable to read DTB image
46+ ReadDtbImage ,
3947 /// Invalid Image binary.
4048 InvalidImage ,
4149 /// Invalid Image magic number.
@@ -48,8 +56,12 @@ impl error::Error for Error {
4856 Error :: SeekImageEnd => "Unable to seek Image end" ,
4957 Error :: SeekImageHeader => "Unable to seek image header" ,
5058 Error :: ReadImageHeader => "Unable to read Image header" ,
59+ Error :: ReadDtbImage => "Unable to read DTB image" ,
60+ Error :: SeekDtbStart => "Unable to seek DTB start" ,
61+ Error :: SeekDtbEnd => "Unable to seek DTB end" ,
5162 Error :: InvalidImage => "Invalid Image" ,
5263 Error :: InvalidImageMagicNumber => "Invalid Image magic number" ,
64+ Error :: DtbTooBig => "Device tree image too big" ,
5365 Error :: ReadKernelImage => "Unable to read kernel image" ,
5466 }
5567 }
@@ -147,6 +159,36 @@ impl KernelLoader for PE {
147159 }
148160}
149161
162+ /// Writes the device tree to the given memory slice.
163+ ///
164+ /// # Arguments
165+ ///
166+ /// * `guest_mem` - A u8 slice that will be partially overwritten by the device tree blob.
167+ /// * `guest_addr` - The address in `guest_mem` at which to load the device tree blob.
168+ /// * `dtb_image` - The device tree blob.
169+ #[ cfg( target_arch = "aarch64" ) ]
170+ pub fn load_dtb < F , M : GuestMemory > (
171+ guest_mem : & M ,
172+ guest_addr : GuestAddress ,
173+ dtb_image : & mut F ,
174+ ) -> Result < ( ) >
175+ where
176+ F : Read + Seek ,
177+ {
178+ let dtb_size = dtb_image
179+ . seek ( SeekFrom :: End ( 0 ) )
180+ . map_err ( |_| Error :: SeekDtbEnd ) ? as usize ;
181+ if dtb_size > 0x200000 {
182+ return Err ( Error :: DtbTooBig . into ( ) ) ;
183+ }
184+ dtb_image
185+ . seek ( SeekFrom :: Start ( 0 ) )
186+ . map_err ( |_| Error :: SeekDtbStart ) ?;
187+ guest_mem
188+ . read_exact_from ( guest_addr, dtb_image, dtb_size)
189+ . map_err ( |_| Error :: ReadDtbImage . into ( ) )
190+ }
191+
150192#[ cfg( test) ]
151193mod tests {
152194 use super :: * ;
0 commit comments