From e5578db7bb5dcf8908fcf7b2231ce77b160bbc06 Mon Sep 17 00:00:00 2001 From: Vyacheslav Cherkashin Date: Fri, 29 Mar 2013 19:48:41 +0400 Subject: [PATCH] [REFACTOR] new interface dbi_/un/register_ujprobe() -int dbi_/un/register_ujprobe(struct task_struct *task, struct jprobe *jp, int atomic); +int dbi_/un/register_ujprobe(struct ujprobe *jp, int atomic); as well as create 'struct uprobe' and 'struct ujprobe' --- driver/sspt/ip.c | 2 +- driver/sspt/ip.h | 2 +- driver/sspt/sspt.h | 2 +- driver/sspt/sspt_debug.h | 2 +- driver/sspt/sspt_page.c | 2 +- driver/us_proc_inst.c | 17 +++++++++-------- driver/us_proc_inst.h | 2 +- uprobe/arch/asm-arm/swap_uprobes.c | 4 +++- uprobe/swap_uprobes.c | 24 ++++++++++++------------ uprobe/swap_uprobes.h | 20 ++++++++++++++++++-- 10 files changed, 48 insertions(+), 29 deletions(-) diff --git a/driver/sspt/ip.c b/driver/sspt/ip.c index cf3f31d..02511d7 100644 --- a/driver/sspt/ip.c +++ b/driver/sspt/ip.c @@ -96,5 +96,5 @@ struct us_ip *create_ip_by_ip_data(struct ip_data *ip_d) void sspt_set_ip_addr(struct us_ip *ip, const struct sspt_page *page, const struct sspt_file *file) { unsigned long addr = file->vm_start + page->offset + ip->offset; - ip->retprobe.kp.addr = ip->jprobe.kp.addr = (kprobe_opcode_t *)addr; + ip->retprobe.kp.addr = ip->jprobe.up.kp.addr = (kprobe_opcode_t *)addr; } diff --git a/driver/sspt/ip.h b/driver/sspt/ip.h index d8da89b..b74e23e 100644 --- a/driver/sspt/ip.h +++ b/driver/sspt/ip.h @@ -47,7 +47,7 @@ struct sspt_file; struct us_ip { struct list_head list; - struct jprobe jprobe; + struct ujprobe jprobe; struct uretprobe retprobe; unsigned long offset; diff --git a/driver/sspt/sspt.h b/driver/sspt/sspt.h index ef49cf8..7488b3b 100644 --- a/driver/sspt/sspt.h +++ b/driver/sspt/sspt.h @@ -115,7 +115,7 @@ static inline int unregister_usprobe_my(struct task_struct *task, struct us_ip * err = unregister_usprobe(task, ip, 1, 1); break; case US_DISARM: - disarm_uprobe(&ip->jprobe.kp, task); + disarm_uprobe(&ip->jprobe.up.kp, task); break; default: panic("incorrect value flag=%d", flag); diff --git a/driver/sspt/sspt_debug.h b/driver/sspt/sspt_debug.h index 2ebc195..2f94c8f 100644 --- a/driver/sspt/sspt_debug.h +++ b/driver/sspt/sspt_debug.h @@ -46,7 +46,7 @@ static inline void print_page_probes(const struct sspt_page *page) list_for_each_entry(ip, &page->ip_list, list) { printk("### addr[%2d]=%lx, J_addr=%lx, R_addr=%lx\n", - i, (unsigned long)ip->offset, (unsigned long)ip->jprobe.kp.addr, + i, (unsigned long)ip->offset, (unsigned long)ip->jprobe.up.kp.addr, (unsigned long)ip->retprobe.kp.addr); print_jprobe(&ip->jprobe); print_retprobe(&ip->retprobe); diff --git a/driver/sspt/sspt_page.c b/driver/sspt/sspt_page.c index 70c5189..a5943df 100644 --- a/driver/sspt/sspt_page.c +++ b/driver/sspt/sspt_page.c @@ -117,6 +117,6 @@ void sspt_set_all_ip_addr(struct sspt_page *page, const struct sspt_file *file) list_for_each_entry(ip, &page->ip_list, list) { addr = file->vm_start + page->offset + ip->offset; - ip->retprobe.kp.addr = ip->jprobe.kp.addr = (kprobe_opcode_t *)addr; + ip->retprobe.kp.addr = ip->jprobe.up.kp.addr = (kprobe_opcode_t *)addr; } } diff --git a/driver/us_proc_inst.c b/driver/us_proc_inst.c index 6b84363..e0a92f3 100644 --- a/driver/us_proc_inst.c +++ b/driver/us_proc_inst.c @@ -1131,7 +1131,7 @@ unsigned long ujprobe_event_pre_handler(struct us_ip *ip, struct pt_regs *regs) void ujprobe_event_handler (unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5, unsigned long arg6) { struct us_ip *ip = __get_cpu_var(gpCurIp); - unsigned long addr = (unsigned long)ip->jprobe.kp.addr; + unsigned long addr = (unsigned long)ip->jprobe.up.kp.addr; #ifdef __ANDROID struct pt_regs *regs = __get_cpu_var(gpUserRegs); @@ -1158,7 +1158,7 @@ void ujprobe_event_handler (unsigned long arg1, unsigned long arg2, unsigned lon static void send_plt(struct us_ip *ip) { - unsigned long addr = (unsigned long)ip->jprobe.kp.addr; + unsigned long addr = (unsigned long)ip->jprobe.up.kp.addr; struct vm_area_struct *vma = find_vma(current->mm, addr); if (vma && check_vma(vma)) { @@ -1192,7 +1192,7 @@ static void send_plt(struct us_ip *ip) int uretprobe_event_handler(struct uretprobe_instance *probe, struct pt_regs *regs, struct us_ip *ip) { int retval = regs_return_value(regs); - unsigned long addr = (unsigned long)ip->jprobe.kp.addr; + unsigned long addr = (unsigned long)ip->jprobe.up.kp.addr; if (ip->got_addr && ip->flag_got == 0) { send_plt(ip); @@ -1217,20 +1217,21 @@ int uretprobe_event_handler(struct uretprobe_instance *probe, struct pt_regs *re int register_usprobe(struct task_struct *task, struct us_ip *ip, int atomic) { int ret = 0; - ip->jprobe.kp.tgid = task->tgid; + ip->jprobe.up.kp.tgid = task->tgid; if (ip->jprobe.entry == NULL) { - ip->jprobe.entry = (kprobe_opcode_t *)ujprobe_event_handler; + ip->jprobe.entry = (void *)ujprobe_event_handler; DPRINTF("Set default event handler for %x\n", ip->offset); } if (ip->jprobe.pre_entry == NULL) { - ip->jprobe.pre_entry = (kprobe_pre_entry_handler_t)ujprobe_event_pre_handler; + ip->jprobe.pre_entry = (uprobe_pre_entry_handler_t)ujprobe_event_pre_handler; DPRINTF("Set default pre handler for %x\n", ip->offset); } ip->jprobe.priv_arg = ip; - ret = dbi_register_ujprobe(task, &ip->jprobe, atomic); + ip->jprobe.up.task = task; + ret = dbi_register_ujprobe(&ip->jprobe, atomic); if (ret) { DPRINTF ("dbi_register_ujprobe() failure %d", ret); return ret; @@ -1257,7 +1258,7 @@ int register_usprobe(struct task_struct *task, struct us_ip *ip, int atomic) int unregister_usprobe(struct task_struct *task, struct us_ip *ip, int atomic, int not_rp2) { - dbi_unregister_ujprobe(task, &ip->jprobe, atomic); + dbi_unregister_ujprobe(&ip->jprobe, atomic); if (ip->flag_retprobe) { dbi_unregister_uretprobe(task, &ip->retprobe, atomic, not_rp2); diff --git a/driver/us_proc_inst.h b/driver/us_proc_inst.h index d82ebb2..a6bcd21 100644 --- a/driver/us_proc_inst.h +++ b/driver/us_proc_inst.h @@ -98,7 +98,7 @@ int unregister_usprobe(struct task_struct *task, struct us_ip *ip, int atomic, i do { \ us_proc_ip_t *ip = __get_cpu_var(gpCurIp); \ struct pt_regs *regs = __get_cpu_var(gpUserRegs); \ - dump_backtrace(US_PROBE_ID, current, ip->jprobe.kp.addr, regs, size); \ + dump_backtrace(US_PROBE_ID, current, ip->jprobe.up.kp.addr, regs, size); \ } while (0) struct dentry *dentry_by_path(const char *path); diff --git a/uprobe/arch/asm-arm/swap_uprobes.c b/uprobe/arch/asm-arm/swap_uprobes.c index 798fab8..c32a014 100644 --- a/uprobe/arch/asm-arm/swap_uprobes.c +++ b/uprobe/arch/asm-arm/swap_uprobes.c @@ -606,7 +606,9 @@ void arch_prepare_uretprobe_hl(struct uretprobe_instance *ri, int setjmp_upre_handler(struct kprobe *p, struct pt_regs *regs) { - struct jprobe *jp = container_of(p, struct jprobe, kp); + struct uprobe *up = container_of(p, struct uprobe, kp); + struct ujprobe *jp = container_of(up, struct ujprobe, up); + kprobe_pre_entry_handler_t pre_entry = (kprobe_pre_entry_handler_t)jp->pre_entry; entry_point_t entry = (entry_point_t)jp->entry; diff --git a/uprobe/swap_uprobes.c b/uprobe/swap_uprobes.c index 55a8231..d9adecc 100644 --- a/uprobe/swap_uprobes.c +++ b/uprobe/swap_uprobes.c @@ -636,22 +636,22 @@ valid_p: } } -int dbi_register_ujprobe(struct task_struct *task, struct jprobe *jp, int atomic) +int dbi_register_ujprobe(struct ujprobe *jp, int atomic) { int ret = 0; /* Todo: Verify probepoint is a function entry point */ - jp->kp.pre_handler = setjmp_upre_handler; - jp->kp.break_handler = longjmp_break_uhandler; + jp->up.kp.pre_handler = setjmp_upre_handler; + jp->up.kp.break_handler = longjmp_break_uhandler; - ret = dbi_register_uprobe(&jp->kp, task, atomic); + ret = dbi_register_uprobe(&jp->up.kp, jp->up.task, atomic); return ret; } -void dbi_unregister_ujprobe(struct task_struct *task, struct jprobe *jp, int atomic) +void dbi_unregister_ujprobe(struct ujprobe *jp, int atomic) { - dbi_unregister_uprobe(&jp->kp, task, atomic); + dbi_unregister_uprobe(&jp->up.kp, jp->up.task, atomic); /* * Here is an attempt to unregister even those probes that have not been * installed (hence not added to the hlist). @@ -660,15 +660,15 @@ void dbi_unregister_ujprobe(struct task_struct *task, struct jprobe *jp, int ato * really belongs to the hlist. */ #ifdef CONFIG_ARM - if (!(hlist_unhashed(&jp->kp.is_hlist_arm))) { - hlist_del_rcu(&jp->kp.is_hlist_arm); + if (!(hlist_unhashed(&jp->up.kp.is_hlist_arm))) { + hlist_del_rcu(&jp->up.kp.is_hlist_arm); } - if (!(hlist_unhashed(&jp->kp.is_hlist_thumb))) { - hlist_del_rcu(&jp->kp.is_hlist_thumb); + if (!(hlist_unhashed(&jp->up.kp.is_hlist_thumb))) { + hlist_del_rcu(&jp->up.kp.is_hlist_thumb); } #else /* CONFIG_ARM */ - if (!(hlist_unhashed(&jp->kp.is_hlist))) { - hlist_del_rcu(&jp->kp.is_hlist); + if (!(hlist_unhashed(&jp->up.kp.is_hlist))) { + hlist_del_rcu(&jp->up.kp.is_hlist); } #endif /* CONFIG_ARM */ } diff --git a/uprobe/swap_uprobes.h b/uprobe/swap_uprobes.h index f8b2aa6..c13e912 100644 --- a/uprobe/swap_uprobes.h +++ b/uprobe/swap_uprobes.h @@ -29,6 +29,22 @@ #include "dbi_kprobes.h" +struct uprobe { + struct kprobe kp; + struct task_struct *task; +}; + +typedef unsigned long (*uprobe_pre_entry_handler_t)(void *priv_arg, struct pt_regs * regs); + +struct ujprobe { + struct uprobe up; + /* probe handling code to jump to */ + void *entry; + // handler whichw willb bec called before 'entry' + uprobe_pre_entry_handler_t pre_entry; + void *priv_arg; +}; + struct uretprobe_instance; typedef int (*uretprobe_handler_t)(struct uretprobe_instance *, struct pt_regs *, void *); @@ -67,8 +83,8 @@ struct uretprobe_instance { int dbi_register_uprobe(struct kprobe *p, struct task_struct *task, int atomic); void dbi_unregister_uprobe(struct kprobe *p, struct task_struct *task, int atomic); -int dbi_register_ujprobe(struct task_struct *task, struct jprobe *jp, int atomic); -void dbi_unregister_ujprobe(struct task_struct *task, struct jprobe *jp, int atomic); +int dbi_register_ujprobe(struct ujprobe *jp, int atomic); +void dbi_unregister_ujprobe(struct ujprobe *jp, int atomic); int dbi_register_uretprobe(struct task_struct *task, struct uretprobe *rp, int atomic); void dbi_unregister_uretprobe(struct task_struct *task, struct uretprobe *rp, int atomic, int not_rp2); -- 2.7.4