vmm: x86_64: Split legacy firmware loading into own function

Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
Rob Bradford 2022-08-15 16:36:13 +01:00
parent 80f7d62e1c
commit 6988da79d2

View File

@ -991,29 +991,14 @@ impl Vm {
}
#[cfg(target_arch = "x86_64")]
fn load_kernel(
mut kernel: File,
cmdline: Cmdline,
memory_manager: Arc<Mutex<MemoryManager>>,
fn load_firmware(
mut firmware: File,
memory_manager: &Arc<Mutex<MemoryManager>>,
) -> Result<EntryPoint> {
use linux_loader::loader::{elf::Error::InvalidElfMagicNumber, Error::Elf};
info!("Loading kernel");
let mem = {
let guest_memory = memory_manager.lock().as_ref().unwrap().guest_memory();
guest_memory.memory()
};
let entry_addr = match linux_loader::loader::elf::Elf::load(
mem.deref(),
None,
&mut kernel,
Some(arch::layout::HIGH_RAM_START),
) {
Ok(entry_addr) => entry_addr,
Err(e) => match e {
Elf(InvalidElfMagicNumber) => {
// Not an ELF header - assume raw binary data / firmware
let size = kernel.seek(SeekFrom::End(0)).map_err(Error::FirmwareFile)?;
let size = firmware
.seek(SeekFrom::End(0))
.map_err(Error::FirmwareFile)?;
// The OVMF firmware is as big as you might expect and it's 4MiB so limit to that
if size > 4 << 20 {
@ -1037,7 +1022,7 @@ impl Vm {
.add_ram_region(load_address, size as usize)
.map_err(Error::AllocateFirmwareMemory)?;
kernel
firmware
.seek(SeekFrom::Start(0))
.map_err(Error::FirmwareFile)?;
memory_manager
@ -1045,11 +1030,34 @@ impl Vm {
.unwrap()
.guest_memory()
.memory()
.read_exact_from(load_address, &mut kernel, size as usize)
.read_exact_from(load_address, &mut firmware, size as usize)
.map_err(Error::FirmwareLoad)?;
return Ok(EntryPoint { entry_addr: None });
Ok(EntryPoint { entry_addr: None })
}
#[cfg(target_arch = "x86_64")]
fn load_kernel(
mut kernel: File,
cmdline: Cmdline,
memory_manager: Arc<Mutex<MemoryManager>>,
) -> Result<EntryPoint> {
use linux_loader::loader::{elf::Error::InvalidElfMagicNumber, Error::Elf};
info!("Loading kernel");
let mem = {
let guest_memory = memory_manager.lock().as_ref().unwrap().guest_memory();
guest_memory.memory()
};
let entry_addr = match linux_loader::loader::elf::Elf::load(
mem.deref(),
None,
&mut kernel,
Some(arch::layout::HIGH_RAM_START),
) {
Ok(entry_addr) => entry_addr,
Err(e) => match e {
Elf(InvalidElfMagicNumber) => return Self::load_firmware(kernel, &memory_manager),
_ => {
return Err(Error::KernelLoad(e));
}