mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00

The recent kstack erase changes appear to have uncovered an existing
issue with a missing header inclusion:
In file included from drivers/misc/lkdtm/kstack_erase.c:12:
In file included from include/linux/kstack_erase.h:16:
arch/arm/include/asm/stacktrace.h:48:21: error: call to undeclared function 'in_entry_text'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
48 | frame->ex_frame = in_entry_text(frame->pc);
| ^
Include asm/sections.h here so the compiler can see the in_entry_text()
declaration.
Fixes: 752ec621ef
("ARM: 9234/1: stacktrace: Avoid duplicate saving of exception PC value")
Cc: Kees Cook <kees@kernel.org>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20250807071902.4077714-1-arnd@kernel.org
Signed-off-by: Kees Cook <kees@kernel.org>
62 lines
1.5 KiB
C
62 lines
1.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __ASM_STACKTRACE_H
|
|
#define __ASM_STACKTRACE_H
|
|
|
|
#include <linux/llist.h>
|
|
#include <asm/ptrace.h>
|
|
#include <asm/sections.h>
|
|
|
|
struct stackframe {
|
|
/*
|
|
* FP member should hold R7 when CONFIG_THUMB2_KERNEL is enabled
|
|
* and R11 otherwise.
|
|
*/
|
|
unsigned long fp;
|
|
unsigned long sp;
|
|
unsigned long lr;
|
|
unsigned long pc;
|
|
|
|
/* address of the LR value on the stack */
|
|
unsigned long *lr_addr;
|
|
#ifdef CONFIG_KRETPROBES
|
|
struct llist_node *kr_cur;
|
|
struct task_struct *tsk;
|
|
#endif
|
|
#ifdef CONFIG_UNWINDER_FRAME_POINTER
|
|
bool ex_frame;
|
|
#endif
|
|
};
|
|
|
|
static inline bool on_thread_stack(void)
|
|
{
|
|
unsigned long delta = current_stack_pointer ^ (unsigned long)current->stack;
|
|
|
|
return delta < THREAD_SIZE;
|
|
}
|
|
|
|
static __always_inline
|
|
void arm_get_current_stackframe(struct pt_regs *regs, struct stackframe *frame)
|
|
{
|
|
frame->fp = frame_pointer(regs);
|
|
frame->sp = regs->ARM_sp;
|
|
frame->lr = regs->ARM_lr;
|
|
frame->pc = regs->ARM_pc;
|
|
#ifdef CONFIG_KRETPROBES
|
|
frame->kr_cur = NULL;
|
|
frame->tsk = current;
|
|
#endif
|
|
#ifdef CONFIG_UNWINDER_FRAME_POINTER
|
|
frame->ex_frame = in_entry_text(frame->pc);
|
|
#endif
|
|
}
|
|
|
|
extern int unwind_frame(struct stackframe *frame);
|
|
extern void walk_stackframe(struct stackframe *frame,
|
|
bool (*fn)(void *, unsigned long), void *data);
|
|
extern void dump_mem(const char *lvl, const char *str, unsigned long bottom,
|
|
unsigned long top);
|
|
extern void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk,
|
|
const char *loglvl);
|
|
|
|
#endif /* __ASM_STACKTRACE_H */
|