kernel_loader: return a struct for better naming

The new LoadedKernel structure also splits out the size and end address,
which are both used in different places (x86_64 wants end, aarch64 wants
both).

BUG=b:234155022
TEST=tools/presubmit
TEST=cargo test -p kernel_loader

Change-Id: I86a7e412c983f29a2c614cc9e6896aa11db6ba94
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/3673611
Tested-by: kokoro <noreply+kokoro@google.com>
Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
Reviewed-by: Alexandre Courbot <acourbot@chromium.org>
This commit is contained in:
Daniel Verkamp 2022-05-27 12:24:09 -07:00 committed by Chromeos LUCI
parent 21445b1b83
commit 8cac16bf75
3 changed files with 25 additions and 7 deletions

View file

@ -274,8 +274,9 @@ impl arch::LinuxArch for AArch64 {
.map_err(Error::KernelLoadFailure)?;
kernel_end = get_kernel_addr().offset() + kernel_size as u64;
} else {
kernel_end = elf_result.map_err(Error::LoadElfKernel)?;
kernel_size = kernel_end as usize - get_kernel_addr().offset() as usize;
let loaded_kernel = elf_result.map_err(Error::LoadElfKernel)?;
kernel_size = loaded_kernel.size as usize;
kernel_end = loaded_kernel.end.offset();
}
initrd = match components.initrd_image {
Some(initrd_file) => {

View file

@ -61,6 +61,16 @@ pub enum Error {
}
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug, Copy, Clone, PartialEq)]
/// Information about a kernel loaded with the [`load_kernel`] function.
pub struct LoadedKernel {
/// End address (exclusive) of the kernel.
pub end: GuestAddress,
/// Size of the kernel image in bytes.
pub size: u64,
}
/// Loads a kernel from a vmlinux elf image to a slice
///
/// # Arguments
@ -72,7 +82,7 @@ pub fn load_kernel<F>(
guest_mem: &GuestMemory,
kernel_start: GuestAddress,
mut kernel_image: &mut F,
) -> Result<u64>
) -> Result<LoadedKernel>
where
F: Read + Seek + AsRawDescriptor,
{
@ -135,7 +145,12 @@ where
.ok_or(Error::InvalidProgramHeaderMemSize)?;
}
Ok(kernel_end)
let size = kernel_end - kernel_start.offset();
Ok(LoadedKernel {
end: GuestAddress(kernel_end),
size,
})
}
/// Writes the command line string to the given memory slice.
@ -246,7 +261,9 @@ mod test {
let gm = create_guest_mem();
let kernel_addr = GuestAddress(0x0);
let mut image = make_elf_bin();
assert_eq!(Ok(0x20_0035), load_kernel(&gm, kernel_addr, &mut image));
let kernel = load_kernel(&gm, kernel_addr, &mut image).expect("failed to load ELF");
assert_eq!(kernel.end, GuestAddress(0x20_0035));
assert_eq!(kernel.size, 0x20_0035);
}
#[test]

View file

@ -1219,8 +1219,8 @@ impl X8664arch {
bzimage::load_bzimage(mem, GuestAddress(KERNEL_START_OFFSET), kernel_image)
.map_err(Error::LoadBzImage)
} else {
let kernel_end = elf_result.map_err(Error::LoadKernel)?;
Ok((Default::default(), kernel_end))
let loaded_kernel = elf_result.map_err(Error::LoadKernel)?;
Ok((Default::default(), loaded_kernel.end.offset()))
}
}