kvm_vgic_unmap_phys_irq(vcpu, vtimer->irq.irq);
}
-static bool timer_irqs_are_valid(struct kvm *kvm)
+static bool timer_irqs_are_valid(struct kvm_vcpu *vcpu)
{
- struct kvm_vcpu *vcpu;
int vtimer_irq, ptimer_irq;
- int i;
+ int i, ret;
- vcpu = kvm_get_vcpu(kvm, 0);
vtimer_irq = vcpu_vtimer(vcpu)->irq.irq;
- ptimer_irq = vcpu_ptimer(vcpu)->irq.irq;
+ ret = kvm_vgic_set_owner(vcpu, vtimer_irq, vcpu_vtimer(vcpu));
+ if (ret)
+ return false;
- if (vtimer_irq == ptimer_irq)
+ ptimer_irq = vcpu_ptimer(vcpu)->irq.irq;
+ ret = kvm_vgic_set_owner(vcpu, ptimer_irq, vcpu_ptimer(vcpu));
+ if (ret)
return false;
- kvm_for_each_vcpu(i, vcpu, kvm) {
+ kvm_for_each_vcpu(i, vcpu, vcpu->kvm) {
if (vcpu_vtimer(vcpu)->irq.irq != vtimer_irq ||
vcpu_ptimer(vcpu)->irq.irq != ptimer_irq)
return false;
if (!vgic_initialized(vcpu->kvm))
return -ENODEV;
- if (!timer_irqs_are_valid(vcpu->kvm)) {
+ if (!timer_irqs_are_valid(vcpu)) {
kvm_debug("incorrectly configured timer irqs\n");
return -EINVAL;
}
return -EBUSY;
if (irqchip_in_kernel(vcpu->kvm)) {
+ int ret;
+
/*
* If using the PMU with an in-kernel virtual GIC
* implementation, we require the GIC to be already
if (!kvm_arm_pmu_irq_initialized(vcpu))
return -ENXIO;
+
+ ret = kvm_vgic_set_owner(vcpu, vcpu->arch.pmu.irq_num,
+ &vcpu->arch.pmu);
+ if (ret)
+ return ret;
}
vcpu->arch.pmu.created = true;