Skip to content

Commit

Permalink
ARM kprobes: prevent some functions involved with kprobes from being …
Browse files Browse the repository at this point in the history
…probed

Signed-off-by: Nicolas Pitre <nico@marvell.com>
  • Loading branch information
Nicolas Pitre authored and Russell King committed Jan 26, 2008
1 parent d30a0c8 commit 785d3cd
Show file tree
Hide file tree
Showing 6 changed files with 20 additions and 13 deletions.
8 changes: 7 additions & 1 deletion arch/arm/kernel/entry-armv.S
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,12 @@

.endm

#ifdef CONFIG_KPROBES
.section .kprobes.text,"ax",%progbits
#else
.text
#endif

/*
* Invalid mode handlers
*/
Expand Down Expand Up @@ -562,7 +568,7 @@ do_fpe:
.data
ENTRY(fp_enter)
.word no_fp
.text
.previous

no_fp: mov pc, lr

Expand Down
2 changes: 1 addition & 1 deletion arch/arm/kernel/kprobes.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
unsigned long addr = (unsigned long)p->addr;
int is;

if (addr & 0x3)
if (addr & 0x3 || in_exception_text(addr))
return -EINVAL;

insn = *p->addr;
Expand Down
9 changes: 0 additions & 9 deletions arch/arm/kernel/traps.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,6 @@ __setup("user_debug=", user_debug_setup);

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)
{
#ifdef CONFIG_KALLSYMS
Expand Down
1 change: 1 addition & 0 deletions arch/arm/kernel/vmlinux.lds.S
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ SECTIONS
TEXT_TEXT
SCHED_TEXT
LOCK_TEXT
KPROBES_TEXT
#ifdef CONFIG_MMU
*(.fixup)
#endif
Expand Down
4 changes: 2 additions & 2 deletions arch/arm/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ __do_page_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr,
return fault;
}

static int
static int __kprobes
do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
{
struct task_struct *tsk;
Expand Down Expand Up @@ -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
* from the master page table, nothing more.
*/
static int
static int __kprobes
do_translation_fault(unsigned long addr, unsigned int fsr,
struct pt_regs *regs)
{
Expand Down
9 changes: 9 additions & 0 deletions include/asm-arm/traps.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,13 @@ struct undef_hook {
void register_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

0 comments on commit 785d3cd

Please sign in to comment.