diff options
author | Gui,Jian <guij@cn.ibm.com> | 2006-11-01 10:50:15 +0800 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2006-11-01 15:14:12 +1100 |
commit | 0d69a052d4d7c4085706b9ac0d1bd28ff90c9fca (patch) | |
tree | 8dada42c1c58e9450161e88e67d304c68917f3a8 | |
parent | 292f86f005e3867277b2126c2399eea3e773a4fc (diff) | |
download | linux-stable-0d69a052d4d7c4085706b9ac0d1bd28ff90c9fca.tar.gz linux-stable-0d69a052d4d7c4085706b9ac0d1bd28ff90c9fca.tar.bz2 linux-stable-0d69a052d4d7c4085706b9ac0d1bd28ff90c9fca.zip |
[POWERPC] Disallow kprobes on emulate_step and branch_taken
On powerpc, probing on emulate_step function will crash 2.6.18.1 when
it is triggered.
When kprobe is triggered, emulate_step() is on its kernel path and
will cause recursive kprobe fault. And branch_taken() is called
in emulate_step(). This disallows kprobes on both of them.
Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r-- | arch/powerpc/lib/sstep.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c index 9590ba780b98..7e8ded051b5b 100644 --- a/arch/powerpc/lib/sstep.c +++ b/arch/powerpc/lib/sstep.c @@ -9,6 +9,7 @@ * 2 of the License, or (at your option) any later version. */ #include <linux/kernel.h> +#include <linux/kprobes.h> #include <linux/ptrace.h> #include <asm/sstep.h> #include <asm/processor.h> @@ -25,7 +26,7 @@ extern char system_call_common[]; /* * Determine whether a conditional branch instruction would branch. */ -static int branch_taken(unsigned int instr, struct pt_regs *regs) +static int __kprobes branch_taken(unsigned int instr, struct pt_regs *regs) { unsigned int bo = (instr >> 21) & 0x1f; unsigned int bi; @@ -51,7 +52,7 @@ static int branch_taken(unsigned int instr, struct pt_regs *regs) * or -1 if the instruction is one that should not be stepped, * such as an rfid, or a mtmsrd that would clear MSR_RI. */ -int emulate_step(struct pt_regs *regs, unsigned int instr) +int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr) { unsigned int opcode, rd; unsigned long int imm; |