use axvmconfig::AxVMCrateConfig;
use super::{BootImageProvider, fdt::GuestDtbImage, images::ImageLoaderCore};
use crate::{AxVMRef, AxVmResult, VMMemoryRegion, config::AxVMConfig};
#[derive(Debug)]
pub struct PreparedGuestBoot {
config: AxVMCrateConfig,
guest_dtb: Option<GuestDtbImage>,
}
impl PreparedGuestBoot {
pub const fn config(&self) -> &AxVMCrateConfig {
&self.config
}
pub fn load_images(
self,
main_memory: VMMemoryRegion,
vm: AxVMRef,
provider: &dyn BootImageProvider,
) -> AxVmResult {
let mut loader =
ImageLoaderCore::new(main_memory, self.config, vm, provider, self.guest_dtb);
loader.load()
}
}
pub fn prepare_guest_boot(
vm_config: &mut AxVMConfig,
mut config: AxVMCrateConfig,
provider: &dyn BootImageProvider,
) -> AxVmResult<PreparedGuestBoot> {
let guest_dtb = crate::arch::prepare_guest_boot(vm_config, &mut config, provider)?;
Ok(PreparedGuestBoot { config, guest_dtb })
}