Skip to content

Commit b50ea74

Browse files
Masami HiramatsuLinus Torvalds
authored andcommitted
[PATCH] kprobes: clean up resume_execute()
Clean up kprobe's resume_execute() for i386 arch. Signed-off-by: Masami Hiramatsu <[email protected]> Cc: Prasanna S Panchamukhi <[email protected]> Cc: Ananth N Mavinakayanahalli <[email protected]> Cc: Anil S Keshavamurthy <[email protected]> Cc: David S. Miller <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 05cfb61 commit b50ea74

File tree

1 file changed

+10
-16
lines changed

1 file changed

+10
-16
lines changed

arch/i386/kernel/kprobes.c

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -362,10 +362,10 @@ static void __kprobes resume_execution(struct kprobe *p,
362362
struct pt_regs *regs, struct kprobe_ctlblk *kcb)
363363
{
364364
unsigned long *tos = (unsigned long *)&regs->esp;
365-
unsigned long next_eip = 0;
366365
unsigned long copy_eip = (unsigned long)p->ainsn.insn;
367366
unsigned long orig_eip = (unsigned long)p->addr;
368367

368+
regs->eflags &= ~TF_MASK;
369369
switch (p->ainsn.insn[0]) {
370370
case 0x9c: /* pushfl */
371371
*tos &= ~(TF_MASK | IF_MASK);
@@ -375,37 +375,31 @@ static void __kprobes resume_execution(struct kprobe *p,
375375
case 0xcb:
376376
case 0xc2:
377377
case 0xca:
378-
regs->eflags &= ~TF_MASK;
379-
/* eip is already adjusted, no more changes required*/
380-
return;
378+
case 0xea: /* jmp absolute -- eip is correct */
379+
/* eip is already adjusted, no more changes required */
380+
goto no_change;
381381
case 0xe8: /* call relative - Fix return addr */
382382
*tos = orig_eip + (*tos - copy_eip);
383383
break;
384384
case 0xff:
385385
if ((p->ainsn.insn[1] & 0x30) == 0x10) {
386386
/* call absolute, indirect */
387387
/* Fix return addr; eip is correct. */
388-
next_eip = regs->eip;
389388
*tos = orig_eip + (*tos - copy_eip);
389+
goto no_change;
390390
} else if (((p->ainsn.insn[1] & 0x31) == 0x20) || /* jmp near, absolute indirect */
391391
((p->ainsn.insn[1] & 0x31) == 0x21)) { /* jmp far, absolute indirect */
392392
/* eip is correct. */
393-
next_eip = regs->eip;
393+
goto no_change;
394394
}
395-
break;
396-
case 0xea: /* jmp absolute -- eip is correct */
397-
next_eip = regs->eip;
398-
break;
399395
default:
400396
break;
401397
}
402398

403-
regs->eflags &= ~TF_MASK;
404-
if (next_eip) {
405-
regs->eip = next_eip;
406-
} else {
407-
regs->eip = orig_eip + (regs->eip - copy_eip);
408-
}
399+
regs->eip = orig_eip + (regs->eip - copy_eip);
400+
401+
no_change:
402+
return;
409403
}
410404

411405
/*

0 commit comments

Comments
 (0)