-int dbi_/un/register_ujprobe(struct task_struct *task, struct jprobe *jp, int atomic);
+int dbi_/un/register_ujprobe(struct ujprobe *jp, int atomic);
as well as create 'struct uprobe' and 'struct ujprobe'
void sspt_set_ip_addr(struct us_ip *ip, const struct sspt_page *page, const struct sspt_file *file)
{
unsigned long addr = file->vm_start + page->offset + ip->offset;
- ip->retprobe.kp.addr = ip->jprobe.kp.addr = (kprobe_opcode_t *)addr;
+ ip->retprobe.kp.addr = ip->jprobe.up.kp.addr = (kprobe_opcode_t *)addr;
}
struct us_ip {
struct list_head list;
- struct jprobe jprobe;
+ struct ujprobe jprobe;
struct uretprobe retprobe;
unsigned long offset;
err = unregister_usprobe(task, ip, 1, 1);
break;
case US_DISARM:
- disarm_uprobe(&ip->jprobe.kp, task);
+ disarm_uprobe(&ip->jprobe.up.kp, task);
break;
default:
panic("incorrect value flag=%d", flag);
list_for_each_entry(ip, &page->ip_list, list) {
printk("### addr[%2d]=%lx, J_addr=%lx, R_addr=%lx\n",
- i, (unsigned long)ip->offset, (unsigned long)ip->jprobe.kp.addr,
+ i, (unsigned long)ip->offset, (unsigned long)ip->jprobe.up.kp.addr,
(unsigned long)ip->retprobe.kp.addr);
print_jprobe(&ip->jprobe);
print_retprobe(&ip->retprobe);
list_for_each_entry(ip, &page->ip_list, list) {
addr = file->vm_start + page->offset + ip->offset;
- ip->retprobe.kp.addr = ip->jprobe.kp.addr = (kprobe_opcode_t *)addr;
+ ip->retprobe.kp.addr = ip->jprobe.up.kp.addr = (kprobe_opcode_t *)addr;
}
}
void ujprobe_event_handler (unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5, unsigned long arg6)
{
struct us_ip *ip = __get_cpu_var(gpCurIp);
- unsigned long addr = (unsigned long)ip->jprobe.kp.addr;
+ unsigned long addr = (unsigned long)ip->jprobe.up.kp.addr;
#ifdef __ANDROID
struct pt_regs *regs = __get_cpu_var(gpUserRegs);
static void send_plt(struct us_ip *ip)
{
- unsigned long addr = (unsigned long)ip->jprobe.kp.addr;
+ unsigned long addr = (unsigned long)ip->jprobe.up.kp.addr;
struct vm_area_struct *vma = find_vma(current->mm, addr);
if (vma && check_vma(vma)) {
int uretprobe_event_handler(struct uretprobe_instance *probe, struct pt_regs *regs, struct us_ip *ip)
{
int retval = regs_return_value(regs);
- unsigned long addr = (unsigned long)ip->jprobe.kp.addr;
+ unsigned long addr = (unsigned long)ip->jprobe.up.kp.addr;
if (ip->got_addr && ip->flag_got == 0) {
send_plt(ip);
int register_usprobe(struct task_struct *task, struct us_ip *ip, int atomic)
{
int ret = 0;
- ip->jprobe.kp.tgid = task->tgid;
+ ip->jprobe.up.kp.tgid = task->tgid;
if (ip->jprobe.entry == NULL) {
- ip->jprobe.entry = (kprobe_opcode_t *)ujprobe_event_handler;
+ ip->jprobe.entry = (void *)ujprobe_event_handler;
DPRINTF("Set default event handler for %x\n", ip->offset);
}
if (ip->jprobe.pre_entry == NULL) {
- ip->jprobe.pre_entry = (kprobe_pre_entry_handler_t)ujprobe_event_pre_handler;
+ ip->jprobe.pre_entry = (uprobe_pre_entry_handler_t)ujprobe_event_pre_handler;
DPRINTF("Set default pre handler for %x\n", ip->offset);
}
ip->jprobe.priv_arg = ip;
- ret = dbi_register_ujprobe(task, &ip->jprobe, atomic);
+ ip->jprobe.up.task = task;
+ ret = dbi_register_ujprobe(&ip->jprobe, atomic);
if (ret) {
DPRINTF ("dbi_register_ujprobe() failure %d", ret);
return ret;
int unregister_usprobe(struct task_struct *task, struct us_ip *ip, int atomic, int not_rp2)
{
- dbi_unregister_ujprobe(task, &ip->jprobe, atomic);
+ dbi_unregister_ujprobe(&ip->jprobe, atomic);
if (ip->flag_retprobe) {
dbi_unregister_uretprobe(task, &ip->retprobe, atomic, not_rp2);
do { \
us_proc_ip_t *ip = __get_cpu_var(gpCurIp); \
struct pt_regs *regs = __get_cpu_var(gpUserRegs); \
- dump_backtrace(US_PROBE_ID, current, ip->jprobe.kp.addr, regs, size); \
+ dump_backtrace(US_PROBE_ID, current, ip->jprobe.up.kp.addr, regs, size); \
} while (0)
struct dentry *dentry_by_path(const char *path);
int setjmp_upre_handler(struct kprobe *p, struct pt_regs *regs)
{
- struct jprobe *jp = container_of(p, struct jprobe, kp);
+ struct uprobe *up = container_of(p, struct uprobe, kp);
+ struct ujprobe *jp = container_of(up, struct ujprobe, up);
+
kprobe_pre_entry_handler_t pre_entry = (kprobe_pre_entry_handler_t)jp->pre_entry;
entry_point_t entry = (entry_point_t)jp->entry;
}
}
-int dbi_register_ujprobe(struct task_struct *task, struct jprobe *jp, int atomic)
+int dbi_register_ujprobe(struct ujprobe *jp, int atomic)
{
int ret = 0;
/* Todo: Verify probepoint is a function entry point */
- jp->kp.pre_handler = setjmp_upre_handler;
- jp->kp.break_handler = longjmp_break_uhandler;
+ jp->up.kp.pre_handler = setjmp_upre_handler;
+ jp->up.kp.break_handler = longjmp_break_uhandler;
- ret = dbi_register_uprobe(&jp->kp, task, atomic);
+ ret = dbi_register_uprobe(&jp->up.kp, jp->up.task, atomic);
return ret;
}
-void dbi_unregister_ujprobe(struct task_struct *task, struct jprobe *jp, int atomic)
+void dbi_unregister_ujprobe(struct ujprobe *jp, int atomic)
{
- dbi_unregister_uprobe(&jp->kp, task, atomic);
+ dbi_unregister_uprobe(&jp->up.kp, jp->up.task, atomic);
/*
* Here is an attempt to unregister even those probes that have not been
* installed (hence not added to the hlist).
* really belongs to the hlist.
*/
#ifdef CONFIG_ARM
- if (!(hlist_unhashed(&jp->kp.is_hlist_arm))) {
- hlist_del_rcu(&jp->kp.is_hlist_arm);
+ if (!(hlist_unhashed(&jp->up.kp.is_hlist_arm))) {
+ hlist_del_rcu(&jp->up.kp.is_hlist_arm);
}
- if (!(hlist_unhashed(&jp->kp.is_hlist_thumb))) {
- hlist_del_rcu(&jp->kp.is_hlist_thumb);
+ if (!(hlist_unhashed(&jp->up.kp.is_hlist_thumb))) {
+ hlist_del_rcu(&jp->up.kp.is_hlist_thumb);
}
#else /* CONFIG_ARM */
- if (!(hlist_unhashed(&jp->kp.is_hlist))) {
- hlist_del_rcu(&jp->kp.is_hlist);
+ if (!(hlist_unhashed(&jp->up.kp.is_hlist))) {
+ hlist_del_rcu(&jp->up.kp.is_hlist);
}
#endif /* CONFIG_ARM */
}
#include "dbi_kprobes.h"
+struct uprobe {
+ struct kprobe kp;
+ struct task_struct *task;
+};
+
+typedef unsigned long (*uprobe_pre_entry_handler_t)(void *priv_arg, struct pt_regs * regs);
+
+struct ujprobe {
+ struct uprobe up;
+ /* probe handling code to jump to */
+ void *entry;
+ // handler whichw willb bec called before 'entry'
+ uprobe_pre_entry_handler_t pre_entry;
+ void *priv_arg;
+};
+
struct uretprobe_instance;
typedef int (*uretprobe_handler_t)(struct uretprobe_instance *, struct pt_regs *, void *);
int dbi_register_uprobe(struct kprobe *p, struct task_struct *task, int atomic);
void dbi_unregister_uprobe(struct kprobe *p, struct task_struct *task, int atomic);
-int dbi_register_ujprobe(struct task_struct *task, struct jprobe *jp, int atomic);
-void dbi_unregister_ujprobe(struct task_struct *task, struct jprobe *jp, int atomic);
+int dbi_register_ujprobe(struct ujprobe *jp, int atomic);
+void dbi_unregister_ujprobe(struct ujprobe *jp, int atomic);
int dbi_register_uretprobe(struct task_struct *task, struct uretprobe *rp, int atomic);
void dbi_unregister_uretprobe(struct task_struct *task, struct uretprobe *rp, int atomic, int not_rp2);