Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 40829
b: refs/heads/master
c: 8bdc052
h: refs/heads/master
i:
  40827: 6fe5cc2
v: v3
  • Loading branch information
Masami Hiramatsu authored and Linus Torvalds committed Nov 9, 2006
1 parent d86c3c1 commit 7194943
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 8 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: 4b438a23fb05b6566393f9f0a3987ea3dcc1c0c4
refs/heads/master: 8bdc052eccdc7893d075d3f1f7103594a458c8c4
22 changes: 15 additions & 7 deletions trunk/arch/i386/kernel/kprobes.c
Original file line number Diff line number Diff line change
Expand Up @@ -361,8 +361,11 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
asm volatile ( ".global kretprobe_trampoline\n"
"kretprobe_trampoline: \n"
" pushf\n"
/* skip cs, eip, orig_eax, es, ds */
" subl $20, %esp\n"
/* skip cs, eip, orig_eax */
" subl $12, %esp\n"
" pushl %gs\n"
" pushl %ds\n"
" pushl %es\n"
" pushl %eax\n"
" pushl %ebp\n"
" pushl %edi\n"
Expand All @@ -373,19 +376,19 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
" movl %esp, %eax\n"
" call trampoline_handler\n"
/* move eflags to cs */
" movl 48(%esp), %edx\n"
" movl %edx, 44(%esp)\n"
" movl 52(%esp), %edx\n"
" movl %edx, 48(%esp)\n"
/* save true return address on eflags */
" movl %eax, 48(%esp)\n"
" movl %eax, 52(%esp)\n"
" popl %ebx\n"
" popl %ecx\n"
" popl %edx\n"
" popl %esi\n"
" popl %edi\n"
" popl %ebp\n"
" popl %eax\n"
/* skip eip, orig_eax, es, ds */
" addl $16, %esp\n"
/* skip eip, orig_eax, es, ds, gs */
" addl $20, %esp\n"
" popf\n"
" ret\n");
}
Expand All @@ -404,6 +407,10 @@ fastcall void *__kprobes trampoline_handler(struct pt_regs *regs)
INIT_HLIST_HEAD(&empty_rp);
spin_lock_irqsave(&kretprobe_lock, flags);
head = kretprobe_inst_table_head(current);
/* fixup registers */
regs->xcs = __KERNEL_CS;
regs->eip = trampoline_address;
regs->orig_eax = 0xffffffff;

/*
* It is possible to have multiple instances associated with a given
Expand All @@ -425,6 +432,7 @@ fastcall void *__kprobes trampoline_handler(struct pt_regs *regs)

if (ri->rp && ri->rp->handler){
__get_cpu_var(current_kprobe) = &ri->rp->kp;
get_kprobe_ctlblk()->kprobe_status = KPROBE_HIT_ACTIVE;
ri->rp->handler(ri, regs);
__get_cpu_var(current_kprobe) = NULL;
}
Expand Down

0 comments on commit 7194943

Please sign in to comment.