Commit 785d3cd2 authored by Nicolas Pitre's avatar Nicolas Pitre Committed by Russell King

ARM kprobes: prevent some functions involved with kprobes from being probed

Signed-off-by: default avatarNicolas Pitre <nico@marvell.com>
parent d30a0c8b
...@@ -58,6 +58,12 @@ ...@@ -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: ...@@ -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) ...@@ -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); ...@@ -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 ...@@ -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, ...@@ -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) ...@@ -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 { ...@@ -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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment