@@ -84,6 +84,18 @@ static struct vm_gic vm_gic_create_with_vcpus(uint32_t gic_dev_type,
84
84
return v ;
85
85
}
86
86
87
+ static struct vm_gic vm_gic_create_barebones (uint32_t gic_dev_type )
88
+ {
89
+ struct vm_gic v ;
90
+
91
+ v .gic_dev_type = gic_dev_type ;
92
+ v .vm = vm_create_barebones ();
93
+ v .gic_fd = kvm_create_device (v .vm , gic_dev_type );
94
+
95
+ return v ;
96
+ }
97
+
98
+
87
99
static void vm_gic_destroy (struct vm_gic * v )
88
100
{
89
101
close (v -> gic_fd );
@@ -357,6 +369,40 @@ static void test_vcpus_then_vgic(uint32_t gic_dev_type)
357
369
vm_gic_destroy (& v );
358
370
}
359
371
372
+ #define KVM_VGIC_V2_ATTR (offset , cpu ) \
373
+ (FIELD_PREP(KVM_DEV_ARM_VGIC_OFFSET_MASK, offset) | \
374
+ FIELD_PREP(KVM_DEV_ARM_VGIC_CPUID_MASK, cpu))
375
+
376
+ #define GIC_CPU_CTRL 0x00
377
+
378
+ static void test_v2_uaccess_cpuif_no_vcpus (void )
379
+ {
380
+ struct vm_gic v ;
381
+ u64 val = 0 ;
382
+ int ret ;
383
+
384
+ v = vm_gic_create_barebones (KVM_DEV_TYPE_ARM_VGIC_V2 );
385
+ subtest_dist_rdist (& v );
386
+
387
+ ret = __kvm_has_device_attr (v .gic_fd , KVM_DEV_ARM_VGIC_GRP_CPU_REGS ,
388
+ KVM_VGIC_V2_ATTR (GIC_CPU_CTRL , 0 ));
389
+ TEST_ASSERT (ret && errno == EINVAL ,
390
+ "accessed non-existent CPU interface, want errno: %i" ,
391
+ EINVAL );
392
+ ret = __kvm_device_attr_get (v .gic_fd , KVM_DEV_ARM_VGIC_GRP_CPU_REGS ,
393
+ KVM_VGIC_V2_ATTR (GIC_CPU_CTRL , 0 ), & val );
394
+ TEST_ASSERT (ret && errno == EINVAL ,
395
+ "accessed non-existent CPU interface, want errno: %i" ,
396
+ EINVAL );
397
+ ret = __kvm_device_attr_set (v .gic_fd , KVM_DEV_ARM_VGIC_GRP_CPU_REGS ,
398
+ KVM_VGIC_V2_ATTR (GIC_CPU_CTRL , 0 ), & val );
399
+ TEST_ASSERT (ret && errno == EINVAL ,
400
+ "accessed non-existent CPU interface, want errno: %i" ,
401
+ EINVAL );
402
+
403
+ vm_gic_destroy (& v );
404
+ }
405
+
360
406
static void test_v3_new_redist_regions (void )
361
407
{
362
408
struct kvm_vcpu * vcpus [NR_VCPUS ];
@@ -675,6 +721,9 @@ void run_tests(uint32_t gic_dev_type)
675
721
test_vcpus_then_vgic (gic_dev_type );
676
722
test_vgic_then_vcpus (gic_dev_type );
677
723
724
+ if (VGIC_DEV_IS_V2 (gic_dev_type ))
725
+ test_v2_uaccess_cpuif_no_vcpus ();
726
+
678
727
if (VGIC_DEV_IS_V3 (gic_dev_type )) {
679
728
test_v3_new_redist_regions ();
680
729
test_v3_typer_accesses ();
0 commit comments