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