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

Commit d8b8b552 authored by Matt Redfearn's avatar Matt Redfearn Committed by Greg Kroah-Hartman
Browse files

MIPS: Introduce irq_stack



commit fe8bd18ffea5327344d4ec2bf11f47951212abd0 upstream.

Allocate a per-cpu irq stack for use within interrupt handlers.

Also add a utility function on_irq_stack to determine if a given stack
pointer is within the irq stack for that cpu.

Signed-off-by: default avatarMatt Redfearn <matt.redfearn@imgtec.com>
Acked-by: default avatarJason A. Donenfeld <jason@zx2c4.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Chris Metcalf <cmetcalf@mellanox.com>
Cc: Petr Mladek <pmladek@suse.com>
Cc: James Hogan <james.hogan@imgtec.com>
Cc: Paul Burton <paul.burton@imgtec.com>
Cc: Aaron Tomlin <atomlin@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/14740/


Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
Signed-off-by: default avatarAmit Pundir <amit.pundir@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 5a527d80
Loading
Loading
Loading
Loading
+12 −0
Original line number Original line Diff line number Diff line
@@ -17,6 +17,18 @@


#include <irq.h>
#include <irq.h>


#define IRQ_STACK_SIZE			THREAD_SIZE

extern void *irq_stack[NR_CPUS];

static inline bool on_irq_stack(int cpu, unsigned long sp)
{
	unsigned long low = (unsigned long)irq_stack[cpu];
	unsigned long high = low + IRQ_STACK_SIZE;

	return (low <= sp && sp <= high);
}

#ifdef CONFIG_I8259
#ifdef CONFIG_I8259
static inline int irq_canonicalize(int irq)
static inline int irq_canonicalize(int irq)
{
{
+1 −0
Original line number Original line Diff line number Diff line
@@ -101,6 +101,7 @@ void output_thread_info_defines(void)
	OFFSET(TI_REGS, thread_info, regs);
	OFFSET(TI_REGS, thread_info, regs);
	DEFINE(_THREAD_SIZE, THREAD_SIZE);
	DEFINE(_THREAD_SIZE, THREAD_SIZE);
	DEFINE(_THREAD_MASK, THREAD_MASK);
	DEFINE(_THREAD_MASK, THREAD_MASK);
	DEFINE(_IRQ_STACK_SIZE, IRQ_STACK_SIZE);
	BLANK();
	BLANK();
}
}


+11 −0
Original line number Original line Diff line number Diff line
@@ -25,6 +25,8 @@
#include <linux/atomic.h>
#include <linux/atomic.h>
#include <asm/uaccess.h>
#include <asm/uaccess.h>


void *irq_stack[NR_CPUS];

/*
/*
 * 'what should we do if we get a hw irq event on an illegal vector'.
 * 'what should we do if we get a hw irq event on an illegal vector'.
 * each architecture has to answer this themselves.
 * each architecture has to answer this themselves.
@@ -55,6 +57,15 @@ void __init init_IRQ(void)
		irq_set_noprobe(i);
		irq_set_noprobe(i);


	arch_init_irq();
	arch_init_irq();

	for_each_possible_cpu(i) {
		int irq_pages = IRQ_STACK_SIZE / PAGE_SIZE;
		void *s = (void *)__get_free_pages(GFP_KERNEL, irq_pages);

		irq_stack[i] = s;
		pr_debug("CPU%d IRQ stack at 0x%p - 0x%p\n", i,
			irq_stack[i], irq_stack[i] + IRQ_STACK_SIZE);
	}
}
}


#ifdef CONFIG_DEBUG_STACKOVERFLOW
#ifdef CONFIG_DEBUG_STACKOVERFLOW