[REFACTOR] new interface dbi_/un/register_ujprobe()
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Fri, 29 Mar 2013 15:48:41 +0000 (19:48 +0400)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Fri, 29 Mar 2013 15:48:41 +0000 (19:48 +0400)
-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
driver/sspt/ip.h
driver/sspt/sspt.h
driver/sspt/sspt_debug.h
driver/sspt/sspt_page.c
driver/us_proc_inst.c
driver/us_proc_inst.h
uprobe/arch/asm-arm/swap_uprobes.c
uprobe/swap_uprobes.c
uprobe/swap_uprobes.h

index cf3f31d..02511d7 100644 (file)
@@ -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;
 }
index d8da89b..b74e23e 100644 (file)
@@ -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;
index ef49cf8..7488b3b 100644 (file)
@@ -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);
index 2ebc195..2f94c8f 100644 (file)
@@ -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);
index 70c5189..a5943df 100644 (file)
@@ -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;
        }
 }
index 6b84363..e0a92f3 100644 (file)
@@ -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);
index d82ebb2..a6bcd21 100644 (file)
@@ -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);
index 798fab8..c32a014 100644 (file)
@@ -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;
 
index 55a8231..d9adecc 100644 (file)
@@ -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 */
 }
index f8b2aa6..c13e912 100644 (file)
 
 #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);