{IMPROVE] add ret_addr for exit_event()
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Fri, 4 Oct 2013 14:38:47 +0000 (18:38 +0400)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Fri, 4 Oct 2013 14:38:47 +0000 (18:38 +0400)
Change-Id: I0e1c6e11442c94befe6a45f528d511af87f31395
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
ks_features/ks_features.c
us_manager/sspt/ip.c
writer/swap_writer_module.c
writer/swap_writer_module.h

index c061e08..631968d 100644 (file)
@@ -111,8 +111,9 @@ static int ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
 
        if (rp) {
                unsigned long func_addr = rp->kp.addr;
+               unsigned long ret_addr = ri->ret_addr;
 
-               exit_event(regs, func_addr);
+               exit_event(regs, func_addr, ret_addr);
        }
 
        return 0;
index 3d88915..7b6e791 100644 (file)
@@ -42,12 +42,13 @@ static int ret_handler(struct uretprobe_instance *ri, struct pt_regs *regs)
 {
        struct us_ip *ip = container_of(ri->rp, struct us_ip, retprobe);
        unsigned long addr = (unsigned long)ip->retprobe.up.kp.addr;
+       unsigned long ret_addr = ri->ret_addr;
 
 #if defined(CONFIG_ARM)
        addr = ip->offset & 0x01 ? addr | 0x01 : addr;
 #endif
 
-       exit_event(regs, addr);
+       exit_event(regs, addr, ret_addr);
 
        return 0;
 }
index 9b294a1..b710d2f 100644 (file)
@@ -542,11 +542,14 @@ struct msg_func_exit {
        u32 pid;
        u32 tid;
        u64 pc_addr;
+       u64 caller_pc_addr;
        u32 cpu_num;
        u64 ret_val;
 } __attribute__((packed));
 
-static char *pack_msg_func_exit(char *payload, struct pt_regs *regs, unsigned long func_addr)
+static char *pack_msg_func_exit(char *payload, struct pt_regs *regs,
+                               unsigned long func_addr,
+                               unsigned long ret_addr)
 {
        struct msg_func_exit *mfe = (struct msg_func_exit *)payload;
        struct task_struct *task = current;
@@ -555,12 +558,14 @@ static char *pack_msg_func_exit(char *payload, struct pt_regs *regs, unsigned lo
        mfe->tid = task->pid;
        mfe->cpu_num = task_cpu(task);
        mfe->pc_addr = func_addr;
+       mfe->caller_pc_addr = ret_addr;
        mfe->ret_val = get_regs_ret_val(regs);
 
        return payload + sizeof(*mfe);
 }
 
-int exit_event(struct pt_regs *regs, unsigned long func_addr)
+int exit_event(struct pt_regs *regs, unsigned long func_addr,
+              unsigned long ret_addr)
 {
        char *buf, *payload, *buf_end;
 
@@ -569,7 +574,7 @@ int exit_event(struct pt_regs *regs, unsigned long func_addr)
 
        buf = get_current_buf();
        payload = pack_basic_msg_fmt(buf, MSG_FUNCTION_EXIT);
-       buf_end = pack_msg_func_exit(payload, regs, func_addr);
+       buf_end = pack_msg_func_exit(payload, regs, func_addr, ret_addr);
        set_len_msg(buf, buf_end);
 
        return write_to_buffer(buf);
index 60acd5f..ca50216 100644 (file)
@@ -57,7 +57,8 @@ 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 exit_event(struct pt_regs *regs, unsigned long func_addr);
+int exit_event(struct pt_regs *regs, unsigned long func_addr,
+              unsigned long ret_addr);
 
 int switch_entry(struct pt_regs *regs);
 int switch_exit(struct pt_regs *regs);