@@ -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:: { MachineConfig , MachineConfigError } ;
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,
@@ -476,7 +484,7 @@ pub fn build_microvm_from_snapshot(
476484 uffd,
477485 vm_resources. machine_config . track_dirty_pages ,
478486 vm_resources. machine_config . vcpu_count ,
479- microvm_state. vm_state . kvm_cap_modifiers . clone ( ) ,
487+ microvm_state. kvm_state . kvm_cap_modifiers . clone ( ) ,
480488 ) ?;
481489
482490 #[ cfg( target_arch = "x86_64" ) ]
@@ -738,11 +746,16 @@ fn attach_legacy_devices_aarch64(
738746 . map_err ( VmmError :: RegisterMMIODevice )
739747}
740748
741- fn create_vcpus ( vm : & Vm , vcpu_count : u8 , exit_evt : & EventFd ) -> Result < Vec < Vcpu > , VmmError > {
749+ fn create_vcpus (
750+ kvm : & Kvm ,
751+ vm : & Vm ,
752+ vcpu_count : u8 ,
753+ exit_evt : & EventFd ,
754+ ) -> Result < Vec < Vcpu > , VmmError > {
742755 let mut vcpus = Vec :: with_capacity ( vcpu_count as usize ) ;
743756 for cpu_idx in 0 ..vcpu_count {
744757 let exit_evt = exit_evt. try_clone ( ) . map_err ( VmmError :: EventFd ) ?;
745- let vcpu = Vcpu :: new ( cpu_idx, vm, exit_evt) . map_err ( VmmError :: VcpuCreate ) ?;
758+ let vcpu = Vcpu :: new ( cpu_idx, vm, kvm , exit_evt) . map_err ( VmmError :: VcpuCreate ) ?;
746759 vcpus. push ( vcpu) ;
747760 }
748761 Ok ( vcpus)
@@ -765,7 +778,7 @@ pub fn configure_system_for_boot(
765778 #[ cfg( target_arch = "x86_64" ) ]
766779 let cpu_config = {
767780 use crate :: cpu_config:: x86_64:: cpuid;
768- let cpuid = cpuid:: Cpuid :: try_from ( vmm. vm . supported_cpuid ( ) . clone ( ) )
781+ let cpuid = cpuid:: Cpuid :: try_from ( vmm. kvm . supported_cpuid . clone ( ) )
769782 . map_err ( GuestConfigError :: CpuidFromKvmCpuid ) ?;
770783 let msrs = vcpus[ 0 ]
771784 . kvm_vcpu
@@ -1111,7 +1124,8 @@ pub(crate) mod tests {
11111124 . map_err ( StartMicrovmError :: Internal )
11121125 . unwrap ( ) ;
11131126
1114- let mut vm = Vm :: new ( vec ! [ ] ) . unwrap ( ) ;
1127+ let kvm = Kvm :: new ( vec ! [ ] ) . unwrap ( ) ;
1128+ let mut vm = Vm :: new ( & kvm) . unwrap ( ) ;
11151129 vm. memory_init ( & guest_memory, false ) . unwrap ( ) ;
11161130 let mmio_device_manager = MMIODeviceManager :: new ( ) ;
11171131 let acpi_device_manager = ACPIDeviceManager :: new ( ) ;
@@ -1137,14 +1151,15 @@ pub(crate) mod tests {
11371151 #[ cfg( target_arch = "aarch64" ) ]
11381152 {
11391153 let exit_evt = EventFd :: new ( libc:: EFD_NONBLOCK ) . unwrap ( ) ;
1140- let _vcpu = Vcpu :: new ( 1 , & vm, exit_evt) . unwrap ( ) ;
1154+ let _vcpu = Vcpu :: new ( 1 , & vm, & kvm , exit_evt) . unwrap ( ) ;
11411155 setup_interrupt_controller ( & mut vm, 1 ) . unwrap ( ) ;
11421156 }
11431157
11441158 Vmm {
11451159 events_observer : Some ( std:: io:: stdin ( ) ) ,
11461160 instance_info : InstanceInfo :: default ( ) ,
11471161 shutdown_exit_code : None ,
1162+ kvm,
11481163 vm,
11491164 guest_memory,
11501165 uffd : None ,
@@ -1362,15 +1377,16 @@ pub(crate) mod tests {
13621377 let vcpu_count = 2 ;
13631378 let guest_memory = arch_mem ( 128 << 20 ) ;
13641379
1380+ let kvm = Kvm :: new ( vec ! [ ] ) . expect ( "Cannot create Kvm" ) ;
13651381 #[ allow( unused_mut) ]
1366- let mut vm = Vm :: new ( vec ! [ ] ) . unwrap ( ) ;
1382+ let mut vm = Vm :: new ( & kvm ) . unwrap ( ) ;
13671383 vm. memory_init ( & guest_memory, false ) . unwrap ( ) ;
13681384 let evfd = EventFd :: new ( libc:: EFD_NONBLOCK ) . unwrap ( ) ;
13691385
13701386 #[ cfg( target_arch = "x86_64" ) ]
13711387 setup_interrupt_controller ( & mut vm) . unwrap ( ) ;
13721388
1373- let vcpu_vec = create_vcpus ( & vm, vcpu_count, & evfd) . unwrap ( ) ;
1389+ let vcpu_vec = create_vcpus ( & kvm , & vm, vcpu_count, & evfd) . unwrap ( ) ;
13741390 assert_eq ! ( vcpu_vec. len( ) , vcpu_count as usize ) ;
13751391 }
13761392
0 commit comments