Commit b50ea74c authored by Masami Hiramatsu's avatar Masami Hiramatsu Committed by Linus Torvalds

[PATCH] kprobes: clean up resume_execute()

Clean up kprobe's resume_execute() for i386 arch.
Signed-off-by: default avatarMasami Hiramatsu <hiramatu@sdl.hitachi.co.jp>
Cc: Prasanna S Panchamukhi <prasanna@in.ibm.com>
Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
Cc: David S. Miller <davem@davemloft.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 05cfb614
...@@ -362,10 +362,10 @@ static void __kprobes resume_execution(struct kprobe *p, ...@@ -362,10 +362,10 @@ static void __kprobes resume_execution(struct kprobe *p,
struct pt_regs *regs, struct kprobe_ctlblk *kcb) struct pt_regs *regs, struct kprobe_ctlblk *kcb)
{ {
unsigned long *tos = (unsigned long *)&regs->esp; unsigned long *tos = (unsigned long *)&regs->esp;
unsigned long next_eip = 0;
unsigned long copy_eip = (unsigned long)p->ainsn.insn; unsigned long copy_eip = (unsigned long)p->ainsn.insn;
unsigned long orig_eip = (unsigned long)p->addr; unsigned long orig_eip = (unsigned long)p->addr;
regs->eflags &= ~TF_MASK;
switch (p->ainsn.insn[0]) { switch (p->ainsn.insn[0]) {
case 0x9c: /* pushfl */ case 0x9c: /* pushfl */
*tos &= ~(TF_MASK | IF_MASK); *tos &= ~(TF_MASK | IF_MASK);
...@@ -375,9 +375,9 @@ static void __kprobes resume_execution(struct kprobe *p, ...@@ -375,9 +375,9 @@ static void __kprobes resume_execution(struct kprobe *p,
case 0xcb: case 0xcb:
case 0xc2: case 0xc2:
case 0xca: case 0xca:
regs->eflags &= ~TF_MASK; case 0xea: /* jmp absolute -- eip is correct */
/* eip is already adjusted, no more changes required*/ /* eip is already adjusted, no more changes required */
return; goto no_change;
case 0xe8: /* call relative - Fix return addr */ case 0xe8: /* call relative - Fix return addr */
*tos = orig_eip + (*tos - copy_eip); *tos = orig_eip + (*tos - copy_eip);
break; break;
...@@ -385,27 +385,21 @@ static void __kprobes resume_execution(struct kprobe *p, ...@@ -385,27 +385,21 @@ static void __kprobes resume_execution(struct kprobe *p,
if ((p->ainsn.insn[1] & 0x30) == 0x10) { if ((p->ainsn.insn[1] & 0x30) == 0x10) {
/* call absolute, indirect */ /* call absolute, indirect */
/* Fix return addr; eip is correct. */ /* Fix return addr; eip is correct. */
next_eip = regs->eip;
*tos = orig_eip + (*tos - copy_eip); *tos = orig_eip + (*tos - copy_eip);
goto no_change;
} else if (((p->ainsn.insn[1] & 0x31) == 0x20) || /* jmp near, absolute indirect */ } else if (((p->ainsn.insn[1] & 0x31) == 0x20) || /* jmp near, absolute indirect */
((p->ainsn.insn[1] & 0x31) == 0x21)) { /* jmp far, absolute indirect */ ((p->ainsn.insn[1] & 0x31) == 0x21)) { /* jmp far, absolute indirect */
/* eip is correct. */ /* eip is correct. */
next_eip = regs->eip; goto no_change;
} }
break;
case 0xea: /* jmp absolute -- eip is correct */
next_eip = regs->eip;
break;
default: default:
break; break;
} }
regs->eflags &= ~TF_MASK; regs->eip = orig_eip + (regs->eip - copy_eip);
if (next_eip) {
regs->eip = next_eip; no_change:
} else { return;
regs->eip = orig_eip + (regs->eip - copy_eip);
}
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment