|
@@ -245,12 +245,12 @@ static int verify_opcode(struct page *page, unsigned long vaddr, uprobe_opcode_t
|
|
|
* the architecture. If an arch has variable length instruction and the
|
|
|
* breakpoint instruction is not of the smallest length instruction
|
|
|
* supported by that architecture then we need to modify is_trap_at_addr and
|
|
|
- * write_opcode accordingly. This would never be a problem for archs that
|
|
|
- * have fixed length instructions.
|
|
|
+ * uprobe_write_opcode accordingly. This would never be a problem for archs
|
|
|
+ * that have fixed length instructions.
|
|
|
*/
|
|
|
|
|
|
/*
|
|
|
- * write_opcode - write the opcode at a given virtual address.
|
|
|
+ * uprobe_write_opcode - write the opcode at a given virtual address.
|
|
|
* @mm: the probed process address space.
|
|
|
* @vaddr: the virtual address to store the opcode.
|
|
|
* @opcode: opcode to be written at @vaddr.
|
|
@@ -261,7 +261,7 @@ static int verify_opcode(struct page *page, unsigned long vaddr, uprobe_opcode_t
|
|
|
* For mm @mm, write the opcode at @vaddr.
|
|
|
* Return 0 (success) or a negative errno.
|
|
|
*/
|
|
|
-static int write_opcode(struct mm_struct *mm, unsigned long vaddr,
|
|
|
+int uprobe_write_opcode(struct mm_struct *mm, unsigned long vaddr,
|
|
|
uprobe_opcode_t opcode)
|
|
|
{
|
|
|
struct page *old_page, *new_page;
|
|
@@ -315,7 +315,7 @@ put_old:
|
|
|
*/
|
|
|
int __weak set_swbp(struct arch_uprobe *auprobe, struct mm_struct *mm, unsigned long vaddr)
|
|
|
{
|
|
|
- return write_opcode(mm, vaddr, UPROBE_SWBP_INSN);
|
|
|
+ return uprobe_write_opcode(mm, vaddr, UPROBE_SWBP_INSN);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -330,7 +330,7 @@ int __weak set_swbp(struct arch_uprobe *auprobe, struct mm_struct *mm, unsigned
|
|
|
int __weak
|
|
|
set_orig_insn(struct arch_uprobe *auprobe, struct mm_struct *mm, unsigned long vaddr)
|
|
|
{
|
|
|
- return write_opcode(mm, vaddr, *(uprobe_opcode_t *)auprobe->insn);
|
|
|
+ return uprobe_write_opcode(mm, vaddr, *(uprobe_opcode_t *)auprobe->insn);
|
|
|
}
|
|
|
|
|
|
static int match_uprobe(struct uprobe *l, struct uprobe *r)
|
|
@@ -577,7 +577,7 @@ static int prepare_uprobe(struct uprobe *uprobe, struct file *file,
|
|
|
if (ret)
|
|
|
goto out;
|
|
|
|
|
|
- /* write_opcode() assumes we don't cross page boundary */
|
|
|
+ /* uprobe_write_opcode() assumes we don't cross page boundary */
|
|
|
BUG_ON((uprobe->offset & ~PAGE_MASK) +
|
|
|
UPROBE_SWBP_INSN_SIZE > PAGE_SIZE);
|
|
|
|
|
@@ -1264,7 +1264,8 @@ 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);
|
|
|
+ copy_to_page(area->page, xol_vaddr,
|
|
|
+ uprobe->arch.ixol, sizeof(uprobe->arch.ixol));
|
|
|
/*
|
|
|
* We probably need flush_icache_user_range() but it needs vma.
|
|
|
* This should work on supported architectures too.
|
|
@@ -1941,9 +1942,4 @@ static int __init init_uprobes(void)
|
|
|
|
|
|
return register_die_notifier(&uprobe_exception_nb);
|
|
|
}
|
|
|
-module_init(init_uprobes);
|
|
|
-
|
|
|
-static void __exit exit_uprobes(void)
|
|
|
-{
|
|
|
-}
|
|
|
-module_exit(exit_uprobes);
|
|
|
+__initcall(init_uprobes);
|