Also check index of vcpus as they are initialized against VGIC_MAX_CPUS so future changes of these defines doesn't cause inadvertent kernel crashes. Cc: Marc Zyngier <marc.zyngier@xxxxxxx> Signed-off-by: Christoffer Dall <c.dall@xxxxxxxxxxxxxxxxxxxxxx> --- arch/arm/include/asm/kvm_vgic.h | 4 ++-- arch/arm/kvm/arm.c | 6 +++++- arch/arm/kvm/vgic.c | 7 +++++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/arch/arm/include/asm/kvm_vgic.h b/arch/arm/include/asm/kvm_vgic.h index 7d2662c..065aa0b 100644 --- a/arch/arm/include/asm/kvm_vgic.h +++ b/arch/arm/include/asm/kvm_vgic.h @@ -28,7 +28,7 @@ #define VGIC_NR_IRQS 128 #define VGIC_NR_SHARED_IRQS (VGIC_NR_IRQS - 32) -#define VGIC_MAX_CPUS NR_CPUS +#define VGIC_MAX_CPUS KVM_MAX_VCPUS /* Sanity checks... */ #if (VGIC_MAX_CPUS > 8) @@ -246,7 +246,7 @@ int kvm_vgic_set_addr(struct kvm *kvm, unsigned long type, u64 addr); int kvm_vgic_hyp_init(void); int kvm_vgic_init(struct kvm *kvm); int kvm_vgic_create(struct kvm *kvm); -void kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu); +int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu); void kvm_vgic_sync_to_cpu(struct kvm_vcpu *vcpu); void kvm_vgic_sync_from_cpu(struct kvm_vcpu *vcpu); int kvm_vgic_inject_irq(struct kvm *kvm, int cpuid, unsigned int irq_num, diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index e62ba49..7a286d9 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c @@ -318,11 +318,15 @@ int __attribute_const__ kvm_target_cpu(void) int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu) { + int ret; + /* Force users to call KVM_ARM_VCPU_INIT */ vcpu->arch.target = -1; /* Set up VGIC */ - kvm_vgic_vcpu_init(vcpu); + ret = kvm_vgic_vcpu_init(vcpu); + if (ret) + return ret; /* Set up the timer */ kvm_timer_vcpu_init(vcpu); diff --git a/arch/arm/kvm/vgic.c b/arch/arm/kvm/vgic.c index 1f00b02..922a0aa 100644 --- a/arch/arm/kvm/vgic.c +++ b/arch/arm/kvm/vgic.c @@ -1045,7 +1045,7 @@ static irqreturn_t vgic_maintenance_handler(int irq, void *data) return IRQ_HANDLED; } -void kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu) +int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu) { struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu; struct vgic_dist *dist = &vcpu->kvm->arch.vgic; @@ -1053,7 +1053,10 @@ void kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu) int i; if (!irqchip_in_kernel(vcpu->kvm)) - return; + return 0; + + if (vcpu->vcpu_id >= VGIC_MAX_CPUS) + return -EBUSY; for (i = 0; i < VGIC_NR_IRQS; i++) { if (i < 16) -- 1.7.9.5 _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm