*/
int arch_prepare_uprobe(struct uprobe *up)
{
- int ret = 0;
struct kprobe *p = up2kp(up);
struct task_struct *task = up->task;
u8 *tramp = up->atramp.tramp;
p->ainsn.boostable = swap_can_boost(tramp) ? 0 : -1;
- return ret;
+ p->ainsn.insn = swap_slot_alloc(up->sm);
+ if (p->ainsn.insn == NULL) {
+ printk(KERN_INFO "trampoline out of memory\n");
+ return -ENOMEM;
+ }
+
+ if (!write_proc_vm_atomic(task, (unsigned long)p->ainsn.insn,
+ tramp, sizeof(up->atramp.tramp))) {
+ swap_slot_free(up->sm, p->ainsn.insn);
+ printk("failed to write memory %p!\n", tramp);
+ return -EINVAL;
+ }
+
+ return 0;
}
/**
if (!write_proc_vm_atomic(current, regs->EREG(sp), &ra, sizeof(ra)))
panic("failed to write user space func ra %lx!\n",
regs->EREG(sp));
+
+ add_uprobe_table(&ri->rp->up.kp);
}
/**
return;
}
-static int make_trampoline(struct uprobe *up)
-{
- struct kprobe *p = up2kp(up);
- struct task_struct *task = up->task;
- void *tramp;
-
- tramp = swap_slot_alloc(up->sm);
- if (tramp == 0) {
- printk(KERN_INFO "trampoline out of memory\n");
- return -ENOMEM;
- }
-
- if (!write_proc_vm_atomic(task, (unsigned long)tramp,
- up->atramp.tramp,
- sizeof(up->atramp.tramp))) {
- swap_slot_free(up->sm, tramp);
- panic("failed to write memory %p!\n", tramp);
- return -EINVAL;
- }
-
- p->ainsn.insn = tramp;
-
- return 0;
-}
-
static int uprobe_handler(struct pt_regs *regs)
{
struct kprobe *p;
trampoline_uprobe_handler(p, regs);
return 1;
} else {
- if (p->ainsn.insn == NULL) {
- struct uprobe *up = kp2up(p);
-
- make_trampoline(up);
-
- /* for uretprobe */
- add_uprobe_table(p);
- }
-
if (!p->pre_handler || !p->pre_handler(p, regs)) {
if (p->ainsn.boostable == 1 && !p->post_handler) {
*/
void install_all(void)
{
-#if !defined(CONFIG_ARM)
- struct task_struct *task;
- int tmp_oops_in_progress;
-
- tmp_oops_in_progress = oops_in_progress;
- oops_in_progress = 1;
- rcu_read_lock();
- for_each_process(task) {
- if (task->tgid != task->pid)
- continue;
-
- if (is_kthread(task))
- continue;
-
- check_task_and_install(task);
- }
- rcu_read_unlock();
- oops_in_progress = tmp_oops_in_progress;
-#endif /* CONFIG_ARM */
+ /* TODO: to be implemented */
}
static void on_each_uninstall_proc(struct sspt_proc *proc, void *data)