]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
powerpc/kprobes: Blacklist exception handlers
authorNaveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Wed, 19 Apr 2017 15:29:51 +0000 (20:59 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Sun, 23 Apr 2017 10:32:25 +0000 (20:32 +1000)
Introduce __head_end to mark end of the early fixed sections and use it to
blacklist all exception handlers from kprobes.

mpe: We do not need to do anything special for relocatable kernels, where the
exception vectors are split from the main kernel, as the split vectors are
already excluded by the check for kernel_text_address().

Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
[mpe: Move __head_end outside #ifdef 64-bit to unbreak the 32-bit build]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/sections.h
arch/powerpc/kernel/kprobes.c
arch/powerpc/kernel/vmlinux.lds.S

index 7dc006b583696e340305aa5701663f1f494f7133..7902d63588548a0cca22e7875d21f75264df49e3 100644 (file)
@@ -6,6 +6,8 @@
 #include <linux/uaccess.h>
 #include <asm-generic/sections.h>
 
+extern char __head_end[];
+
 #ifdef __powerpc64__
 
 extern char __start_interrupts[];
index a69c276dbb9cfce651503c39740267f37f1d0333..fa3cfd90c83afae26ff98dac660c961cd7303c72 100644 (file)
@@ -35,6 +35,7 @@
 #include <asm/code-patching.h>
 #include <asm/cacheflush.h>
 #include <asm/sstep.h>
+#include <asm/sections.h>
 #include <linux/uaccess.h>
 
 DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL;
@@ -42,6 +43,14 @@ DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
 
 struct kretprobe_blackpoint kretprobe_blacklist[] = {{NULL, NULL}};
 
+bool arch_within_kprobe_blacklist(unsigned long addr)
+{
+       return  (addr >= (unsigned long)__kprobes_text_start &&
+                addr < (unsigned long)__kprobes_text_end) ||
+               (addr >= (unsigned long)_stext &&
+                addr < (unsigned long)__head_end);
+}
+
 int arch_prepare_kprobe(struct kprobe *p)
 {
        int ret = 0;
index 7394b770ae1f6b2402ef2b04fe23e92eae2c7ee2..f6eee507e0b9b4ba096e84948a0688e18ca9d55e 100644 (file)
@@ -77,6 +77,8 @@ SECTIONS
 #endif
        } :kernel
 
+       __head_end = .;
+
        /*
         * If the build dies here, it's likely code in head_64.S is referencing
         * labels it can't reach, and the linker inserting stubs without the