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

Commit 0f347bb9 authored by Russell King's avatar Russell King Committed by Russell King
Browse files

[ARM] gic: Fix gic cascade irq handling



No need for the cascade irq function to have a "fastcall" annotation.
Fix the range checking for valid IRQ numbers - comparing the value
returned by the GIC with NR_IRQS is meaningless since we translate
the GIC irq number to a Linux IRQ number afterwards.

Check the GIC returned IRQ number is within limits first, then add
the IRQ offset, and only then compare with NR_IRQS.

Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent f3270f6e
Loading
Loading
Loading
Loading
+9 −11
Original line number Original line Diff line number Diff line
@@ -125,12 +125,11 @@ static void gic_set_cpu(unsigned int irq, cpumask_t mask_val)
}
}
#endif
#endif


static void fastcall gic_handle_cascade_irq(unsigned int irq,
static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc)
					    struct irq_desc *desc)
{
{
	struct gic_chip_data *chip_data = get_irq_data(irq);
	struct gic_chip_data *chip_data = get_irq_data(irq);
	struct irq_chip *chip = get_irq_chip(irq);
	struct irq_chip *chip = get_irq_chip(irq);
	unsigned int cascade_irq;
	unsigned int cascade_irq, gic_irq;
	unsigned long status;
	unsigned long status;


	/* primary controller ack'ing */
	/* primary controller ack'ing */
@@ -140,15 +139,14 @@ static void fastcall gic_handle_cascade_irq(unsigned int irq,
	status = readl(chip_data->cpu_base + GIC_CPU_INTACK);
	status = readl(chip_data->cpu_base + GIC_CPU_INTACK);
	spin_unlock(&irq_controller_lock);
	spin_unlock(&irq_controller_lock);


	cascade_irq = (status & 0x3ff);
	gic_irq = (status & 0x3ff);
	if (cascade_irq > 1020)
	if (gic_irq == 1023)
		goto out;
		goto out;
	if (cascade_irq < 32 || cascade_irq >= NR_IRQS) {
		do_bad_IRQ(cascade_irq, desc);
		goto out;
	}


	cascade_irq += chip_data->irq_offset;
	cascade_irq = gic_irq + chip_data->irq_offset;
	if (unlikely(gic_irq < 32 || gic_irq > 1020 || cascade_irq >= NR_IRQS))
		do_bad_IRQ(cascade_irq, desc);
	else
		generic_handle_irq(cascade_irq);
		generic_handle_irq(cascade_irq);


 out:
 out: