From: Andreas Herrmann Date: Tue, 1 Oct 2013 12:39:07 +0000 (+0100) Subject: iommu/arm-smmu: Check for num_context_irqs > 0 to avoid divide by zero exception X-Git-Tag: firefly_0821_release~176^2~4966^2^5~2 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=44a08de2aaf7f4cf86dfcf04bee32536e4a2b5b8;p=firefly-linux-kernel-4.4.55.git iommu/arm-smmu: Check for num_context_irqs > 0 to avoid divide by zero exception With the right (or wrong;-) definition of v1 SMMU node in DTB it is possible to trigger a division by zero in arm_smmu_init_domain_context (if number of context irqs is 0): if (smmu->version == 1) { root_cfg->irptndx = atomic_inc_return(&smmu->irptndx); => root_cfg->irptndx %= smmu->num_context_irqs; } else { Avoid this by checking for num_context_irqs > 0 when probing for SMMU devices. Signed-off-by: Andreas Herrmann [will: changed to dev_err on probe failure path] Signed-off-by: Will Deacon --- diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c index 1f79daa5f4b1..e4693cee5f2c 100644 --- a/drivers/iommu/arm-smmu.c +++ b/drivers/iommu/arm-smmu.c @@ -1798,12 +1798,11 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev) smmu->num_context_irqs++; } - if (num_irqs < smmu->num_global_irqs) { - dev_warn(dev, "found %d interrupts but expected at least %d\n", - num_irqs, smmu->num_global_irqs); - smmu->num_global_irqs = num_irqs; + if (!smmu->num_context_irqs) { + dev_err(dev, "found %d interrupts but expected at least %d\n", + num_irqs, smmu->num_global_irqs + 1); + return -ENODEV; } - smmu->num_context_irqs = num_irqs - smmu->num_global_irqs; smmu->irqs = devm_kzalloc(dev, sizeof(*smmu->irqs) * num_irqs, GFP_KERNEL);