ARM kprobes: prevent some functions involved with kprobes from being probed
Signed-off-by: Nicolas Pitre <nico@marvell.com>
This commit is contained in:
parent
d30a0c8bf9
commit
785d3cd286
@ -58,6 +58,12 @@
|
|||||||
|
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
#ifdef CONFIG_KPROBES
|
||||||
|
.section .kprobes.text,"ax",%progbits
|
||||||
|
#else
|
||||||
|
.text
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Invalid mode handlers
|
* Invalid mode handlers
|
||||||
*/
|
*/
|
||||||
@ -562,7 +568,7 @@ do_fpe:
|
|||||||
.data
|
.data
|
||||||
ENTRY(fp_enter)
|
ENTRY(fp_enter)
|
||||||
.word no_fp
|
.word no_fp
|
||||||
.text
|
.previous
|
||||||
|
|
||||||
no_fp: mov pc, lr
|
no_fp: mov pc, lr
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
|
|||||||
unsigned long addr = (unsigned long)p->addr;
|
unsigned long addr = (unsigned long)p->addr;
|
||||||
int is;
|
int is;
|
||||||
|
|
||||||
if (addr & 0x3)
|
if (addr & 0x3 || in_exception_text(addr))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
insn = *p->addr;
|
insn = *p->addr;
|
||||||
|
@ -46,15 +46,6 @@ __setup("user_debug=", user_debug_setup);
|
|||||||
|
|
||||||
static void dump_mem(const char *str, unsigned long bottom, unsigned long top);
|
static void dump_mem(const char *str, unsigned long bottom, unsigned long top);
|
||||||
|
|
||||||
static inline int in_exception_text(unsigned long ptr)
|
|
||||||
{
|
|
||||||
extern char __exception_text_start[];
|
|
||||||
extern char __exception_text_end[];
|
|
||||||
|
|
||||||
return ptr >= (unsigned long)&__exception_text_start &&
|
|
||||||
ptr < (unsigned long)&__exception_text_end;
|
|
||||||
}
|
|
||||||
|
|
||||||
void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame)
|
void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_KALLSYMS
|
#ifdef CONFIG_KALLSYMS
|
||||||
|
@ -94,6 +94,7 @@ SECTIONS
|
|||||||
TEXT_TEXT
|
TEXT_TEXT
|
||||||
SCHED_TEXT
|
SCHED_TEXT
|
||||||
LOCK_TEXT
|
LOCK_TEXT
|
||||||
|
KPROBES_TEXT
|
||||||
#ifdef CONFIG_MMU
|
#ifdef CONFIG_MMU
|
||||||
*(.fixup)
|
*(.fixup)
|
||||||
#endif
|
#endif
|
||||||
|
@ -239,7 +239,7 @@ __do_page_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr,
|
|||||||
return fault;
|
return fault;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int __kprobes
|
||||||
do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct task_struct *tsk;
|
struct task_struct *tsk;
|
||||||
@ -338,7 +338,7 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
|||||||
* interrupt or a critical region, and should only copy the information
|
* interrupt or a critical region, and should only copy the information
|
||||||
* from the master page table, nothing more.
|
* from the master page table, nothing more.
|
||||||
*/
|
*/
|
||||||
static int
|
static int __kprobes
|
||||||
do_translation_fault(unsigned long addr, unsigned int fsr,
|
do_translation_fault(unsigned long addr, unsigned int fsr,
|
||||||
struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
@ -15,4 +15,13 @@ struct undef_hook {
|
|||||||
void register_undef_hook(struct undef_hook *hook);
|
void register_undef_hook(struct undef_hook *hook);
|
||||||
void unregister_undef_hook(struct undef_hook *hook);
|
void unregister_undef_hook(struct undef_hook *hook);
|
||||||
|
|
||||||
|
static inline int in_exception_text(unsigned long ptr)
|
||||||
|
{
|
||||||
|
extern char __exception_text_start[];
|
||||||
|
extern char __exception_text_end[];
|
||||||
|
|
||||||
|
return ptr >= (unsigned long)&__exception_text_start &&
|
||||||
|
ptr < (unsigned long)&__exception_text_end;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user