Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 44a08de2 authored by Andreas Herrmann's avatar Andreas Herrmann Committed by Will Deacon
Browse files

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: default avatarAndreas Herrmann <andreas.herrmann@calxeda.com>
[will: changed to dev_err on probe failure path]
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
parent c55af7f7
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -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);