[FIX] correct pc_addr in exit_event()
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Wed, 28 Aug 2013 07:29:36 +0000 (11:29 +0400)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Wed, 28 Aug 2013 07:29:36 +0000 (11:29 +0400)
ks_features/ks_features.c
us_manager/us_def_handler.c
writer/swap_writer_module.c
writer/swap_writer_module.h

index 27b74a4..4112378 100644 (file)
@@ -104,8 +104,9 @@ static int entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs, vo
 static int ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs, void *priv_arg)
 {
        struct ks_probe *ksp = (struct ks_probe *)priv_arg;
+       unsigned long func_addr = ri->rp ? ri->rp->kp.addr : 0;
 
-       exit_event(regs);
+       exit_event(regs, func_addr);
 
        return 0;
 }
index a08a81c..0d4e404 100644 (file)
@@ -114,7 +114,7 @@ int uretprobe_event_handler(struct uretprobe_instance *probe,
        addr = ip->offset & 0x01 ? addr | 0x01 : addr;
 #endif
 
-       exit_event(regs);
+       exit_event(regs, addr);
 
        return 0;
 }
index c26a111..481696f 100644 (file)
@@ -538,7 +538,7 @@ struct msg_func_exit {
        u64 ret_val;
 } __attribute__((packed));
 
-static char *pack_msg_func_exit(char *payload, struct pt_regs *regs)
+static char *pack_msg_func_exit(char *payload, struct pt_regs *regs, unsigned long func_addr)
 {
        struct msg_func_exit *mfe = (struct msg_func_exit *)payload;
        struct task_struct *task = current;
@@ -546,20 +546,19 @@ static char *pack_msg_func_exit(char *payload, struct pt_regs *regs)
        mfe->pid = task->tgid;
        mfe->tid = task->pid;
        mfe->cpu_num = task_cpu(task);
-       mfe->pc_addr = get_regs_ip(regs);
-//TODO x86
+       mfe->pc_addr = func_addr;
        mfe->ret_val = get_regs_ret_val(regs);
 
        return payload + sizeof(*mfe);
 }
 
-int exit_event(struct pt_regs *regs)
+int exit_event(struct pt_regs *regs, unsigned long func_addr)
 {
        char *buf, *payload, *buf_end;
 
        buf = get_current_buf();
        payload = pack_basic_msg_fmt(buf, MSG_FUNCTION_EXIT);
-       buf_end = pack_msg_func_exit(payload, regs);
+       buf_end = pack_msg_func_exit(payload, regs, func_addr);
        set_len_msg(buf, buf_end);
 
        return write_to_buffer(buf);
index 5c740d8..d69181a 100644 (file)
@@ -57,7 +57,7 @@ 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);
+int exit_event(struct pt_regs *regs, unsigned long func_addr);
 
 int switch_entry(struct pt_regs *regs);
 int switch_exit(struct pt_regs *regs);