In order to avoid Oopses, use probe_address() to read the
instruction at the address where the trap happened.

Signed-off-by: Christophe Leroy <christophe.le...@c-s.fr>
---
 arch/powerpc/kernel/kprobes.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c
index 84567406b53d..a35320b79e16 100644
--- a/arch/powerpc/kernel/kprobes.c
+++ b/arch/powerpc/kernel/kprobes.c
@@ -276,14 +276,18 @@ int kprobe_handler(struct pt_regs *regs)
 
        p = get_kprobe(addr);
        if (!p) {
-               if (*addr != BREAKPOINT_INSTRUCTION) {
+               unsigned int instr;
+
+               if (probe_kernel_address(addr, instr))
+                       goto no_kprobe;
+
+               if (instr != BREAKPOINT_INSTRUCTION) {
                        /*
                         * PowerPC has multiple variants of the "trap"
                         * instruction. If the current instruction is a
                         * trap variant, it could belong to someone else
                         */
-                       kprobe_opcode_t cur_insn = *addr;
-                       if (is_trap(cur_insn))
+                       if (is_trap(instr))
                                goto no_kprobe;
                        /*
                         * The breakpoint instruction was removed right
-- 
2.25.0

Reply via email to