Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 330334
b: refs/heads/master
c: 8e9f693
h: refs/heads/master
v: v3
  • Loading branch information
Tiejun Chen authored and Benjamin Herrenschmidt committed Sep 18, 2012
1 parent 7aeb990 commit 0754ded
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 3 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: a9c4e541ea9b22944da356f2a9258b4eddcc953b
refs/heads/master: 8e9f69371536981a2a8c9ee4a49dbe3aa4946df4
36 changes: 34 additions & 2 deletions trunk/arch/powerpc/lib/sstep.c
Original file line number Diff line number Diff line change
Expand Up @@ -566,7 +566,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
unsigned long int ea;
unsigned int cr, mb, me, sh;
int err;
unsigned long old_ra;
unsigned long old_ra, val3;
long ival;

opcode = instr >> 26;
Expand Down Expand Up @@ -1486,11 +1486,43 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
goto ldst_done;

case 36: /* stw */
case 37: /* stwu */
val = regs->gpr[rd];
err = write_mem(val, dform_ea(instr, regs), 4, regs);
goto ldst_done;

case 37: /* stwu */
val = regs->gpr[rd];
val3 = dform_ea(instr, regs);
/*
* For PPC32 we always use stwu to change stack point with r1. So
* this emulated store may corrupt the exception frame, now we
* have to provide the exception frame trampoline, which is pushed
* below the kprobed function stack. So we only update gpr[1] but
* don't emulate the real store operation. We will do real store
* operation safely in exception return code by checking this flag.
*/
if ((ra == 1) && !(regs->msr & MSR_PR) \
&& (val3 >= (regs->gpr[1] - STACK_INT_FRAME_SIZE))) {
/*
* Check if we will touch kernel sack overflow
*/
if (val3 - STACK_INT_FRAME_SIZE <= current->thread.ksp_limit) {
printk(KERN_CRIT "Can't kprobe this since Kernel stack overflow.\n");
err = -EINVAL;
break;
}

/*
* Check if we already set since that means we'll
* lose the previous value.
*/
WARN_ON(test_thread_flag(TIF_EMULATE_STACK_STORE));
set_thread_flag(TIF_EMULATE_STACK_STORE);
err = 0;
} else
err = write_mem(val, val3, 4, regs);
goto ldst_done;

case 38: /* stb */
case 39: /* stbu */
val = regs->gpr[rd];
Expand Down

0 comments on commit 0754ded

Please sign in to comment.