@@ -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