aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/kvm/arm.c7
-rw-r--r--virt/kvm/arm/vgic.c22
2 files changed, 23 insertions, 6 deletions
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
index 13205bd9b359..c9fe9d71be73 100644
--- a/arch/arm/kvm/arm.c
+++ b/arch/arm/kvm/arm.c
@@ -464,6 +464,8 @@ static void update_vttbr(struct kvm *kvm)
464 464
465static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu) 465static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu)
466{ 466{
467 int ret;
468
467 if (likely(vcpu->arch.has_run_once)) 469 if (likely(vcpu->arch.has_run_once))
468 return 0; 470 return 0;
469 471
@@ -473,9 +475,8 @@ static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu)
473 * Initialize the VGIC before running a vcpu the first time on 475 * Initialize the VGIC before running a vcpu the first time on
474 * this VM. 476 * this VM.
475 */ 477 */
476 if (irqchip_in_kernel(vcpu->kvm) && 478 if (unlikely(!vgic_initialized(vcpu->kvm))) {
477 unlikely(!vgic_initialized(vcpu->kvm))) { 479 ret = kvm_vgic_init(vcpu->kvm);
478 int ret = kvm_vgic_init(vcpu->kvm);
479 if (ret) 480 if (ret)
480 return ret; 481 return ret;
481 } 482 }
diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c
index 81e9481184a7..5e9df47778fb 100644
--- a/virt/kvm/arm/vgic.c
+++ b/virt/kvm/arm/vgic.c
@@ -1243,15 +1243,19 @@ static irqreturn_t vgic_maintenance_handler(int irq, void *data)
1243 return IRQ_HANDLED; 1243 return IRQ_HANDLED;
1244} 1244}
1245 1245
1246/**
1247 * kvm_vgic_vcpu_init - Initialize per-vcpu VGIC state
1248 * @vcpu: pointer to the vcpu struct
1249 *
1250 * Initialize the vgic_cpu struct and vgic_dist struct fields pertaining to
1251 * this vcpu and enable the VGIC for this VCPU
1252 */
1246int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu) 1253int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu)
1247{ 1254{
1248 struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu; 1255 struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
1249 struct vgic_dist *dist = &vcpu->kvm->arch.vgic; 1256 struct vgic_dist *dist = &vcpu->kvm->arch.vgic;
1250 int i; 1257 int i;
1251 1258
1252 if (!irqchip_in_kernel(vcpu->kvm))
1253 return 0;
1254
1255 if (vcpu->vcpu_id >= VGIC_MAX_CPUS) 1259 if (vcpu->vcpu_id >= VGIC_MAX_CPUS)
1256 return -EBUSY; 1260 return -EBUSY;
1257 1261
@@ -1383,10 +1387,22 @@ out:
1383 return ret; 1387 return ret;
1384} 1388}
1385 1389
1390/**
1391 * kvm_vgic_init - Initialize global VGIC state before running any VCPUs
1392 * @kvm: pointer to the kvm struct
1393 *
1394 * Map the virtual CPU interface into the VM before running any VCPUs. We
1395 * can't do this at creation time, because user space must first set the
1396 * virtual CPU interface address in the guest physical address space. Also
1397 * initialize the ITARGETSRn regs to 0 on the emulated distributor.
1398 */
1386int kvm_vgic_init(struct kvm *kvm) 1399int kvm_vgic_init(struct kvm *kvm)
1387{ 1400{
1388 int ret = 0, i; 1401 int ret = 0, i;
1389 1402
1403 if (!irqchip_in_kernel(kvm))
1404 return 0;
1405
1390 mutex_lock(&kvm->lock); 1406 mutex_lock(&kvm->lock);
1391 1407
1392 if (vgic_initialized(kvm)) 1408 if (vgic_initialized(kvm))