From: Vyacheslav Cherkashin Date: Wed, 28 Aug 2013 07:29:36 +0000 (+0400) Subject: [FIX] correct pc_addr in exit_event() X-Git-Tag: Tizen_SDK_2.3~298 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d1d16626d2b2447afbf40dd00a96d5446def520c;p=kernel%2Fswap-modules.git [FIX] correct pc_addr in exit_event() --- diff --git a/ks_features/ks_features.c b/ks_features/ks_features.c index 27b74a4..4112378 100644 --- a/ks_features/ks_features.c +++ b/ks_features/ks_features.c @@ -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; } diff --git a/us_manager/us_def_handler.c b/us_manager/us_def_handler.c index a08a81c..0d4e404 100644 --- a/us_manager/us_def_handler.c +++ b/us_manager/us_def_handler.c @@ -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; } diff --git a/writer/swap_writer_module.c b/writer/swap_writer_module.c index c26a111..481696f 100644 --- a/writer/swap_writer_module.c +++ b/writer/swap_writer_module.c @@ -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); diff --git a/writer/swap_writer_module.h b/writer/swap_writer_module.h index 5c740d8..d69181a 100644 --- a/writer/swap_writer_module.h +++ b/writer/swap_writer_module.h @@ -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);