@@ -52,6 +52,8 @@ pub enum Error {
52
52
CommandLineCopy ,
53
53
/// Command line overflowed guest memory.
54
54
CommandLineOverflow ,
55
+ /// Device tree bianry too big.
56
+ DtbTooBig ,
55
57
/// Invalid ELF magic number
56
58
InvalidElfMagicNumber ,
57
59
/// Invalid program header size.
@@ -84,6 +86,8 @@ pub enum Error {
84
86
ReadBzImageCompressedKernel ,
85
87
/// Unable to read Image header
86
88
ReadImageHeader ,
89
+ /// Unable to read DTB image
90
+ ReadDtbImage ,
87
91
/// Unable to seek to kernel start.
88
92
SeekKernelStart ,
89
93
/// Unable to seek to ELF start.
@@ -100,6 +104,10 @@ pub enum Error {
100
104
SeekImageEnd ,
101
105
/// Unable to seek to Image header.
102
106
SeekImageHeader ,
107
+ /// Unable to seek to DTB start.
108
+ SeekDtbStart ,
109
+ /// Unable to seek to DTB end.
110
+ SeekDtbEnd ,
103
111
}
104
112
105
113
/// A specialized `Result` type for the kernel loader.
@@ -113,6 +121,7 @@ impl error::Error for Error {
113
121
}
114
122
Error :: CommandLineCopy => "Failed writing command line to guest memory" ,
115
123
Error :: CommandLineOverflow => "Command line overflowed guest memory" ,
124
+ Error :: DtbTooBig => "Device tree image too big" ,
116
125
Error :: InvalidElfMagicNumber => "Invalid Elf magic number" ,
117
126
Error :: InvalidProgramHeaderSize => "Invalid program header size" ,
118
127
Error :: InvalidProgramHeaderOffset => "Invalid program header offset" ,
@@ -128,6 +137,7 @@ impl error::Error for Error {
128
137
Error :: ReadProgramHeader => "Unable to read program header" ,
129
138
Error :: ReadBzImageHeader => "Unable to read bzImage header" ,
130
139
Error :: ReadImageHeader => "Unable to read Image header" ,
140
+ Error :: ReadDtbImage => "Unable to read DTB image" ,
131
141
Error :: ReadBzImageCompressedKernel => "Unable to read bzImage compressed kernel" ,
132
142
Error :: SeekKernelStart => "Unable to seek to kernel start" ,
133
143
Error :: SeekElfStart => "Unable to seek to elf start" ,
@@ -137,6 +147,8 @@ impl error::Error for Error {
137
147
Error :: SeekBzImageCompressedKernel => "Unable to seek bzImage compressed kernel" ,
138
148
Error :: SeekImageEnd => "Unable to seek Image end" ,
139
149
Error :: SeekImageHeader => "Unable to seek image header" ,
150
+ Error :: SeekDtbStart => "Unable to seek DTB start" ,
151
+ Error :: SeekDtbEnd => "Unable to seek DTB end" ,
140
152
}
141
153
}
142
154
}
@@ -422,6 +434,34 @@ pub fn load_cmdline<M: GuestMemory>(
422
434
Ok ( ( ) )
423
435
}
424
436
437
+ /// Writes the device tree to the given memory slice.
438
+ ///
439
+ /// # Arguments
440
+ ///
441
+ /// * `guest_mem` - A u8 slice that will be partially overwritten by the device tree blob.
442
+ /// * `guest_addr` - The address in `guest_mem` at which to load the device tree blob.
443
+ /// * `dtb_image` - The device tree blob.
444
+ #[ cfg( target_arch = "aarch64" ) ]
445
+ pub fn load_dtb < F , M : GuestMemory > (
446
+ guest_mem : & M ,
447
+ guest_addr : GuestAddress ,
448
+ dtb_image : & mut F ,
449
+ ) -> Result < ( ) >
450
+ where F : Read + Seek
451
+ {
452
+ let dtb_size = dtb_image
453
+ . seek ( SeekFrom :: End ( 0 ) )
454
+ . map_err ( |_| Error :: SeekDtbEnd ) ? as usize ;
455
+ if dtb_size > 0x200000 {
456
+ return Err ( Error :: DtbTooBig ) ;
457
+ }
458
+ dtb_image. seek ( SeekFrom :: Start ( 0 ) )
459
+ . map_err ( |_| Error :: SeekDtbStart ) ?;
460
+ guest_mem
461
+ . read_exact_from ( guest_addr, dtb_image, dtb_size)
462
+ . map_err ( |_| Error :: ReadDtbImage )
463
+ }
464
+
425
465
#[ cfg( feature = "image" ) ]
426
466
#[ cfg( target_arch = "aarch64" ) ]
427
467
/// ARM64 Image (PE) format support
0 commit comments