On 19/11/12 08:06, Christoffer Dall wrote: > 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. Yes, this is what the code used to be. > Cc: Marc Zyngier <marc.zyngier@xxxxxxx> > Signed-off-by: Christoffer Dall <c.dall@xxxxxxxxxxxxxxxxxxxxxx> Acked-by: Marc Zyngier <marc.zyngier@xxxxxxx> > --- > 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) > -- Jazz is not dead. It just smells funny... _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm