@@ -68,6 +68,7 @@ use crate::utils::u64_to_usize;
68
68
use crate :: vmm_config:: boot_source:: BootConfig ;
69
69
use crate :: vmm_config:: instance_info:: InstanceInfo ;
70
70
use crate :: vmm_config:: machine_config:: { VmConfig , VmConfigError } ;
71
+ use crate :: vstate:: kvm:: Kvm ;
71
72
use crate :: vstate:: memory:: { GuestAddress , GuestMemory , GuestMemoryMmap } ;
72
73
use crate :: vstate:: vcpu:: { Vcpu , VcpuConfig , VcpuError } ;
73
74
use crate :: vstate:: vm:: Vm ;
@@ -160,11 +161,17 @@ fn create_vmm_and_vcpus(
160
161
) -> Result < ( Vmm , Vec < Vcpu > ) , StartMicrovmError > {
161
162
use self :: StartMicrovmError :: * ;
162
163
164
+ let kvm = Kvm :: new ( kvm_capabilities)
165
+ . map_err ( VmmError :: Kvm )
166
+ . map_err ( StartMicrovmError :: Internal ) ?;
163
167
// Set up Kvm Vm and register memory regions.
164
168
// 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 )
166
170
. map_err ( VmmError :: Vm )
167
171
. map_err ( StartMicrovmError :: Internal ) ?;
172
+ kvm. check_memory ( & guest_memory)
173
+ . map_err ( VmmError :: Kvm )
174
+ . map_err ( StartMicrovmError :: Internal ) ?;
168
175
vm. memory_init ( & guest_memory, track_dirty_pages)
169
176
. map_err ( VmmError :: Vm )
170
177
. map_err ( StartMicrovmError :: Internal ) ?;
@@ -186,7 +193,7 @@ fn create_vmm_and_vcpus(
186
193
#[ cfg( target_arch = "x86_64" ) ]
187
194
let ( vcpus, pio_device_manager) = {
188
195
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 ) ?;
190
197
191
198
// Make stdout non blocking.
192
199
set_stdout_nonblocking ( ) ;
@@ -218,7 +225,7 @@ fn create_vmm_and_vcpus(
218
225
// Search for `kvm_arch_vcpu_create` in arch/arm/kvm/arm.c.
219
226
#[ cfg( target_arch = "aarch64" ) ]
220
227
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 ) ?;
222
229
setup_interrupt_controller ( & mut vm, vcpu_count) ?;
223
230
vcpus
224
231
} ;
@@ -227,6 +234,7 @@ fn create_vmm_and_vcpus(
227
234
events_observer : Some ( std:: io:: stdin ( ) ) ,
228
235
instance_info : instance_info. clone ( ) ,
229
236
shutdown_exit_code : None ,
237
+ kvm,
230
238
vm,
231
239
guest_memory,
232
240
uffd,
@@ -473,7 +481,7 @@ pub fn build_microvm_from_snapshot(
473
481
uffd,
474
482
vm_resources. vm_config . track_dirty_pages ,
475
483
vm_resources. vm_config . vcpu_count ,
476
- microvm_state. vm_state . kvm_cap_modifiers . clone ( ) ,
484
+ microvm_state. kvm_state . kvm_cap_modifiers . clone ( ) ,
477
485
) ?;
478
486
479
487
#[ cfg( target_arch = "x86_64" ) ]
@@ -735,11 +743,16 @@ fn attach_legacy_devices_aarch64(
735
743
. map_err ( VmmError :: RegisterMMIODevice )
736
744
}
737
745
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 > {
739
752
let mut vcpus = Vec :: with_capacity ( vcpu_count as usize ) ;
740
753
for cpu_idx in 0 ..vcpu_count {
741
754
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 ) ?;
743
756
vcpus. push ( vcpu) ;
744
757
}
745
758
Ok ( vcpus)
@@ -762,7 +775,7 @@ pub fn configure_system_for_boot(
762
775
#[ cfg( target_arch = "x86_64" ) ]
763
776
let cpu_config = {
764
777
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 ( ) )
766
779
. map_err ( GuestConfigError :: CpuidFromKvmCpuid ) ?;
767
780
let msrs = vcpus[ 0 ]
768
781
. kvm_vcpu
@@ -1108,7 +1121,8 @@ pub(crate) mod tests {
1108
1121
. map_err ( StartMicrovmError :: Internal )
1109
1122
. unwrap ( ) ;
1110
1123
1111
- let mut vm = Vm :: new ( vec ! [ ] ) . unwrap ( ) ;
1124
+ let kvm = Kvm :: new ( vec ! [ ] ) . unwrap ( ) ;
1125
+ let mut vm = Vm :: new ( & kvm) . unwrap ( ) ;
1112
1126
vm. memory_init ( & guest_memory, false ) . unwrap ( ) ;
1113
1127
let mmio_device_manager = MMIODeviceManager :: new ( ) ;
1114
1128
let acpi_device_manager = ACPIDeviceManager :: new ( ) ;
@@ -1134,14 +1148,15 @@ pub(crate) mod tests {
1134
1148
#[ cfg( target_arch = "aarch64" ) ]
1135
1149
{
1136
1150
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 ( ) ;
1138
1152
setup_interrupt_controller ( & mut vm, 1 ) . unwrap ( ) ;
1139
1153
}
1140
1154
1141
1155
Vmm {
1142
1156
events_observer : Some ( std:: io:: stdin ( ) ) ,
1143
1157
instance_info : InstanceInfo :: default ( ) ,
1144
1158
shutdown_exit_code : None ,
1159
+ kvm,
1145
1160
vm,
1146
1161
guest_memory,
1147
1162
uffd : None ,
@@ -1359,15 +1374,16 @@ pub(crate) mod tests {
1359
1374
let vcpu_count = 2 ;
1360
1375
let guest_memory = arch_mem ( 128 << 20 ) ;
1361
1376
1377
+ let kvm = Kvm :: new ( vec ! [ ] ) . expect ( "Cannot create Kvm" ) ;
1362
1378
#[ allow( unused_mut) ]
1363
- let mut vm = Vm :: new ( vec ! [ ] ) . unwrap ( ) ;
1379
+ let mut vm = Vm :: new ( & kvm ) . unwrap ( ) ;
1364
1380
vm. memory_init ( & guest_memory, false ) . unwrap ( ) ;
1365
1381
let evfd = EventFd :: new ( libc:: EFD_NONBLOCK ) . unwrap ( ) ;
1366
1382
1367
1383
#[ cfg( target_arch = "x86_64" ) ]
1368
1384
setup_interrupt_controller ( & mut vm) . unwrap ( ) ;
1369
1385
1370
- let vcpu_vec = create_vcpus ( & vm, vcpu_count, & evfd) . unwrap ( ) ;
1386
+ let vcpu_vec = create_vcpus ( & kvm , & vm, vcpu_count, & evfd) . unwrap ( ) ;
1371
1387
assert_eq ! ( vcpu_vec. len( ) , vcpu_count as usize ) ;
1372
1388
}
1373
1389
0 commit comments