From 84aadd1fbc02606bf93cf56acc6aa2571e2baf9c Mon Sep 17 00:00:00 2001 From: Vasiliy Ulyanov Date: Tue, 10 Jun 2014 12:28:40 +0400 Subject: [PATCH] [PROTO] Add type/subtype in msg_function_exit Change-Id: I451d282f315c84009881e76d43efbbc76090d35b Signed-off-by: Vasiliy Ulyanov --- ks_features/ks_features.c | 4 +++- us_manager/sspt/ip.c | 2 +- writer/swap_writer_module.c | 25 ++++++++++++++++--------- writer/swap_writer_module.h | 9 +++++---- 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/ks_features/ks_features.c b/ks_features/ks_features.c index a5fe06f..4a56671 100644 --- a/ks_features/ks_features.c +++ b/ks_features/ks_features.c @@ -135,10 +135,12 @@ static int ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs) struct kretprobe *rp = ri->rp; if (rp && check_event(current)) { + struct ks_probe *ksp = container_of(rp, struct ks_probe, rp); unsigned long func_addr = (unsigned long)rp->kp.addr; unsigned long ret_addr = (unsigned long)ri->ret_addr; + int sub_type = ksp->sub_type; - exit_event('x', regs, func_addr, ret_addr); + exit_event('x', regs, PT_KS, sub_type, func_addr, ret_addr); } return 0; diff --git a/us_manager/sspt/ip.c b/us_manager/sspt/ip.c index c7779ce..a54353e 100644 --- a/us_manager/sspt/ip.c +++ b/us_manager/sspt/ip.c @@ -54,7 +54,7 @@ static int ret_handler(struct uretprobe_instance *ri, struct pt_regs *regs) unsigned long addr = (unsigned long)ip->orig_addr; unsigned long ret_addr = (unsigned long)ri->ret_addr; - exit_event(ip->ret_type, regs, addr, ret_addr); + exit_event(ip->ret_type, regs, PT_US, PST_NONE, addr, ret_addr); } return 0; diff --git a/writer/swap_writer_module.c b/writer/swap_writer_module.c index f1853c2..af9646f 100644 --- a/writer/swap_writer_module.c +++ b/writer/swap_writer_module.c @@ -914,6 +914,8 @@ EXPORT_SYMBOL_GPL(entry_event); struct msg_func_exit { u32 pid; /**< PID */ u32 tid; /**< TID */ + u16 probe_type; /**< Probe type */ + u16 probe_sub_type; /**< Probe subtype */ u64 pc_addr; /**< Instruction pointer */ u64 caller_pc_addr; /**< Return address */ u32 cpu_num; /**< CPU number */ @@ -1003,8 +1005,8 @@ static int pack_msg_ret_val(char *buf, int len, char ret_type, static int pack_msg_func_exit(char *buf, int len, char ret_type, - struct pt_regs *regs, unsigned long func_addr, - unsigned long ret_addr) + struct pt_regs *regs, int pt, int sub_type, + unsigned long func_addr, unsigned long ret_addr) { struct msg_func_exit *mfe = (struct msg_func_exit *)buf; struct task_struct *task = current; @@ -1012,6 +1014,8 @@ static int pack_msg_func_exit(char *buf, int len, char ret_type, mfe->pid = task->tgid; mfe->tid = task->pid; + mfe->probe_type = pt; + mfe->probe_sub_type = sub_type; mfe->cpu_num = smp_processor_id(); mfe->pc_addr = func_addr; mfe->caller_pc_addr = ret_addr; @@ -1030,12 +1034,13 @@ static int pack_msg_func_exit(char *buf, int len, char ret_type, * * @param ret_type Return value type. * @param regs CPU register data. + * @param sub_type Event subtype. * @param func_addr Function address. * @param ret_addr Return address. * @return Written data size on success, negative error code on error. */ -int exit_event(char ret_type, struct pt_regs *regs, unsigned long func_addr, - unsigned long ret_addr) +int exit_event(char ret_type, struct pt_regs *regs, int pt, int sub_type, + unsigned long func_addr, unsigned long ret_addr) { char *buf, *payload, *buf_end; int ret; @@ -1043,7 +1048,7 @@ int exit_event(char ret_type, struct pt_regs *regs, unsigned long func_addr, buf = get_current_buf(); payload = pack_basic_msg_fmt(buf, MSG_FUNCTION_EXIT); /* FIXME: len=1024 */ - ret = pack_msg_func_exit(payload, 1024, ret_type, regs, + ret = pack_msg_func_exit(payload, 1024, ret_type, regs, pt, sub_type, func_addr, ret_addr); if (ret < 0) goto put_buf; @@ -1380,7 +1385,7 @@ enum { max_custom_event_size = 2048 }; * @return Written data size on success, negative error code on error. */ int custom_entry_event(unsigned long func_addr, struct pt_regs *regs, - int type, int sub_type, const char *fmt, ...) + int pt, int sub_type, const char *fmt, ...) { char *buf, *payload, *args, *buf_end; va_list vargs; @@ -1389,7 +1394,7 @@ int custom_entry_event(unsigned long func_addr, struct pt_regs *regs, buf = get_current_buf(); payload = pack_basic_msg_fmt(buf, MSG_FUNCTION_ENTRY); args = pack_msg_func_entry(payload, fmt, func_addr, - regs, type, sub_type); + regs, pt, sub_type); va_start(vargs, fmt); ret = pack_custom_event(args, max_custom_event_size, fmt, vargs); @@ -1422,7 +1427,8 @@ EXPORT_SYMBOL_GPL(custom_entry_event); * @return Written data size on success, negative error code on error. */ int custom_exit_event(unsigned long func_addr, unsigned long ret_addr, - struct pt_regs *regs, const char *fmt, ...) + struct pt_regs *regs, int pt, int sub_type, + const char *fmt, ...) { char *buf, *payload, *buf_end; int ret; @@ -1430,7 +1436,8 @@ int custom_exit_event(unsigned long func_addr, unsigned long ret_addr, buf = get_current_buf(); payload = pack_basic_msg_fmt(buf, MSG_FUNCTION_EXIT); ret = pack_msg_func_exit(payload, max_custom_event_size, - fmt[0], regs, func_addr, ret_addr); + fmt[0], regs, pt, sub_type, + func_addr, ret_addr); if (ret < 0) goto put_buf; diff --git a/writer/swap_writer_module.h b/writer/swap_writer_module.h index 74a34c0..c975a8e 100644 --- a/writer/swap_writer_module.h +++ b/writer/swap_writer_module.h @@ -77,8 +77,8 @@ int sample_msg(struct pt_regs *regs); 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); +int exit_event(char ret_type, struct pt_regs *regs, int pt, int sub_type, + unsigned long func_addr, unsigned long ret_addr); int switch_entry(struct pt_regs *regs); int switch_exit(struct pt_regs *regs); @@ -88,8 +88,9 @@ int error_msg(const char *fmt, ...); int raw_msg(char *buf, size_t len); int custom_entry_event(unsigned long func_addr, struct pt_regs *regs, - int type, int sub_type, const char *fmt, ...); + int pt, int sub_type, const char *fmt, ...); int custom_exit_event(unsigned long func_addr, unsigned long ret_addr, - struct pt_regs *regs, const char *fmt, ...); + struct pt_regs *regs, int pt, int sub_type, + const char *fmt, ...); #endif /* _SWAP_MSG_H */ -- 2.7.4