struct uprobe *up;
struct kprobe *p;
- up = get_uprobe(addr, tgid);
- p = &up->kp;
-
- if (p && (check_validity_insn(up, regs) != 0)) {
- printk("no_uprobe live\n");
- return 0;
- }
+ p = get_ukprobe(addr, tgid);
if (p == NULL) {
p = get_kprobe_by_insn_slot(addr, tgid, regs);
return 0;
}
+ up = kp2up(p);
+ if (p && (check_validity_insn(up, regs) != 0)) {
+ printk("no_uprobe live\n");
+ return 0;
+ }
+
/* restore opcode for thumb app */
if (thumb_mode(regs)) {
if (!is_thumb2(p->opcode)) {
copy_uprobe(old_p, p);
ret = add_new_uprobe(old_p, p);
} else {
- ap = kzalloc(sizeof(*ap), GFP_KERNEL);
- if (!ap) {
+ struct uprobe *uap = kzalloc(sizeof(*uap), GFP_KERNEL);
+ if (!uap) {
return -ENOMEM;
}
+ uap->task = kp2up(p)->task;
+ ap = up2kp(uap);
add_aggr_uprobe(ap, old_p);
copy_uprobe(ap, p);
ret = add_new_uprobe(ap, p);
}
}
-struct uprobe *get_uprobe(kprobe_opcode_t *addr, pid_t tgid)
+struct kprobe *get_ukprobe(void *addr, pid_t tgid)
{
struct hlist_head *head;
struct hlist_node *node;
head = &uprobe_table[hash_ptr(addr, UPROBE_HASH_BITS)];
hlist_for_each_entry_rcu(p, node, head, hlist) {
- if (p->addr == addr && p->tgid == tgid) {
- return container_of(p, struct uprobe, kp);
+ if (p->addr == addr && kp2up(p)->task->tgid == tgid) {
+ return p;
}
}
#endif
// get the first item
- old_p = &get_uprobe(p->addr, p->tgid)->kp;
+ old_p = get_ukprobe(p->addr, p->tgid);
if (old_p) {
#ifdef CONFIG_ARM
p->safe_arm = old_p->safe_arm;
int cleanup_p;
p = &up->kp;
- old_p = &get_uprobe(p->addr, p->tgid)->kp;
+ old_p = get_ukprobe(p->addr, p->tgid);
if (unlikely(!old_p)) {
return;
}
void dbi_unregister_all_uprobes(struct task_struct *task, int atomic);
void dbi_uprobe_return(void);
-struct uprobe *get_uprobe(kprobe_opcode_t *addr, pid_t tgid);
+struct kprobe *get_ukprobe(void *addr, pid_t tgid);
+
+static inline struct uprobe *kp2up(struct kprobe *p)
+{
+ return container_of(p, struct uprobe, kp);
+}
+
+static inline struct kprobe *up2kp(struct uprobe *p)
+{
+ return &p->kp;
+}
void disarm_uprobe(struct uprobe *p);