@@ -22,6 +22,7 @@ use crate::cpu_config::aarch64::custom_cpu_template::VcpuFeatures;
2222use crate :: cpu_config:: templates:: CpuConfiguration ;
2323use crate :: logger:: { error, IncMetric , METRICS } ;
2424use crate :: vcpu:: { VcpuConfig , VcpuError } ;
25+ use crate :: vstate:: kvm:: { Kvm , OptionalCapabilities } ;
2526use crate :: vstate:: memory:: { Address , GuestAddress , GuestMemoryMmap } ;
2627use crate :: vstate:: vcpu:: VcpuEmulation ;
2728use crate :: vstate:: vm:: Vm ;
@@ -77,7 +78,7 @@ impl KvmVcpu {
7778 ///
7879 /// * `index` - Represents the 0-based CPU index between [0, max vcpus).
7980 /// * `vm` - The vm to which this vcpu will get attached.
80- pub fn new ( index : u8 , vm : & Vm ) -> Result < Self , KvmVcpuError > {
81+ pub fn new ( index : u8 , vm : & Vm , _ : & Kvm ) -> Result < Self , KvmVcpuError > {
8182 let kvm_vcpu = vm
8283 . fd ( )
8384 . create_vcpu ( index. into ( ) )
@@ -115,6 +116,7 @@ impl KvmVcpu {
115116 guest_mem : & GuestMemoryMmap ,
116117 kernel_load_addr : GuestAddress ,
117118 vcpu_config : & VcpuConfig ,
119+ optional_capabilities : & OptionalCapabilities ,
118120 ) -> Result < ( ) , KvmVcpuError > {
119121 for reg in vcpu_config. cpu_config . regs . iter ( ) {
120122 self . fd
@@ -127,6 +129,7 @@ impl KvmVcpu {
127129 self . index ,
128130 kernel_load_addr. raw_value ( ) ,
129131 guest_mem,
132+ optional_capabilities,
130133 )
131134 . map_err ( KvmVcpuError :: ConfigureRegisters ) ?;
132135
@@ -312,7 +315,7 @@ mod tests {
312315
313316 fn setup_vcpu ( mem_size : usize ) -> ( Kvm , Vm , KvmVcpu , GuestMemoryMmap ) {
314317 let ( kvm, mut vm, vm_mem) = setup_vm_with_memory ( mem_size) ;
315- let mut vcpu = KvmVcpu :: new ( 0 , & vm) . unwrap ( ) ;
318+ let mut vcpu = KvmVcpu :: new ( 0 , & vm, & kvm ) . unwrap ( ) ;
316319 vcpu. init ( & [ ] ) . unwrap ( ) ;
317320 vm. setup_irqchip ( 1 ) . unwrap ( ) ;
318321
@@ -321,11 +324,11 @@ mod tests {
321324
322325 #[ test]
323326 fn test_create_vcpu ( ) {
324- let ( _ , vm, _) = setup_vm_with_memory ( 0x1000 ) ;
327+ let ( kvm , vm, _) = setup_vm_with_memory ( 0x1000 ) ;
325328
326329 unsafe { libc:: close ( vm. fd ( ) . as_raw_fd ( ) ) } ;
327330
328- let err = KvmVcpu :: new ( 0 , & vm) ;
331+ let err = KvmVcpu :: new ( 0 , & vm, & kvm ) ;
329332 assert_eq ! (
330333 err. err( ) . unwrap( ) . to_string( ) ,
331334 "Error creating vcpu: Bad file descriptor (os error 9)" . to_string( )
@@ -337,7 +340,8 @@ mod tests {
337340
338341 #[ test]
339342 fn test_configure_vcpu ( ) {
340- let ( _, _, mut vcpu, vm_mem) = setup_vcpu ( 0x10000 ) ;
343+ let ( kvm, _, mut vcpu, vm_mem) = setup_vcpu ( 0x10000 ) ;
344+ let optional_capabilities = kvm. optional_capabilities ( ) ;
341345
342346 let vcpu_config = VcpuConfig {
343347 vcpu_count : 1 ,
@@ -348,6 +352,7 @@ mod tests {
348352 & vm_mem,
349353 GuestAddress ( crate :: arch:: get_kernel_start ( ) ) ,
350354 & vcpu_config,
355+ & optional_capabilities,
351356 )
352357 . unwrap ( ) ;
353358
@@ -357,6 +362,7 @@ mod tests {
357362 & vm_mem,
358363 GuestAddress ( crate :: arch:: get_kernel_start ( ) ) ,
359364 & vcpu_config,
365+ & optional_capabilities,
360366 ) ;
361367 assert_eq ! (
362368 err. unwrap_err( ) ,
@@ -372,8 +378,8 @@ mod tests {
372378
373379 #[ test]
374380 fn test_init_vcpu ( ) {
375- let ( _ , mut vm, _) = setup_vm_with_memory ( 0x1000 ) ;
376- let mut vcpu = KvmVcpu :: new ( 0 , & vm) . unwrap ( ) ;
381+ let ( kvm , mut vm, _) = setup_vm_with_memory ( 0x1000 ) ;
382+ let mut vcpu = KvmVcpu :: new ( 0 , & vm, & kvm ) . unwrap ( ) ;
377383 vm. setup_irqchip ( 1 ) . unwrap ( ) ;
378384
379385 // KVM_ARM_VCPU_PSCI_0_2 is set by default.
@@ -391,8 +397,8 @@ mod tests {
391397
392398 #[ test]
393399 fn test_vcpu_save_restore_state ( ) {
394- let ( _ , mut vm, _) = setup_vm_with_memory ( 0x1000 ) ;
395- let mut vcpu = KvmVcpu :: new ( 0 , & vm) . unwrap ( ) ;
400+ let ( kvm , mut vm, _) = setup_vm_with_memory ( 0x1000 ) ;
401+ let mut vcpu = KvmVcpu :: new ( 0 , & vm, & kvm ) . unwrap ( ) ;
396402 vm. setup_irqchip ( 1 ) . unwrap ( ) ;
397403
398404 // Calling KVM_GET_REGLIST before KVM_VCPU_INIT will result in error.
@@ -435,8 +441,8 @@ mod tests {
435441 //
436442 // This should fail with ENOEXEC.
437443 // https://elixir.bootlin.com/linux/v5.10.176/source/arch/arm64/kvm/arm.c#L1165
438- let ( _ , mut vm, _) = setup_vm_with_memory ( 0x1000 ) ;
439- let vcpu = KvmVcpu :: new ( 0 , & vm) . unwrap ( ) ;
444+ let ( kvm , mut vm, _) = setup_vm_with_memory ( 0x1000 ) ;
445+ let vcpu = KvmVcpu :: new ( 0 , & vm, & kvm ) . unwrap ( ) ;
440446 vm. setup_irqchip ( 1 ) . unwrap ( ) ;
441447
442448 vcpu. dump_cpu_config ( ) . unwrap_err ( ) ;
@@ -445,8 +451,8 @@ mod tests {
445451 #[ test]
446452 fn test_dump_cpu_config_after_init ( ) {
447453 // Test `dump_cpu_config()` after `KVM_VCPU_INIT`.
448- let ( _ , mut vm, _) = setup_vm_with_memory ( 0x1000 ) ;
449- let mut vcpu = KvmVcpu :: new ( 0 , & vm) . unwrap ( ) ;
454+ let ( kvm , mut vm, _) = setup_vm_with_memory ( 0x1000 ) ;
455+ let mut vcpu = KvmVcpu :: new ( 0 , & vm, & kvm ) . unwrap ( ) ;
450456 vm. setup_irqchip ( 1 ) . unwrap ( ) ;
451457 vcpu. init ( & [ ] ) . unwrap ( ) ;
452458
@@ -455,10 +461,10 @@ mod tests {
455461
456462 #[ test]
457463 fn test_setup_non_boot_vcpu ( ) {
458- let ( _ , vm, _) = setup_vm_with_memory ( 0x1000 ) ;
459- let mut vcpu1 = KvmVcpu :: new ( 0 , & vm) . unwrap ( ) ;
464+ let ( kvm , vm, _) = setup_vm_with_memory ( 0x1000 ) ;
465+ let mut vcpu1 = KvmVcpu :: new ( 0 , & vm, & kvm ) . unwrap ( ) ;
460466 vcpu1. init ( & [ ] ) . unwrap ( ) ;
461- let mut vcpu2 = KvmVcpu :: new ( 1 , & vm) . unwrap ( ) ;
467+ let mut vcpu2 = KvmVcpu :: new ( 1 , & vm, & kvm ) . unwrap ( ) ;
462468 vcpu2. init ( & [ ] ) . unwrap ( ) ;
463469 }
464470
0 commit comments