path: root/arch/arm64/include/asm/stacktrace.h
diff options
authorMark Rutland <mark.rutland@arm.com>2017-07-20 12:26:48 +0100
committerMark Rutland <mark.rutland@arm.com>2017-08-15 18:35:14 +0100
commitf60ad4edcf07238a3d2646d65d8d217032452550 (patch)
tree9fcaefe674ed52734edf1c7f5719e69c31ace93a /arch/arm64/include/asm/stacktrace.h
parentarm64: clean up THREAD_* definitions (diff)
arm64: clean up irq stack definitions
Before we add yet another stack to the kernel, it would be nice to ensure that we consistently organise stack definitions and related helper functions. This patch moves the basic IRQ stack defintions to <asm/memory.h> to live with their task stack counterparts. Helpers used for unwinding are moved into <asm/stacktrace.h>, where subsequent patches will add helpers for other stacks. Includes are fixed up accordingly. This patch is a pure refactoring -- there should be no functional changes as a result of this patch. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Reviewed-by: Will Deacon <will.deacon@arm.com> Tested-by: Laura Abbott <labbott@redhat.com> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: James Morse <james.morse@arm.com>
Diffstat (limited to '')
1 files changed, 24 insertions, 1 deletions
diff --git a/arch/arm64/include/asm/stacktrace.h b/arch/arm64/include/asm/stacktrace.h
index 3bebab378c72..000e24182a5c 100644
--- a/arch/arm64/include/asm/stacktrace.h
+++ b/arch/arm64/include/asm/stacktrace.h
@@ -16,7 +16,12 @@
-struct task_struct;
+#include <linux/percpu.h>
+#include <linux/sched.h>
+#include <linux/sched/task_stack.h>
+#include <asm/memory.h>
+#include <asm/ptrace.h>
struct stackframe {
unsigned long fp;
@@ -31,4 +36,22 @@ extern void walk_stackframe(struct task_struct *tsk, struct stackframe *frame,
int (*fn)(struct stackframe *, void *), void *data);
extern void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk);
+DECLARE_PER_CPU(unsigned long [IRQ_STACK_SIZE/sizeof(long)], irq_stack);
+static inline bool on_irq_stack(unsigned long sp)
+ unsigned long low = (unsigned long)raw_cpu_ptr(irq_stack);
+ unsigned long high = low + IRQ_STACK_SIZE;
+ return (low <= sp && sp < high);
+static inline bool on_task_stack(struct task_struct *tsk, unsigned long sp)
+ unsigned long low = (unsigned long)task_stack_page(tsk);
+ unsigned long high = low + THREAD_SIZE;
+ return (low <= sp && sp < high);
#endif /* __ASM_STACKTRACE_H */