@@ -68,6 +68,7 @@ use crate::utils::u64_to_usize;
6868use crate::vmm_config::boot_source::BootConfig;
6969use crate::vmm_config::instance_info::InstanceInfo;
7070use crate::vmm_config::machine_config::{VmConfig, VmConfigError};
71+ use crate::vstate::kvm::Kvm;
7172use crate::vstate::memory::{GuestAddress, GuestMemory, GuestMemoryMmap};
7273use crate::vstate::vcpu::{Vcpu, VcpuConfig, VcpuError};
7374use crate::vstate::vm::Vm;
@@ -160,11 +161,17 @@ fn create_vmm_and_vcpus(
160161) -> Result<(Vmm, Vec<Vcpu>), StartMicrovmError> {
161162 use self::StartMicrovmError::*;
162163
164+ let kvm = Kvm::new(kvm_capabilities)
165+ .map_err(VmmError::Kvm)
166+ .map_err(StartMicrovmError::Internal)?;
163167 // Set up Kvm Vm and register memory regions.
164168 // Build custom CPU config if a custom template is provided.
165- let mut vm = Vm::new(kvm_capabilities )
169+ let mut vm = Vm::new(&kvm )
166170 .map_err(VmmError::Vm)
167171 .map_err(StartMicrovmError::Internal)?;
172+ kvm.check_memory(&guest_memory)
173+ .map_err(VmmError::Kvm)
174+ .map_err(StartMicrovmError::Internal)?;
168175 vm.memory_init(&guest_memory, track_dirty_pages)
169176 .map_err(VmmError::Vm)
170177 .map_err(StartMicrovmError::Internal)?;
@@ -186,7 +193,7 @@ fn create_vmm_and_vcpus(
186193 #[cfg(target_arch = "x86_64")]
187194 let (vcpus, pio_device_manager) = {
188195 setup_interrupt_controller(&mut vm)?;
189- let vcpus = create_vcpus(&vm, vcpu_count, &vcpus_exit_evt).map_err(Internal)?;
196+ let vcpus = create_vcpus(&kvm, & vm, vcpu_count, &vcpus_exit_evt).map_err(Internal)?;
190197
191198 // Make stdout non blocking.
192199 set_stdout_nonblocking();
@@ -218,7 +225,7 @@ fn create_vmm_and_vcpus(
218225 // Search for `kvm_arch_vcpu_create` in arch/arm/kvm/arm.c.
219226 #[cfg(target_arch = "aarch64")]
220227 let vcpus = {
221- let vcpus = create_vcpus(&vm, vcpu_count, &vcpus_exit_evt).map_err(Internal)?;
228+ let vcpus = create_vcpus(&kvm, & vm, vcpu_count, &vcpus_exit_evt).map_err(Internal)?;
222229 setup_interrupt_controller(&mut vm, vcpu_count)?;
223230 vcpus
224231 };
@@ -227,6 +234,7 @@ fn create_vmm_and_vcpus(
227234 events_observer: Some(std::io::stdin()),
228235 instance_info: instance_info.clone(),
229236 shutdown_exit_code: None,
237+ kvm,
230238 vm,
231239 guest_memory,
232240 uffd,
@@ -473,7 +481,7 @@ pub fn build_microvm_from_snapshot(
473481 uffd,
474482 vm_resources.vm_config.track_dirty_pages,
475483 vm_resources.vm_config.vcpu_count,
476- microvm_state.vm_state .kvm_cap_modifiers.clone(),
484+ microvm_state.kvm_state .kvm_cap_modifiers.clone(),
477485 )?;
478486
479487 #[cfg(target_arch = "x86_64")]
@@ -735,11 +743,16 @@ fn attach_legacy_devices_aarch64(
735743 .map_err(VmmError::RegisterMMIODevice)
736744}
737745
738- fn create_vcpus(vm: &Vm, vcpu_count: u8, exit_evt: &EventFd) -> Result<Vec<Vcpu>, VmmError> {
746+ fn create_vcpus(
747+ kvm: &Kvm,
748+ vm: &Vm,
749+ vcpu_count: u8,
750+ exit_evt: &EventFd,
751+ ) -> Result<Vec<Vcpu>, VmmError> {
739752 let mut vcpus = Vec::with_capacity(vcpu_count as usize);
740753 for cpu_idx in 0..vcpu_count {
741754 let exit_evt = exit_evt.try_clone().map_err(VmmError::EventFd)?;
742- let vcpu = Vcpu::new(cpu_idx, vm, exit_evt).map_err(VmmError::VcpuCreate)?;
755+ let vcpu = Vcpu::new(cpu_idx, vm, kvm, exit_evt).map_err(VmmError::VcpuCreate)?;
743756 vcpus.push(vcpu);
744757 }
745758 Ok(vcpus)
@@ -762,7 +775,7 @@ pub fn configure_system_for_boot(
762775 #[cfg(target_arch = "x86_64")]
763776 let cpu_config = {
764777 use crate::cpu_config::x86_64::cpuid;
765- let cpuid = cpuid::Cpuid::try_from(vmm.vm .supported_cpuid() .clone())
778+ let cpuid = cpuid::Cpuid::try_from(vmm.kvm .supported_cpuid.clone())
766779 .map_err(GuestConfigError::CpuidFromKvmCpuid)?;
767780 let msrs = vcpus[0]
768781 .kvm_vcpu
@@ -1108,7 +1121,8 @@ pub(crate) mod tests {
11081121 .map_err(StartMicrovmError::Internal)
11091122 .unwrap();
11101123
1111- let mut vm = Vm::new(vec![]).unwrap();
1124+ let kvm = Kvm::new(vec![]).unwrap();
1125+ let mut vm = Vm::new(&kvm).unwrap();
11121126 vm.memory_init(&guest_memory, false).unwrap();
11131127 let mmio_device_manager = MMIODeviceManager::new();
11141128 let acpi_device_manager = ACPIDeviceManager::new();
@@ -1134,14 +1148,15 @@ pub(crate) mod tests {
11341148 #[cfg(target_arch = "aarch64")]
11351149 {
11361150 let exit_evt = EventFd::new(libc::EFD_NONBLOCK).unwrap();
1137- let _vcpu = Vcpu::new(1, &vm, exit_evt).unwrap();
1151+ let _vcpu = Vcpu::new(1, &vm, &kvm, exit_evt).unwrap();
11381152 setup_interrupt_controller(&mut vm, 1).unwrap();
11391153 }
11401154
11411155 Vmm {
11421156 events_observer: Some(std::io::stdin()),
11431157 instance_info: InstanceInfo::default(),
11441158 shutdown_exit_code: None,
1159+ kvm,
11451160 vm,
11461161 guest_memory,
11471162 uffd: None,
@@ -1359,15 +1374,16 @@ pub(crate) mod tests {
13591374 let vcpu_count = 2;
13601375 let guest_memory = arch_mem(128 << 20);
13611376
1377+ let kvm = Kvm::new(vec![]).expect("Cannot create Kvm");
13621378 #[allow(unused_mut)]
1363- let mut vm = Vm::new(vec![] ).unwrap();
1379+ let mut vm = Vm::new(&kvm ).unwrap();
13641380 vm.memory_init(&guest_memory, false).unwrap();
13651381 let evfd = EventFd::new(libc::EFD_NONBLOCK).unwrap();
13661382
13671383 #[cfg(target_arch = "x86_64")]
13681384 setup_interrupt_controller(&mut vm).unwrap();
13691385
1370- let vcpu_vec = create_vcpus(&vm, vcpu_count, &evfd).unwrap();
1386+ let vcpu_vec = create_vcpus(&kvm, & vm, vcpu_count, &evfd).unwrap();
13711387 assert_eq!(vcpu_vec.len(), vcpu_count as usize);
13721388 }
13731389
0 commit comments