[FIX] ARM: map US insn slots at uprobe registration 33/19333/3
authorVasiliy Ulyanov <v.ulyanov@samsung.com>
Thu, 10 Apr 2014 11:33:11 +0000 (15:33 +0400)
committerVasiliy Ulyanov <v.ulyanov@samsung.com>
Mon, 21 Apr 2014 13:41:19 +0000 (17:41 +0400)
User pages mapping moved out of exception context

Change-Id: I8239d0ee2d01fad137988d08ba696b770f978ae2
Signed-off-by: Vasiliy Ulyanov <v.ulyanov@samsung.com>
uprobe/arch/asm-arm/swap_uprobes.c
uprobe/arch/asm-arm/swap_uprobes.h

index 120226f..7c72478 100644 (file)
@@ -564,6 +564,12 @@ int arch_prepare_uprobe(struct uprobe *up)
                return -EFAULT;
        }
 
+       up->atramp.utramp = alloc_insn_slot(up->sm);
+       if (up->atramp.utramp == NULL) {
+               printk("Error: alloc_insn_slot failed (%08lx)\n", vaddr);
+               return -ENOMEM;
+       }
+
        return 0;
 }
 
@@ -760,7 +766,7 @@ static int make_trampoline(struct uprobe *up, struct pt_regs *regs)
                return 1;
        }
 
-       utramp = alloc_insn_slot(up->sm);
+       utramp = up->atramp.utramp;
 
        if (!write_proc_vm_atomic(up->task, (unsigned long)utramp, tramp,
                                  UPROBES_TRAMP_LEN * sizeof(*tramp)))
index 74f4cb3..3ba1869 100644 (file)
@@ -42,6 +42,7 @@ struct uretprobe_instance;
 struct arch_specific_tramp {
        unsigned long tramp_arm[UPROBES_TRAMP_LEN];
        unsigned long tramp_thumb[UPROBES_TRAMP_LEN];
+       void *utramp;
 };