ARM: probes: avoid adding kprobes to sensitive kernel-entry/exit code
Avoid adding kprobes to any of the kernel entry/exit or startup assembly code, or code in the identity-mapped region. This code does not conform to the standard C conventions, which means that the expectations of the kprobes code is not forfilled. Placing kprobes at some of these locations results in the kernel trying to return to userspace addresses while retaining the CPU in kernel mode. Tested-by: Naresh Kamboju <naresh.kamboju@linaro.org> Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
This commit is contained in:
@@ -10,11 +10,10 @@
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#define __exception __attribute__((section(".exception.text")))
|
||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||
#define __exception_irq_entry __irq_entry
|
||||
#else
|
||||
#define __exception_irq_entry __exception
|
||||
#define __exception_irq_entry
|
||||
#endif
|
||||
|
||||
#endif /* __ASM_ARM_EXCEPTION_H */
|
||||
|
@@ -6,4 +6,25 @@
|
||||
|
||||
extern char _exiprom[];
|
||||
|
||||
extern char __idmap_text_start[];
|
||||
extern char __idmap_text_end[];
|
||||
extern char __entry_text_start[];
|
||||
extern char __entry_text_end[];
|
||||
extern char __hyp_idmap_text_start[];
|
||||
extern char __hyp_idmap_text_end[];
|
||||
|
||||
static inline bool in_entry_text(unsigned long addr)
|
||||
{
|
||||
return memory_contains(__entry_text_start, __entry_text_end,
|
||||
(void *)addr, 1);
|
||||
}
|
||||
|
||||
static inline bool in_idmap_text(unsigned long addr)
|
||||
{
|
||||
void *a = (void *)addr;
|
||||
return memory_contains(__idmap_text_start, __idmap_text_end, a, 1) ||
|
||||
memory_contains(__hyp_idmap_text_start, __hyp_idmap_text_end,
|
||||
a, 1);
|
||||
}
|
||||
|
||||
#endif /* _ASM_ARM_SECTIONS_H */
|
||||
|
@@ -28,18 +28,6 @@ static inline int __in_irqentry_text(unsigned long ptr)
|
||||
ptr < (unsigned long)&__irqentry_text_end;
|
||||
}
|
||||
|
||||
static inline int in_exception_text(unsigned long ptr)
|
||||
{
|
||||
extern char __exception_text_start[];
|
||||
extern char __exception_text_end[];
|
||||
int in;
|
||||
|
||||
in = ptr >= (unsigned long)&__exception_text_start &&
|
||||
ptr < (unsigned long)&__exception_text_end;
|
||||
|
||||
return in ? : __in_irqentry_text(ptr);
|
||||
}
|
||||
|
||||
extern void __init early_trap_init(void *);
|
||||
extern void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame);
|
||||
extern void ptrace_break(struct task_struct *tsk, struct pt_regs *regs);
|
||||
|
Reference in New Issue
Block a user