[FIX] send original address, which set probe (US)
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Thu, 12 Dec 2013 08:37:07 +0000 (12:37 +0400)
committerGerrit Code Review <gerrit@gerrit.vlan144.tizendev.org>
Thu, 12 Dec 2013 09:30:55 +0000 (09:30 +0000)
Change-Id: I99f03ae6e869c0d28713c6f8ab2f3f0dc7b120bd
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
ks_features/ks_features.c
us_manager/sspt/ip.c
us_manager/sspt/ip.h
us_manager/sspt/sspt_page.c
writer/swap_writer_module.c
writer/swap_writer_module.h

index 9ad095a..4ce55de 100644 (file)
@@ -97,9 +97,10 @@ static int entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
        if (rp) {
                struct ks_probe *ksp = container_of(rp, struct ks_probe, rp);
                const char *fmt = ksp->args;
+               unsigned long addr = (unsigned long)ksp->rp.kp.addr;
                int sub_type = ksp->sub_type;
 
-               entry_event(fmt, regs, PT_KS, sub_type);
+               entry_event(fmt, addr, regs, PT_KS, sub_type);
        }
 
        return 0;
index 4f1d01e..d21856e 100644 (file)
@@ -36,8 +36,10 @@ static int entry_handler(struct uretprobe_instance *ri, struct pt_regs *regs)
 
        if (rp && get_quiet() == QT_OFF) {
                struct us_ip *ip = container_of(rp, struct us_ip, retprobe);
+               const char *fmt = ip->args;
+               unsigned long addr = (unsigned long)ip->orig_addr;
 
-               entry_event(ip->args, regs, PT_US, PST_NONE);
+               entry_event(fmt, addr, regs, PT_US, PST_NONE);
        }
 
        return 0;
@@ -49,13 +51,9 @@ static int ret_handler(struct uretprobe_instance *ri, struct pt_regs *regs)
 
        if (rp && get_quiet() == QT_OFF) {
                struct us_ip *ip = container_of(rp, struct us_ip, retprobe);
-               unsigned long addr = (unsigned long)ip->retprobe.up.kp.addr;
+               unsigned long addr = (unsigned long)ip->orig_addr;
                unsigned long ret_addr = (unsigned long)ri->ret_addr;
 
-#if defined(CONFIG_ARM)
-               addr = ip->offset & 0x01 ? addr | 0x01 : addr;
-#endif
-
                exit_event(ip->ret_type, regs, addr, ret_addr);
        }
 
index 46bb541..c2a12ab 100644 (file)
@@ -37,6 +37,7 @@ struct us_ip {
        struct uretprobe retprobe;
        char *args;
        char ret_type;
+       unsigned long orig_addr;
 
        unsigned long offset;
 };
index 6dc350f..2159b2b 100644 (file)
@@ -119,6 +119,8 @@ int sspt_register_page(struct sspt_page *page, struct sspt_file *file)
        list_for_each_entry_safe(ip, n, &ip_list_tmp, list) {
                /* set uprobe address */
                addr = file->vm_start + page->offset + ip->offset;
+
+               ip->orig_addr = addr;
                ip->retprobe.up.kp.addr = (kprobe_opcode_t *)addr;
 
                err = sspt_register_usprobe(ip);
index 046b23b..fb51d8a 100644 (file)
@@ -513,7 +513,8 @@ struct msg_func_entry {
        char args[0];
 } __attribute__((packed));
 
-static char *pack_msg_func_entry(char *payload, const char *fmt, struct pt_regs *regs,
+static char *pack_msg_func_entry(char *payload, const char *fmt,
+                                unsigned long func_addr, struct pt_regs *regs,
                                 enum PROBE_TYPE pt, int sub_type)
 {
        struct msg_func_entry *mfe = (struct msg_func_entry *)payload;
@@ -522,7 +523,7 @@ static char *pack_msg_func_entry(char *payload, const char *fmt, struct pt_regs
        mfe->pid = task->tgid;
        mfe->tid = task->pid;
        mfe->cpu_num = smp_processor_id();
-       mfe->pc_addr = get_regs_ip(regs);
+       mfe->pc_addr = func_addr;
        mfe->caller_pc_addr = get_regs_ret_func(regs);
        mfe->probe_type = pt;
        mfe->probe_sub_type = sub_type;
@@ -629,8 +630,8 @@ static int pack_args(char *buf, int len, const char *fmt, struct pt_regs *regs)
        return buf - buf_old;
 }
 
-int entry_event(const char *fmt, struct pt_regs *regs,
-                enum PROBE_TYPE pt, int sub_type)
+int entry_event(const char *fmt, unsigned long func_addr, struct pt_regs *regs,
+               enum PROBE_TYPE pt, int sub_type)
 {
        char *buf, *payload, *args, *buf_end;
        int ret;
@@ -640,7 +641,8 @@ int entry_event(const char *fmt, struct pt_regs *regs,
 
        buf = get_current_buf();
        payload = pack_basic_msg_fmt(buf, MSG_FUNCTION_ENTRY);
-       args = pack_msg_func_entry(payload, fmt, regs, pt, sub_type);
+       args = pack_msg_func_entry(payload, fmt, func_addr,
+                                  regs, pt, sub_type);
 
        /* FIXME: len = 1024 */
        ret = pack_args(args, 1024, fmt, regs);
index d709174..89f2c73 100644 (file)
@@ -60,8 +60,8 @@ void pcoc_map_msg(struct vm_area_struct *vma);
 void proc_unmap_msg(unsigned long start, unsigned long end);
 int sample_msg(struct pt_regs *regs);
 
-int entry_event(const char *fmt, struct pt_regs *regs,
-                enum PROBE_TYPE pt, int sub_type);
+int entry_event(const char *fmt, unsigned long func_addr, struct pt_regs *regs,
+               enum PROBE_TYPE pt, int sub_type);
 int exit_event(char ret_type, struct pt_regs *regs, unsigned long func_addr,
               unsigned long ret_addr);