powerpc/kprobes: Use probe_address() to read instructions
authorChristophe Leroy <christophe.leroy@c-s.fr>
Mon, 24 Feb 2020 18:02:10 +0000 (18:02 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 2 Jun 2020 10:59:08 +0000 (20:59 +1000)
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.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/7f24b5961a6839ff01df792816807f74ff236bf6.1582567319.git.christophe.leroy@c-s.fr
arch/powerpc/kernel/kprobes.c

index 227510df8c5549e1ca594980514cdfdca1e4525e..6f96f65ebfe89295b262538502a57df8dd69fea3 100644 (file)
@@ -287,14 +287,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