summaryrefslogtreecommitdiff
path: root/writer
diff options
context:
space:
mode:
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>2013-10-04 18:38:47 +0400
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>2013-10-04 18:38:47 +0400
commita11f828df3f3ab4a0f9d14b49c54c31e9e7b24f1 (patch)
tree4bc367c8648bbf0b0871ec43de26deb3601be8d1 /writer
parentb12df65abbf3dbb4dd730fc5b9fbb5ef3d2ec84d (diff)
downloadswap-modules-a11f828df3f3ab4a0f9d14b49c54c31e9e7b24f1.tar.gz
swap-modules-a11f828df3f3ab4a0f9d14b49c54c31e9e7b24f1.tar.bz2
swap-modules-a11f828df3f3ab4a0f9d14b49c54c31e9e7b24f1.zip
{IMPROVE] add ret_addr for exit_event()
Change-Id: I0e1c6e11442c94befe6a45f528d511af87f31395 Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
Diffstat (limited to 'writer')
-rw-r--r--writer/swap_writer_module.c11
-rw-r--r--writer/swap_writer_module.h3
2 files changed, 10 insertions, 4 deletions
diff --git a/writer/swap_writer_module.c b/writer/swap_writer_module.c
index 9b294a1c..b710d2f9 100644
--- a/writer/swap_writer_module.c
+++ b/writer/swap_writer_module.c
@@ -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);
diff --git a/writer/swap_writer_module.h b/writer/swap_writer_module.h
index 60acd5f6..ca502161 100644
--- a/writer/swap_writer_module.h
+++ b/writer/swap_writer_module.h
@@ -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);