if (rp) {
struct ks_probe *ksp = container_of(rp, struct ks_probe, rp);
const char *fmt = ksp->args;
+ unsigned long addr = (unsigned long)ksp->rp.kp.addr;
int sub_type = ksp->sub_type;
- entry_event(fmt, regs, PT_KS, sub_type);
+ entry_event(fmt, addr, regs, PT_KS, sub_type);
}
return 0;
if (rp && get_quiet() == QT_OFF) {
struct us_ip *ip = container_of(rp, struct us_ip, retprobe);
+ const char *fmt = ip->args;
+ unsigned long addr = (unsigned long)ip->orig_addr;
- entry_event(ip->args, regs, PT_US, PST_NONE);
+ entry_event(fmt, addr, regs, PT_US, PST_NONE);
}
return 0;
if (rp && get_quiet() == QT_OFF) {
struct us_ip *ip = container_of(rp, struct us_ip, retprobe);
- unsigned long addr = (unsigned long)ip->retprobe.up.kp.addr;
+ unsigned long addr = (unsigned long)ip->orig_addr;
unsigned long ret_addr = (unsigned long)ri->ret_addr;
-#if defined(CONFIG_ARM)
- addr = ip->offset & 0x01 ? addr | 0x01 : addr;
-#endif
-
exit_event(ip->ret_type, regs, addr, ret_addr);
}
struct uretprobe retprobe;
char *args;
char ret_type;
+ unsigned long orig_addr;
unsigned long offset;
};
list_for_each_entry_safe(ip, n, &ip_list_tmp, list) {
/* set uprobe address */
addr = file->vm_start + page->offset + ip->offset;
+
+ ip->orig_addr = addr;
ip->retprobe.up.kp.addr = (kprobe_opcode_t *)addr;
err = sspt_register_usprobe(ip);
char args[0];
} __attribute__((packed));
-static char *pack_msg_func_entry(char *payload, const char *fmt, struct pt_regs *regs,
+static char *pack_msg_func_entry(char *payload, const char *fmt,
+ unsigned long func_addr, struct pt_regs *regs,
enum PROBE_TYPE pt, int sub_type)
{
struct msg_func_entry *mfe = (struct msg_func_entry *)payload;
mfe->pid = task->tgid;
mfe->tid = task->pid;
mfe->cpu_num = smp_processor_id();
- mfe->pc_addr = get_regs_ip(regs);
+ mfe->pc_addr = func_addr;
mfe->caller_pc_addr = get_regs_ret_func(regs);
mfe->probe_type = pt;
mfe->probe_sub_type = sub_type;
return buf - buf_old;
}
-int entry_event(const char *fmt, struct pt_regs *regs,
- enum PROBE_TYPE pt, int sub_type)
+int entry_event(const char *fmt, unsigned long func_addr, struct pt_regs *regs,
+ enum PROBE_TYPE pt, int sub_type)
{
char *buf, *payload, *args, *buf_end;
int ret;
buf = get_current_buf();
payload = pack_basic_msg_fmt(buf, MSG_FUNCTION_ENTRY);
- args = pack_msg_func_entry(payload, fmt, regs, pt, sub_type);
+ args = pack_msg_func_entry(payload, fmt, func_addr,
+ regs, pt, sub_type);
/* FIXME: len = 1024 */
ret = pack_args(args, 1024, fmt, regs);
void proc_unmap_msg(unsigned long start, unsigned long end);
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 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);