Lines Matching refs:kvm
17 int vgic_check_iorange(struct kvm *kvm, phys_addr_t ioaddr, in vgic_check_iorange() argument
30 if (addr & ~kvm_phys_mask(kvm) || addr + size > kvm_phys_size(kvm)) in vgic_check_iorange()
36 static int vgic_check_type(struct kvm *kvm, int type_needed) in vgic_check_type() argument
38 if (kvm->arch.vgic.vgic_model != type_needed) in vgic_check_type()
44 int kvm_set_legacy_vgic_v2_addr(struct kvm *kvm, struct kvm_arm_device_addr *dev_addr) in kvm_set_legacy_vgic_v2_addr() argument
46 struct vgic_dist *vgic = &kvm->arch.vgic; in kvm_set_legacy_vgic_v2_addr()
49 mutex_lock(&kvm->lock); in kvm_set_legacy_vgic_v2_addr()
52 r = vgic_check_type(kvm, KVM_DEV_TYPE_ARM_VGIC_V2); in kvm_set_legacy_vgic_v2_addr()
54 r = vgic_check_iorange(kvm, vgic->vgic_dist_base, dev_addr->addr, in kvm_set_legacy_vgic_v2_addr()
60 r = vgic_check_type(kvm, KVM_DEV_TYPE_ARM_VGIC_V2); in kvm_set_legacy_vgic_v2_addr()
62 r = vgic_check_iorange(kvm, vgic->vgic_cpu_base, dev_addr->addr, in kvm_set_legacy_vgic_v2_addr()
71 mutex_unlock(&kvm->lock); in kvm_set_legacy_vgic_v2_addr()
91 static int kvm_vgic_addr(struct kvm *kvm, struct kvm_device_attr *attr, bool write) in kvm_vgic_addr() argument
94 struct vgic_dist *vgic = &kvm->arch.vgic; in kvm_vgic_addr()
105 mutex_lock(&kvm->lock); in kvm_vgic_addr()
108 r = vgic_check_type(kvm, KVM_DEV_TYPE_ARM_VGIC_V2); in kvm_vgic_addr()
114 r = vgic_check_type(kvm, KVM_DEV_TYPE_ARM_VGIC_V2); in kvm_vgic_addr()
120 r = vgic_check_type(kvm, KVM_DEV_TYPE_ARM_VGIC_V3); in kvm_vgic_addr()
128 r = vgic_check_type(kvm, KVM_DEV_TYPE_ARM_VGIC_V3); in kvm_vgic_addr()
132 r = vgic_v3_set_redist_base(kvm, 0, addr, 0); in kvm_vgic_addr()
148 r = vgic_check_type(kvm, KVM_DEV_TYPE_ARM_VGIC_V3); in kvm_vgic_addr()
162 r = vgic_v3_set_redist_base(kvm, index, in kvm_vgic_addr()
167 rdreg = vgic_v3_rdist_region_from_index(kvm, index); in kvm_vgic_addr()
186 r = vgic_check_iorange(kvm, *addr_ptr, addr, alignment, size); in kvm_vgic_addr()
194 mutex_unlock(&kvm->lock); in kvm_vgic_addr()
209 r = kvm_vgic_addr(dev->kvm, attr, true); in vgic_set_common_attr()
230 mutex_lock(&dev->kvm->lock); in vgic_set_common_attr()
232 if (vgic_ready(dev->kvm) || dev->kvm->arch.vgic.nr_spis) in vgic_set_common_attr()
235 dev->kvm->arch.vgic.nr_spis = in vgic_set_common_attr()
238 mutex_unlock(&dev->kvm->lock); in vgic_set_common_attr()
245 mutex_lock(&dev->kvm->lock); in vgic_set_common_attr()
246 r = vgic_init(dev->kvm); in vgic_set_common_attr()
247 mutex_unlock(&dev->kvm->lock); in vgic_set_common_attr()
255 if (vgic_check_type(dev->kvm, KVM_DEV_TYPE_ARM_VGIC_V3)) in vgic_set_common_attr()
257 mutex_lock(&dev->kvm->lock); in vgic_set_common_attr()
259 if (!lock_all_vcpus(dev->kvm)) { in vgic_set_common_attr()
260 mutex_unlock(&dev->kvm->lock); in vgic_set_common_attr()
263 r = vgic_v3_save_pending_tables(dev->kvm); in vgic_set_common_attr()
264 unlock_all_vcpus(dev->kvm); in vgic_set_common_attr()
265 mutex_unlock(&dev->kvm->lock); in vgic_set_common_attr()
282 r = kvm_vgic_addr(dev->kvm, attr, false); in vgic_get_common_attr()
287 r = put_user(dev->kvm->arch.vgic.nr_spis + in vgic_get_common_attr()
298 return kvm_vgic_create(dev->kvm, type); in vgic_create()
336 if (cpuid >= atomic_read(&dev->kvm->online_vcpus)) in vgic_v2_parse_attr()
339 reg_attr->vcpu = kvm_get_vcpu(dev->kvm, cpuid); in vgic_v2_parse_attr()
346 static void unlock_vcpus(struct kvm *kvm, int vcpu_lock_idx) in unlock_vcpus() argument
351 tmp_vcpu = kvm_get_vcpu(kvm, vcpu_lock_idx); in unlock_vcpus()
356 void unlock_all_vcpus(struct kvm *kvm) in unlock_all_vcpus() argument
358 unlock_vcpus(kvm, atomic_read(&kvm->online_vcpus) - 1); in unlock_all_vcpus()
362 bool lock_all_vcpus(struct kvm *kvm) in lock_all_vcpus() argument
373 kvm_for_each_vcpu(c, tmp_vcpu, kvm) { in lock_all_vcpus()
375 unlock_vcpus(kvm, c - 1); in lock_all_vcpus()
412 mutex_lock(&dev->kvm->lock); in vgic_v2_attr_regs_access()
414 ret = vgic_init(dev->kvm); in vgic_v2_attr_regs_access()
418 if (!lock_all_vcpus(dev->kvm)) { in vgic_v2_attr_regs_access()
435 unlock_all_vcpus(dev->kvm); in vgic_v2_attr_regs_access()
437 mutex_unlock(&dev->kvm->lock); in vgic_v2_attr_regs_access()
517 reg_attr->vcpu = kvm_mpidr_to_vcpu(dev->kvm, mpidr_reg); in vgic_v3_parse_attr()
519 reg_attr->vcpu = kvm_get_vcpu(dev->kvm, 0); in vgic_v3_parse_attr()
570 mutex_lock(&dev->kvm->lock); in vgic_v3_attr_regs_access()
572 if (unlikely(!vgic_initialized(dev->kvm))) { in vgic_v3_attr_regs_access()
577 if (!lock_all_vcpus(dev->kvm)) { in vgic_v3_attr_regs_access()
612 unlock_all_vcpus(dev->kvm); in vgic_v3_attr_regs_access()
614 mutex_unlock(&dev->kvm->lock); in vgic_v3_attr_regs_access()