Skip to content

Commit 0f6b1ce

Browse files
crab2313andreeaflorescu
authored andcommitted
loader: device tree loading support on ARM64
Signed-off-by: Qiu Wenbo <qiuwenbo@phytium.com.cn>
1 parent 00a7496 commit 0f6b1ce

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

src/loader/aarch64/pe/mod.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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)]
151193
mod tests {
152194
use super::*;

0 commit comments

Comments
 (0)