Lines Matching full:vcpu

19 unsigned long vgic_mmio_read_raz(struct kvm_vcpu *vcpu,  in vgic_mmio_read_raz()  argument
25 unsigned long vgic_mmio_read_rao(struct kvm_vcpu *vcpu, in vgic_mmio_read_rao() argument
31 void vgic_mmio_write_wi(struct kvm_vcpu *vcpu, gpa_t addr, in vgic_mmio_write_wi() argument
37 int vgic_mmio_uaccess_write_wi(struct kvm_vcpu *vcpu, gpa_t addr, in vgic_mmio_uaccess_write_wi() argument
44 unsigned long vgic_mmio_read_group(struct kvm_vcpu *vcpu, in vgic_mmio_read_group() argument
53 struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in vgic_mmio_read_group()
58 vgic_put_irq(vcpu->kvm, irq); in vgic_mmio_read_group()
69 void vgic_mmio_write_group(struct kvm_vcpu *vcpu, gpa_t addr, in vgic_mmio_write_group() argument
77 struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in vgic_mmio_write_group()
85 vgic_queue_irq_unlock(vcpu->kvm, irq, flags); in vgic_mmio_write_group()
88 vgic_put_irq(vcpu->kvm, irq); in vgic_mmio_write_group()
96 unsigned long vgic_mmio_read_enable(struct kvm_vcpu *vcpu, in vgic_mmio_read_enable() argument
105 struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in vgic_mmio_read_enable()
110 vgic_put_irq(vcpu->kvm, irq); in vgic_mmio_read_enable()
116 void vgic_mmio_write_senable(struct kvm_vcpu *vcpu, in vgic_mmio_write_senable() argument
125 struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in vgic_mmio_write_senable()
139 vgic_put_irq(vcpu->kvm, irq); in vgic_mmio_write_senable()
159 vgic_queue_irq_unlock(vcpu->kvm, irq, flags); in vgic_mmio_write_senable()
161 vgic_put_irq(vcpu->kvm, irq); in vgic_mmio_write_senable()
165 void vgic_mmio_write_cenable(struct kvm_vcpu *vcpu, in vgic_mmio_write_cenable() argument
174 struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in vgic_mmio_write_cenable()
183 vgic_put_irq(vcpu->kvm, irq); in vgic_mmio_write_cenable()
187 int vgic_uaccess_write_senable(struct kvm_vcpu *vcpu, in vgic_uaccess_write_senable() argument
196 struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in vgic_uaccess_write_senable()
200 vgic_queue_irq_unlock(vcpu->kvm, irq, flags); in vgic_uaccess_write_senable()
202 vgic_put_irq(vcpu->kvm, irq); in vgic_uaccess_write_senable()
208 int vgic_uaccess_write_cenable(struct kvm_vcpu *vcpu, in vgic_uaccess_write_cenable() argument
217 struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in vgic_uaccess_write_cenable()
223 vgic_put_irq(vcpu->kvm, irq); in vgic_uaccess_write_cenable()
229 static unsigned long __read_pending(struct kvm_vcpu *vcpu, in __read_pending() argument
239 struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in __read_pending()
261 vgic_put_irq(vcpu->kvm, irq); in __read_pending()
267 unsigned long vgic_mmio_read_pending(struct kvm_vcpu *vcpu, in vgic_mmio_read_pending() argument
270 return __read_pending(vcpu, addr, len, false); in vgic_mmio_read_pending()
273 unsigned long vgic_uaccess_read_pending(struct kvm_vcpu *vcpu, in vgic_uaccess_read_pending() argument
276 return __read_pending(vcpu, addr, len, true); in vgic_uaccess_read_pending()
279 static bool is_vgic_v2_sgi(struct kvm_vcpu *vcpu, struct vgic_irq *irq) in is_vgic_v2_sgi() argument
282 vcpu->kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V2); in is_vgic_v2_sgi()
285 void vgic_mmio_write_spending(struct kvm_vcpu *vcpu, in vgic_mmio_write_spending() argument
294 struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in vgic_mmio_write_spending()
297 if (is_vgic_v2_sgi(vcpu, irq)) { in vgic_mmio_write_spending()
298 vgic_put_irq(vcpu->kvm, irq); in vgic_mmio_write_spending()
313 vgic_put_irq(vcpu->kvm, irq); in vgic_mmio_write_spending()
322 vgic_queue_irq_unlock(vcpu->kvm, irq, flags); in vgic_mmio_write_spending()
323 vgic_put_irq(vcpu->kvm, irq); in vgic_mmio_write_spending()
327 int vgic_uaccess_write_spending(struct kvm_vcpu *vcpu, in vgic_uaccess_write_spending() argument
336 struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in vgic_uaccess_write_spending()
343 * the source of the interrupt, so just pick the vcpu in vgic_uaccess_write_spending()
346 if (is_vgic_v2_sgi(vcpu, irq)) in vgic_uaccess_write_spending()
347 irq->source |= BIT(vcpu->vcpu_id); in vgic_uaccess_write_spending()
349 vgic_queue_irq_unlock(vcpu->kvm, irq, flags); in vgic_uaccess_write_spending()
351 vgic_put_irq(vcpu->kvm, irq); in vgic_uaccess_write_spending()
358 static void vgic_hw_irq_cpending(struct kvm_vcpu *vcpu, struct vgic_irq *irq) in vgic_hw_irq_cpending() argument
378 void vgic_mmio_write_cpending(struct kvm_vcpu *vcpu, in vgic_mmio_write_cpending() argument
387 struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in vgic_mmio_write_cpending()
390 if (is_vgic_v2_sgi(vcpu, irq)) { in vgic_mmio_write_cpending()
391 vgic_put_irq(vcpu->kvm, irq); in vgic_mmio_write_cpending()
406 vgic_put_irq(vcpu->kvm, irq); in vgic_mmio_write_cpending()
412 vgic_hw_irq_cpending(vcpu, irq); in vgic_mmio_write_cpending()
417 vgic_put_irq(vcpu->kvm, irq); in vgic_mmio_write_cpending()
421 int vgic_uaccess_write_cpending(struct kvm_vcpu *vcpu, in vgic_uaccess_write_cpending() argument
430 struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in vgic_uaccess_write_cpending()
435 * from userspace, which source vcpu to clear? Let's not in vgic_uaccess_write_cpending()
438 if (is_vgic_v2_sgi(vcpu, irq)) in vgic_uaccess_write_cpending()
445 vgic_put_irq(vcpu->kvm, irq); in vgic_uaccess_write_cpending()
453 * is not queued on some running VCPU's LRs, because then the change to the
454 * active state can be overwritten when the VCPU's state is synced coming back
463 * stopped, and only the VCPU itself can modify its private interrupts
464 * active state, which guarantees that the VCPU is not running.
466 static void vgic_access_active_prepare(struct kvm_vcpu *vcpu, u32 intid) in vgic_access_active_prepare() argument
468 if (vcpu->kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3 || in vgic_access_active_prepare()
470 kvm_arm_halt_guest(vcpu->kvm); in vgic_access_active_prepare()
474 static void vgic_access_active_finish(struct kvm_vcpu *vcpu, u32 intid) in vgic_access_active_finish() argument
476 if (vcpu->kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3 || in vgic_access_active_finish()
478 kvm_arm_resume_guest(vcpu->kvm); in vgic_access_active_finish()
481 static unsigned long __vgic_mmio_read_active(struct kvm_vcpu *vcpu, in __vgic_mmio_read_active() argument
490 struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in __vgic_mmio_read_active()
499 vgic_put_irq(vcpu->kvm, irq); in __vgic_mmio_read_active()
505 unsigned long vgic_mmio_read_active(struct kvm_vcpu *vcpu, in vgic_mmio_read_active() argument
511 mutex_lock(&vcpu->kvm->lock); in vgic_mmio_read_active()
512 vgic_access_active_prepare(vcpu, intid); in vgic_mmio_read_active()
514 val = __vgic_mmio_read_active(vcpu, addr, len); in vgic_mmio_read_active()
516 vgic_access_active_finish(vcpu, intid); in vgic_mmio_read_active()
517 mutex_unlock(&vcpu->kvm->lock); in vgic_mmio_read_active()
522 unsigned long vgic_uaccess_read_active(struct kvm_vcpu *vcpu, in vgic_uaccess_read_active() argument
525 return __vgic_mmio_read_active(vcpu, addr, len); in vgic_uaccess_read_active()
529 static void vgic_hw_irq_change_active(struct kvm_vcpu *vcpu, struct vgic_irq *irq, in vgic_hw_irq_change_active() argument
539 static void vgic_mmio_change_active(struct kvm_vcpu *vcpu, struct vgic_irq *irq, in vgic_mmio_change_active() argument
548 vgic_hw_irq_change_active(vcpu, irq, active, !requester_vcpu); in vgic_mmio_change_active()
557 u32 model = vcpu->kvm->arch.vgic.vgic_model; in vgic_mmio_change_active()
569 * This may lead to a VCPU not being able to receive in vgic_mmio_change_active()
581 vgic_queue_irq_unlock(vcpu->kvm, irq, flags); in vgic_mmio_change_active()
586 static void __vgic_mmio_write_cactive(struct kvm_vcpu *vcpu, in __vgic_mmio_write_cactive() argument
594 struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in __vgic_mmio_write_cactive()
595 vgic_mmio_change_active(vcpu, irq, false); in __vgic_mmio_write_cactive()
596 vgic_put_irq(vcpu->kvm, irq); in __vgic_mmio_write_cactive()
600 void vgic_mmio_write_cactive(struct kvm_vcpu *vcpu, in vgic_mmio_write_cactive() argument
606 mutex_lock(&vcpu->kvm->lock); in vgic_mmio_write_cactive()
607 vgic_access_active_prepare(vcpu, intid); in vgic_mmio_write_cactive()
609 __vgic_mmio_write_cactive(vcpu, addr, len, val); in vgic_mmio_write_cactive()
611 vgic_access_active_finish(vcpu, intid); in vgic_mmio_write_cactive()
612 mutex_unlock(&vcpu->kvm->lock); in vgic_mmio_write_cactive()
615 int vgic_mmio_uaccess_write_cactive(struct kvm_vcpu *vcpu, in vgic_mmio_uaccess_write_cactive() argument
619 __vgic_mmio_write_cactive(vcpu, addr, len, val); in vgic_mmio_uaccess_write_cactive()
623 static void __vgic_mmio_write_sactive(struct kvm_vcpu *vcpu, in __vgic_mmio_write_sactive() argument
631 struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in __vgic_mmio_write_sactive()
632 vgic_mmio_change_active(vcpu, irq, true); in __vgic_mmio_write_sactive()
633 vgic_put_irq(vcpu->kvm, irq); in __vgic_mmio_write_sactive()
637 void vgic_mmio_write_sactive(struct kvm_vcpu *vcpu, in vgic_mmio_write_sactive() argument
643 mutex_lock(&vcpu->kvm->lock); in vgic_mmio_write_sactive()
644 vgic_access_active_prepare(vcpu, intid); in vgic_mmio_write_sactive()
646 __vgic_mmio_write_sactive(vcpu, addr, len, val); in vgic_mmio_write_sactive()
648 vgic_access_active_finish(vcpu, intid); in vgic_mmio_write_sactive()
649 mutex_unlock(&vcpu->kvm->lock); in vgic_mmio_write_sactive()
652 int vgic_mmio_uaccess_write_sactive(struct kvm_vcpu *vcpu, in vgic_mmio_uaccess_write_sactive() argument
656 __vgic_mmio_write_sactive(vcpu, addr, len, val); in vgic_mmio_uaccess_write_sactive()
660 unsigned long vgic_mmio_read_priority(struct kvm_vcpu *vcpu, in vgic_mmio_read_priority() argument
668 struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in vgic_mmio_read_priority()
672 vgic_put_irq(vcpu->kvm, irq); in vgic_mmio_read_priority()
680 * is already pending on a VCPU. If there is a need for this, we would
681 * need to make this VCPU exit and re-evaluate the priorities, potentially
685 void vgic_mmio_write_priority(struct kvm_vcpu *vcpu, in vgic_mmio_write_priority() argument
694 struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in vgic_mmio_write_priority()
703 vgic_put_irq(vcpu->kvm, irq); in vgic_mmio_write_priority()
707 unsigned long vgic_mmio_read_config(struct kvm_vcpu *vcpu, in vgic_mmio_read_config() argument
715 struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in vgic_mmio_read_config()
720 vgic_put_irq(vcpu->kvm, irq); in vgic_mmio_read_config()
726 void vgic_mmio_write_config(struct kvm_vcpu *vcpu, in vgic_mmio_write_config() argument
746 irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in vgic_mmio_write_config()
755 vgic_put_irq(vcpu->kvm, irq); in vgic_mmio_write_config()
759 u64 vgic_read_irq_line_level_info(struct kvm_vcpu *vcpu, u32 intid) in vgic_read_irq_line_level_info() argument
763 int nr_irqs = vcpu->kvm->arch.vgic.nr_spis + VGIC_NR_PRIVATE_IRQS; in vgic_read_irq_line_level_info()
771 irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in vgic_read_irq_line_level_info()
775 vgic_put_irq(vcpu->kvm, irq); in vgic_read_irq_line_level_info()
781 void vgic_write_irq_line_level_info(struct kvm_vcpu *vcpu, u32 intid, in vgic_write_irq_line_level_info() argument
785 int nr_irqs = vcpu->kvm->arch.vgic.nr_spis + VGIC_NR_PRIVATE_IRQS; in vgic_write_irq_line_level_info()
795 irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i); in vgic_write_irq_line_level_info()
806 vgic_queue_irq_unlock(vcpu->kvm, irq, flags); in vgic_write_irq_line_level_info()
810 vgic_put_irq(vcpu->kvm, irq); in vgic_write_irq_line_level_info()
836 void vgic_set_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr) in vgic_set_vmcr() argument
839 vgic_v2_set_vmcr(vcpu, vmcr); in vgic_set_vmcr()
841 vgic_v3_set_vmcr(vcpu, vmcr); in vgic_set_vmcr()
844 void vgic_get_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr) in vgic_get_vmcr() argument
847 vgic_v2_get_vmcr(vcpu, vmcr); in vgic_get_vmcr()
849 vgic_v3_get_vmcr(vcpu, vmcr); in vgic_get_vmcr()
943 vgic_get_mmio_region(struct kvm_vcpu *vcpu, struct vgic_io_device *iodev, in vgic_get_mmio_region() argument
950 if (!region || !check_region(vcpu->kvm, region, addr, len)) in vgic_get_mmio_region()
956 static int vgic_uaccess_read(struct kvm_vcpu *vcpu, struct kvm_io_device *dev, in vgic_uaccess_read() argument
963 region = vgic_get_mmio_region(vcpu, iodev, addr, sizeof(u32)); in vgic_uaccess_read()
969 r_vcpu = iodev->redist_vcpu ? iodev->redist_vcpu : vcpu; in vgic_uaccess_read()
978 static int vgic_uaccess_write(struct kvm_vcpu *vcpu, struct kvm_io_device *dev, in vgic_uaccess_write() argument
985 region = vgic_get_mmio_region(vcpu, iodev, addr, sizeof(u32)); in vgic_uaccess_write()
989 r_vcpu = iodev->redist_vcpu ? iodev->redist_vcpu : vcpu; in vgic_uaccess_write()
1000 int vgic_uaccess(struct kvm_vcpu *vcpu, struct vgic_io_device *dev, in vgic_uaccess() argument
1004 return vgic_uaccess_write(vcpu, &dev->dev, offset, val); in vgic_uaccess()
1006 return vgic_uaccess_read(vcpu, &dev->dev, offset, val); in vgic_uaccess()
1009 static int dispatch_mmio_read(struct kvm_vcpu *vcpu, struct kvm_io_device *dev, in dispatch_mmio_read() argument
1016 region = vgic_get_mmio_region(vcpu, iodev, addr, len); in dispatch_mmio_read()
1024 data = region->read(vcpu, addr, len); in dispatch_mmio_read()
1027 data = region->read(vcpu, addr, len); in dispatch_mmio_read()
1033 data = region->its_read(vcpu->kvm, iodev->its, addr, len); in dispatch_mmio_read()
1041 static int dispatch_mmio_write(struct kvm_vcpu *vcpu, struct kvm_io_device *dev, in dispatch_mmio_write() argument
1048 region = vgic_get_mmio_region(vcpu, iodev, addr, len); in dispatch_mmio_write()
1054 region->write(vcpu, addr, len, data); in dispatch_mmio_write()
1057 region->write(vcpu, addr, len, data); in dispatch_mmio_write()
1063 region->its_write(vcpu->kvm, iodev->its, addr, len, data); in dispatch_mmio_write()