@@ -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:: { MachineConfig , MachineConfigError } ;
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,
@@ -476,7 +484,7 @@ pub fn build_microvm_from_snapshot(
476
484
uffd,
477
485
vm_resources. machine_config . track_dirty_pages ,
478
486
vm_resources. machine_config . vcpu_count ,
479
- microvm_state. vm_state . kvm_cap_modifiers . clone ( ) ,
487
+ microvm_state. kvm_state . kvm_cap_modifiers . clone ( ) ,
480
488
) ?;
481
489
482
490
#[ cfg( target_arch = "x86_64" ) ]
@@ -738,11 +746,16 @@ fn attach_legacy_devices_aarch64(
738
746
. map_err ( VmmError :: RegisterMMIODevice )
739
747
}
740
748
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 > {
742
755
let mut vcpus = Vec :: with_capacity ( vcpu_count as usize ) ;
743
756
for cpu_idx in 0 ..vcpu_count {
744
757
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 ) ?;
746
759
vcpus. push ( vcpu) ;
747
760
}
748
761
Ok ( vcpus)
@@ -765,7 +778,7 @@ pub fn configure_system_for_boot(
765
778
#[ cfg( target_arch = "x86_64" ) ]
766
779
let cpu_config = {
767
780
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 ( ) )
769
782
. map_err ( GuestConfigError :: CpuidFromKvmCpuid ) ?;
770
783
let msrs = vcpus[ 0 ]
771
784
. kvm_vcpu
@@ -1111,7 +1124,8 @@ pub(crate) mod tests {
1111
1124
. map_err ( StartMicrovmError :: Internal )
1112
1125
. unwrap ( ) ;
1113
1126
1114
- let mut vm = Vm :: new ( vec ! [ ] ) . unwrap ( ) ;
1127
+ let kvm = Kvm :: new ( vec ! [ ] ) . unwrap ( ) ;
1128
+ let mut vm = Vm :: new ( & kvm) . unwrap ( ) ;
1115
1129
vm. memory_init ( & guest_memory, false ) . unwrap ( ) ;
1116
1130
let mmio_device_manager = MMIODeviceManager :: new ( ) ;
1117
1131
let acpi_device_manager = ACPIDeviceManager :: new ( ) ;
@@ -1137,14 +1151,15 @@ pub(crate) mod tests {
1137
1151
#[ cfg( target_arch = "aarch64" ) ]
1138
1152
{
1139
1153
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 ( ) ;
1141
1155
setup_interrupt_controller ( & mut vm, 1 ) . unwrap ( ) ;
1142
1156
}
1143
1157
1144
1158
Vmm {
1145
1159
events_observer : Some ( std:: io:: stdin ( ) ) ,
1146
1160
instance_info : InstanceInfo :: default ( ) ,
1147
1161
shutdown_exit_code : None ,
1162
+ kvm,
1148
1163
vm,
1149
1164
guest_memory,
1150
1165
uffd : None ,
@@ -1362,15 +1377,16 @@ pub(crate) mod tests {
1362
1377
let vcpu_count = 2 ;
1363
1378
let guest_memory = arch_mem ( 128 << 20 ) ;
1364
1379
1380
+ let kvm = Kvm :: new ( vec ! [ ] ) . expect ( "Cannot create Kvm" ) ;
1365
1381
#[ allow( unused_mut) ]
1366
- let mut vm = Vm :: new ( vec ! [ ] ) . unwrap ( ) ;
1382
+ let mut vm = Vm :: new ( & kvm ) . unwrap ( ) ;
1367
1383
vm. memory_init ( & guest_memory, false ) . unwrap ( ) ;
1368
1384
let evfd = EventFd :: new ( libc:: EFD_NONBLOCK ) . unwrap ( ) ;
1369
1385
1370
1386
#[ cfg( target_arch = "x86_64" ) ]
1371
1387
setup_interrupt_controller ( & mut vm) . unwrap ( ) ;
1372
1388
1373
- let vcpu_vec = create_vcpus ( & vm, vcpu_count, & evfd) . unwrap ( ) ;
1389
+ let vcpu_vec = create_vcpus ( & kvm , & vm, vcpu_count, & evfd) . unwrap ( ) ;
1374
1390
assert_eq ! ( vcpu_vec. len( ) , vcpu_count as usize ) ;
1375
1391
}
1376
1392
0 commit comments