Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 334754
b: refs/heads/master
c: 1b08e90
h: refs/heads/master
v: v3
  • Loading branch information
Oleg Nesterov committed Sep 29, 2012
1 parent ec41e34 commit 7f9dcc0
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 22 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0578a97098dab967ece4b025fe5eb4984c4c86c0
refs/heads/master: 1b08e907211cdc744f54871736005d9f3e7f182c
1 change: 0 additions & 1 deletion trunk/include/linux/uprobes.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ struct uprobe_consumer {
#ifdef CONFIG_UPROBES
enum uprobe_task_state {
UTASK_RUNNING,
UTASK_BP_HIT,
UTASK_SSTEP,
UTASK_SSTEP_ACK,
UTASK_SSTEP_TRAPPED,
Expand Down
29 changes: 9 additions & 20 deletions trunk/kernel/events/uprobes.c
Original file line number Diff line number Diff line change
Expand Up @@ -1469,10 +1469,6 @@ static void handle_swbp(struct pt_regs *regs)
bp_vaddr = uprobe_get_swbp_addr(regs);
uprobe = find_active_uprobe(bp_vaddr, &is_swbp);

utask = current->utask;
if (utask)
utask->state = UTASK_RUNNING;

if (!uprobe) {
if (is_swbp > 0) {
/* No matching uprobe; signal SIGTRAP. */
Expand All @@ -1491,6 +1487,7 @@ static void handle_swbp(struct pt_regs *regs)
return;
}

utask = current->utask;
if (!utask) {
utask = add_utask();
/* Cannot allocate; re-execute the instruction. */
Expand Down Expand Up @@ -1547,13 +1544,12 @@ static void handle_singlestep(struct uprobe_task *utask, struct pt_regs *regs)
}

/*
* On breakpoint hit, breakpoint notifier sets the TIF_UPROBE flag. (and on
* subsequent probe hits on the thread sets the state to UTASK_BP_HIT) and
* allows the thread to return from interrupt.
* On breakpoint hit, breakpoint notifier sets the TIF_UPROBE flag and
* allows the thread to return from interrupt. After that handle_swbp()
* sets utask->active_uprobe.
*
* On singlestep exception, singlestep notifier sets the TIF_UPROBE flag and
* also sets the state to UTASK_SSTEP_ACK and allows the thread to return from
* interrupt.
* On singlestep exception, singlestep notifier sets the TIF_UPROBE flag
* and allows the thread to return from interrupt.
*
* While returning to userspace, thread notices the TIF_UPROBE flag and calls
* uprobe_notify_resume().
Expand All @@ -1563,10 +1559,10 @@ void uprobe_notify_resume(struct pt_regs *regs)
struct uprobe_task *utask;

utask = current->utask;
if (!utask || utask->state == UTASK_BP_HIT)
handle_swbp(regs);
else
if (utask && utask->active_uprobe)
handle_singlestep(utask, regs);
else
handle_swbp(regs);
}

/*
Expand All @@ -1575,17 +1571,10 @@ void uprobe_notify_resume(struct pt_regs *regs)
*/
int uprobe_pre_sstep_notifier(struct pt_regs *regs)
{
struct uprobe_task *utask;

if (!current->mm || !test_bit(MMF_HAS_UPROBES, &current->mm->flags))
return 0;

utask = current->utask;
if (utask)
utask->state = UTASK_BP_HIT;

set_thread_flag(TIF_UPROBE);

return 1;
}

Expand Down

0 comments on commit 7f9dcc0

Please sign in to comment.