@@ -22,6 +22,7 @@ use crate::cpu_config::aarch64::custom_cpu_template::VcpuFeatures;
22
22
use crate :: cpu_config:: templates:: CpuConfiguration ;
23
23
use crate :: logger:: { error, IncMetric , METRICS } ;
24
24
use crate :: vcpu:: { VcpuConfig , VcpuError } ;
25
+ use crate :: vstate:: kvm:: { Kvm , OptionalCapabilities } ;
25
26
use crate :: vstate:: memory:: { Address , GuestAddress , GuestMemoryMmap } ;
26
27
use crate :: vstate:: vcpu:: VcpuEmulation ;
27
28
use crate :: vstate:: vm:: Vm ;
@@ -77,7 +78,7 @@ impl KvmVcpu {
77
78
///
78
79
/// * `index` - Represents the 0-based CPU index between [0, max vcpus).
79
80
/// * `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 > {
81
82
let kvm_vcpu = vm
82
83
. fd ( )
83
84
. create_vcpu ( index. into ( ) )
@@ -115,6 +116,7 @@ impl KvmVcpu {
115
116
guest_mem : & GuestMemoryMmap ,
116
117
kernel_load_addr : GuestAddress ,
117
118
vcpu_config : & VcpuConfig ,
119
+ optional_capabilities : & OptionalCapabilities ,
118
120
) -> Result < ( ) , KvmVcpuError > {
119
121
for reg in vcpu_config. cpu_config . regs . iter ( ) {
120
122
self . fd
@@ -127,6 +129,7 @@ impl KvmVcpu {
127
129
self . index ,
128
130
kernel_load_addr. raw_value ( ) ,
129
131
guest_mem,
132
+ optional_capabilities,
130
133
)
131
134
. map_err ( KvmVcpuError :: ConfigureRegisters ) ?;
132
135
@@ -312,7 +315,7 @@ mod tests {
312
315
313
316
fn setup_vcpu ( mem_size : usize ) -> ( Kvm , Vm , KvmVcpu , GuestMemoryMmap ) {
314
317
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 ( ) ;
316
319
vcpu. init ( & [ ] ) . unwrap ( ) ;
317
320
vm. setup_irqchip ( 1 ) . unwrap ( ) ;
318
321
@@ -321,11 +324,11 @@ mod tests {
321
324
322
325
#[ test]
323
326
fn test_create_vcpu ( ) {
324
- let ( _ , vm, _) = setup_vm_with_memory ( 0x1000 ) ;
327
+ let ( kvm , vm, _) = setup_vm_with_memory ( 0x1000 ) ;
325
328
326
329
unsafe { libc:: close ( vm. fd ( ) . as_raw_fd ( ) ) } ;
327
330
328
- let err = KvmVcpu :: new ( 0 , & vm) ;
331
+ let err = KvmVcpu :: new ( 0 , & vm, & kvm ) ;
329
332
assert_eq ! (
330
333
err. err( ) . unwrap( ) . to_string( ) ,
331
334
"Error creating vcpu: Bad file descriptor (os error 9)" . to_string( )
@@ -337,7 +340,8 @@ mod tests {
337
340
338
341
#[ test]
339
342
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 ( ) ;
341
345
342
346
let vcpu_config = VcpuConfig {
343
347
vcpu_count : 1 ,
@@ -348,6 +352,7 @@ mod tests {
348
352
& vm_mem,
349
353
GuestAddress ( crate :: arch:: get_kernel_start ( ) ) ,
350
354
& vcpu_config,
355
+ & optional_capabilities,
351
356
)
352
357
. unwrap ( ) ;
353
358
@@ -357,6 +362,7 @@ mod tests {
357
362
& vm_mem,
358
363
GuestAddress ( crate :: arch:: get_kernel_start ( ) ) ,
359
364
& vcpu_config,
365
+ & optional_capabilities,
360
366
) ;
361
367
assert_eq ! (
362
368
err. unwrap_err( ) ,
@@ -372,8 +378,8 @@ mod tests {
372
378
373
379
#[ test]
374
380
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 ( ) ;
377
383
vm. setup_irqchip ( 1 ) . unwrap ( ) ;
378
384
379
385
// KVM_ARM_VCPU_PSCI_0_2 is set by default.
@@ -391,8 +397,8 @@ mod tests {
391
397
392
398
#[ test]
393
399
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 ( ) ;
396
402
vm. setup_irqchip ( 1 ) . unwrap ( ) ;
397
403
398
404
// Calling KVM_GET_REGLIST before KVM_VCPU_INIT will result in error.
@@ -435,8 +441,8 @@ mod tests {
435
441
//
436
442
// This should fail with ENOEXEC.
437
443
// 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 ( ) ;
440
446
vm. setup_irqchip ( 1 ) . unwrap ( ) ;
441
447
442
448
vcpu. dump_cpu_config ( ) . unwrap_err ( ) ;
@@ -445,8 +451,8 @@ mod tests {
445
451
#[ test]
446
452
fn test_dump_cpu_config_after_init ( ) {
447
453
// 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 ( ) ;
450
456
vm. setup_irqchip ( 1 ) . unwrap ( ) ;
451
457
vcpu. init ( & [ ] ) . unwrap ( ) ;
452
458
@@ -455,10 +461,10 @@ mod tests {
455
461
456
462
#[ test]
457
463
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 ( ) ;
460
466
vcpu1. init ( & [ ] ) . unwrap ( ) ;
461
- let mut vcpu2 = KvmVcpu :: new ( 1 , & vm) . unwrap ( ) ;
467
+ let mut vcpu2 = KvmVcpu :: new ( 1 , & vm, & kvm ) . unwrap ( ) ;
462
468
vcpu2. init ( & [ ] ) . unwrap ( ) ;
463
469
}
464
470
0 commit comments