static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu) { struct kvm *kvm = vcpu->kvm; int ret; if (likely(vcpu->arch.has_run_once)) return 0; vcpu->arch.has_run_once = true; /* * Map the VGIC hardware resources before running a vcpu the first * time on this VM. */ if (unlikely(irqchip_in_kernel(kvm) && !vgic_ready(kvm))) { ret = kvm_vgic_map_resources(kvm); if (ret) return ret; } /* * Enable the arch timers only if we have an in-kernel VGIC * and it has been properly initialized, since we cannot handle * interrupts from the virtual timer with a userspace gic. */ if (irqchip_in_kernel(kvm) && vgic_initialized(kvm)) kvm_timer_enable(kvm); return 0; }
static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu) { struct kvm *kvm = vcpu->kvm; int ret = 0; if (likely(vcpu->arch.has_run_once)) return 0; vcpu->arch.has_run_once = true; /* * Map the VGIC hardware resources before running a vcpu the first * time on this VM. */ if (unlikely(irqchip_in_kernel(kvm) && !vgic_ready(kvm))) { ret = kvm_vgic_map_resources(kvm); if (ret) return ret; } ret = kvm_timer_enable(vcpu); if (ret) return ret; ret = kvm_arm_pmu_v3_enable(vcpu); return ret; }