#include "kvm_util.h"
 #include "processor.h"
 #include "vgic.h"
+#include "gic_v3.h"
 
 #define NR_VCPUS               4
 
 #define REG_OFFSET(vcpu, offset) (((uint64_t)vcpu << 32) | offset)
 
-#define GICR_TYPER 0x8
-
 #define VGIC_DEV_IS_V2(_d) ((_d) == KVM_DEV_TYPE_ARM_VGIC_V2)
 #define VGIC_DEV_IS_V3(_d) ((_d) == KVM_DEV_TYPE_ARM_VGIC_V3)
 
        vm_gic_destroy(&v);
 }
 
+static void test_v3_nassgicap(void)
+{
+       struct kvm_vcpu *vcpus[NR_VCPUS];
+       bool has_nassgicap;
+       struct vm_gic vm;
+       u32 typer2;
+       int ret;
+
+       vm = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, vcpus);
+       kvm_device_attr_get(vm.gic_fd, KVM_DEV_ARM_VGIC_GRP_DIST_REGS,
+                           GICD_TYPER2, &typer2);
+       has_nassgicap = typer2 & GICD_TYPER2_nASSGIcap;
+
+       typer2 |= GICD_TYPER2_nASSGIcap;
+       ret = __kvm_device_attr_set(vm.gic_fd, KVM_DEV_ARM_VGIC_GRP_DIST_REGS,
+                                   GICD_TYPER2, &typer2);
+       if (has_nassgicap)
+               TEST_ASSERT(!ret, KVM_IOCTL_ERROR(KVM_DEVICE_ATTR_SET, ret));
+       else
+               TEST_ASSERT(ret && errno == EINVAL,
+                           "Enabled nASSGIcap even though it's unavailable");
+
+       typer2 &= ~GICD_TYPER2_nASSGIcap;
+       kvm_device_attr_set(vm.gic_fd, KVM_DEV_ARM_VGIC_GRP_DIST_REGS,
+                           GICD_TYPER2, &typer2);
+
+       kvm_device_attr_set(vm.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
+                           KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);
+
+       typer2 ^= GICD_TYPER2_nASSGIcap;
+       ret = __kvm_device_attr_set(vm.gic_fd, KVM_DEV_ARM_VGIC_GRP_DIST_REGS,
+                                   GICD_TYPER2, &typer2);
+       TEST_ASSERT(ret && errno == EBUSY,
+                   "Changed nASSGIcap after initializing the VGIC");
+
+       vm_gic_destroy(&vm);
+}
+
 /*
  * Returns 0 if it's possible to create GIC device of a given type (V2 or V3).
  */
                test_v3_last_bit_single_rdist();
                test_v3_redist_ipa_range_check_at_vcpu_run();
                test_v3_its_region();
+               test_v3_nassgicap();
        }
 }