int register_usprobe(struct task_struct *task, struct us_ip *ip, int atomic)
{
int ret = 0;
- ip->jprobe.up.kp.tgid = task->tgid;
if (ip->jprobe.entry == NULL) {
ip->jprobe.entry = (void *)ujprobe_event_handler;
if (ip->flag_retprobe) {
// Mr_Nobody: comment for valencia
- ip->retprobe.up.kp.tgid = task->tgid;
if (ip->retprobe.handler == NULL) {
ip->retprobe.handler = (uretprobe_handler_t)uretprobe_event_handler;
DPRINTF("Set default ret event handler for %x\n", ip->offset);
kcb = get_kprobe_ctlblk();
cur = kprobe_running();
- p = get_kprobe((kprobe_opcode_t *)regs->ARM_pc, 0);
+ p = get_kprobe((void *)regs->ARM_pc);
if (p) {
if (cur) {
entry_point_t entry = (entry_point_t)jp->entry;
pre_entry = (kprobe_pre_entry_handler_t)jp->pre_entry;
- if (p->tgid) {
- panic("setjmp_pre_handler: p->tgid == 0");
- }
-
if (((unsigned long)p->addr == sched_addr) && sched_rp) {
struct thread_info *tinfo = (struct thread_info *)regs->ARM_r2;
patch_suspended_task(sched_rp, tinfo->task);
DBPRINTF ("start");
- if (p && p->tgid){
- // in case of user space retprobe trampoline is at the Nth instruction of US tramp
- if (!thumb_mode( regs ))
- trampoline_address = (unsigned long)(p->ainsn.insn + UPROBES_TRAMP_RET_BREAK_IDX);
- else
- trampoline_address = (unsigned long)(p->ainsn.insn) + 0x1b;
- }
-
spin_lock_irqsave (&kretprobe_lock, flags);
/*
* task_struct. User space probes can be shared between threads of one
* process so they have different current but same mm.
*/
- if (p && p->tgid) {
- head = kretprobe_inst_table_head(current->mm);
- } else {
- head = kretprobe_inst_table_head(current);
- }
+ head = kretprobe_inst_table_head(current);
/*
* It is possible to have multiple instances associated with a given
//if (ri->rp) BUG_ON (ri->rp->kp.tgid == 0);
//else if (ri->rp2) BUG_ON (ri->rp2->kp.tgid == 0);
//}
- if ((ri->rp && ri->rp->kp.tgid) || (ri->rp2 && ri->rp2->kp.tgid))
- BUG_ON (trampoline_address == (unsigned long) &kretprobe_trampoline);
regs->uregs[14] = orig_ret_address;
DBPRINTF ("regs->uregs[14] = 0x%lx\n", regs->uregs[14]);
/* Set flag of current mode */
ri->sp = (kprobe_opcode_t *)((long)ri->sp | !!thumb_mode(regs));
- if (rp->kp.tgid) {
- panic("__arch_prepare_kretprobe: rp->kp.tgid != 0");
- }
-
/* Replace the return addr with trampoline addr */
regs->uregs[14] = (unsigned long) &kretprobe_trampoline;
* OR
* - with preemption disabled - from arch/xxx/kernel/kprobes.c
*/
-struct kprobe *get_kprobe(kprobe_opcode_t *addr, pid_t tgid)
+struct kprobe *get_kprobe(void *addr)
{
struct hlist_head *head;
struct hlist_node *node;
- struct kprobe *p, *retVal = NULL;
+ struct kprobe *p;
head = &kprobe_table[hash_ptr (addr, KPROBE_HASH_BITS)];
hlist_for_each_entry_rcu(p, node, head, hlist) {
- if (p->addr == addr && p->tgid == tgid) {
- retVal = p;
- break;
+ if (p->addr == addr) {
+ return p;
}
}
- DBPRINTF ("get_kprobe: probe %p", retVal);
- return retVal;
+ return NULL;
}
/*
{
memcpy (&p->opcode, &old_p->opcode, sizeof (kprobe_opcode_t));
memcpy (&p->ainsn, &old_p->ainsn, sizeof (struct arch_specific_insn));
- p->tgid = old_p->tgid;
p->ss_addr = old_p->ss_addr;
#ifdef CONFIG_ARM
p->safe_arm = old_p->safe_arm;
p->mod_refcounted = 0;
p->nmissed = 0;
- old_p = get_kprobe(p->addr, 0);
+ old_p = get_kprobe(p->addr);
if (old_p)
{
ret = register_aggr_kprobe (old_p, p);
void dbi_unregister_kprobe (struct kprobe *p, struct task_struct *task)
{
struct kprobe *old_p, *list_p;
- int cleanup_p, pid = p->tgid;
+ int cleanup_p;
- old_p = get_kprobe(p->addr, pid);
+ old_p = get_kprobe(p->addr);
DBPRINTF ("dbi_unregister_kprobe p=%p old_p=%p", p, old_p);
if (unlikely (!old_p))
return;
clone->kp.post_handler = NULL;
clone->kp.fault_handler = NULL;
clone->kp.break_handler = NULL;
- old_p = get_kprobe(rp->kp.addr, rp->kp.tgid);
+ old_p = get_kprobe(rp->kp.addr);
if (old_p)
{
ret = register_aggr_kprobe (old_p, &clone->kp);
kprobe_opcode_t opcode;
/* copy of the original instruction */
struct arch_specific_insn ainsn;
- // TGID to which probe belongs
- pid_t tgid;
// override single-step target address,
// may be used to redirect control-flow to arbitrary address after probe point
// without invocation of original instruction;
/* Get the kprobe at this addr (if any) - called with preemption disabled */
-struct kprobe *get_kprobe(kprobe_opcode_t *addr, pid_t tgid);
+struct kprobe *get_kprobe(void *addr);
struct kprobe *get_ukprobe_by_insn_slot(void *addr, pid_t tgid, struct pt_regs *regs);
struct hlist_head *kretprobe_inst_table_head (void *hash_key);
{
memcpy(&p->opcode, &old_p->opcode, sizeof(kprobe_opcode_t));
memcpy(&p->ainsn, &old_p->ainsn, sizeof(struct arch_specific_insn));
- p->tgid = old_p->tgid;
p->ss_addr = old_p->ss_addr;
#ifdef CONFIG_ARM
p->safe_arm = old_p->safe_arm;
struct kprobe *p = &up->kp;
struct task_struct *task = up->task;
- if (p->tgid == 0) {
- panic("remove_uprobe for tgid == 0!!!");
- }
-
#ifdef CONFIG_ARM
free_insn_slot(&uprobe_insn_pages, task, p->ainsn.insn_arm);
free_insn_slot(&uprobe_insn_pages, task, p->ainsn.insn_thumb);
#endif
// get the first item
- old_p = get_ukprobe(p->addr, p->tgid);
+ old_p = get_ukprobe(p->addr, kp2up(p)->task->tgid);
if (old_p) {
#ifdef CONFIG_ARM
p->safe_arm = old_p->safe_arm;
int cleanup_p;
p = &up->kp;
- old_p = get_ukprobe(p->addr, p->tgid);
+ old_p = get_ukprobe(p->addr, kp2up(p)->task->tgid);
if (unlikely(!old_p)) {
return;
}
struct hlist_head *head = uretprobe_inst_table_head(parent->mm);
hlist_for_each_entry_safe(ri, node, tmp, head, hlist) {
- if (parent == ri->task && ri->rp->up.kp.tgid) {
+ if (parent == ri->task) {
dbi_disarm_urp_inst(ri, task);
}
}
for (i = 0; i < UPROBE_TABLE_SIZE; ++i) {
head = &uprobe_table[i];
hlist_for_each_entry_safe(p, node, tnode, head, hlist) {
- if (p->tgid == task->tgid) {
+ if (kp2up(p)->task->tgid == task->tgid) {
struct uprobe *up = container_of(p, struct uprobe, kp);
printk("dbi_unregister_all_uprobes: delete uprobe at %p[%lx] for %s/%d\n",
p->addr, (unsigned long)p->opcode, task->comm, task->pid);