diff options
author | David A. Long <dave.long@linaro.org> | 2013-10-07 14:28:58 -0400 |
---|---|---|
committer | David A. Long <dave.long@linaro.org> | 2013-10-14 01:36:56 -0400 |
commit | 1b3e9d4e275d534bbbdf7f7e02bae67a15b2dca1 (patch) | |
tree | 62e964f1455312372c6f8d6023154739f645d04c /kernel | |
parent | f91bfb2c92f9b8fec8d29444691802a205d37b77 (diff) |
uprobes: allow arch access to xol slot
Allow arches to customize how the instruction is filled into the xol
slot. ARM will use this to insert an undefined instruction after the
real instruction in order to simulate a single step of the instruction
without hardware support.
Signed-off-by: Rabin Vincent <rabin@rab.in>
Signed-off-by: David A. Long <dave.long@linaro.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/events/uprobes.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index 39551728a88c..22d0121205cc 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -1238,6 +1238,11 @@ static unsigned long xol_take_insn_slot(struct xol_area *area) return slot_addr; } +void __weak arch_uprobe_xol_copy(struct arch_uprobe *auprobe, void *vaddr) +{ + memcpy(vaddr, auprobe->insn, MAX_UINSN_BYTES); +} + /* * xol_get_insn_slot - allocate a slot for xol. * Returns the allocated slot address or 0. @@ -1246,6 +1251,7 @@ static unsigned long xol_get_insn_slot(struct uprobe *uprobe) { struct xol_area *area; unsigned long xol_vaddr; + void *kaddr; area = get_xol_area(); if (!area) @@ -1256,7 +1262,9 @@ static unsigned long xol_get_insn_slot(struct uprobe *uprobe) return 0; /* Initialize the slot */ - copy_to_page(area->page, xol_vaddr, uprobe->arch.insn, MAX_UINSN_BYTES); + kaddr = kmap_atomic(area->page); + arch_uprobe_xol_copy(&uprobe->arch, kaddr + (xol_vaddr & ~PAGE_MASK)); + kunmap_atomic(kaddr); /* * We probably need flush_icache_user_range() but it needs vma. * This should work on supported architectures too. |