powerpc/kernel: Use kprobe blacklist for asm functions
authorNicholas Piggin <npiggin@gmail.com>
Fri, 16 Sep 2016 10:48:17 +0000 (20:48 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 19 Sep 2016 00:53:55 +0000 (10:53 +1000)
Rather than forcing the whole function into the ".kprobes.text" section,
just add the symbol's address to the kprobe blacklist.

This also lets us drop the three versions of the_KPROBE macro, in
exchange for just one version of _ASM_NOKPROBE_SYMBOL - which is a good
cleanup.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/ppc_asm.h
arch/powerpc/kernel/misc_32.S
arch/powerpc/kernel/misc_64.S

index d5d5b5e348f22c68dc4d88d3b9fcb0eb6e987229..cd39ac127786fd18e83177f940f854ccac7d35d3 100644 (file)
@@ -217,13 +217,6 @@ name: \
        addi r2,r2,(.TOC.-0b)@l; \
        .localentry name,.-name
 
-#define _KPROBE(name) \
-       .section ".kprobes.text","a"; \
-       .align 2 ; \
-       .type name,@function; \
-       .globl name; \
-name:
-
 #define DOTSYM(a)      a
 
 #else
@@ -247,20 +240,6 @@ GLUE(.,name):
 
 #define _GLOBAL_TOC(name) _GLOBAL(name)
 
-#define _KPROBE(name) \
-       .section ".kprobes.text","a"; \
-       .align 2 ; \
-       .globl name; \
-       .globl GLUE(.,name); \
-       .section ".opd","aw"; \
-name: \
-       .quad GLUE(.,name); \
-       .quad .TOC.@tocbase; \
-       .quad 0; \
-       .previous; \
-       .type GLUE(.,name),@function; \
-GLUE(.,name):
-
 #define DOTSYM(a)      GLUE(.,a)
 
 #endif
@@ -279,13 +258,22 @@ n:
 
 #define _GLOBAL_TOC(name) _GLOBAL(name)
 
-#define _KPROBE(n)     \
-       .section ".kprobes.text","a";   \
-       .globl  n;      \
-n:
-
 #endif
 
+/*
+ * __kprobes (the C annotation) puts the symbol into the .kprobes.text
+ * section, which gets emitted at the end of regular text.
+ *
+ * _ASM_NOKPROBE_SYMBOL and NOKPROBE_SYMBOL just adds the symbol to
+ * a blacklist. The former is for core kprobe functions/data, the
+ * latter is for those that incdentially must be excluded from probing
+ * and allows them to be linked at more optimal location within text.
+ */
+#define _ASM_NOKPROBE_SYMBOL(entry)                    \
+       .pushsection "_kprobe_blacklist","aw";          \
+       PPC_LONG (entry) ;                              \
+       .popsection
+
 #define FUNC_START(name)       _GLOBAL(name)
 #define FUNC_END(name)
 
index d9c912b6e632563a8a9865f63e195cd46b15dc06..03756ffdcd71063dd028d7d3825d89d70e47990c 100644 (file)
@@ -328,7 +328,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_UNIFIED_ID_CACHE)
  *
  * flush_icache_range(unsigned long start, unsigned long stop)
  */
-_KPROBE(flush_icache_range)
+_GLOBAL(flush_icache_range)
 BEGIN_FTR_SECTION
        PURGE_PREFETCHED_INS
        blr                             /* for 601, do nothing */
@@ -358,6 +358,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE)
        sync                            /* additional sync needed on g4 */
        isync
        blr
+_ASM_NOKPROBE_SYMBOL(flush_icache_range)
+
 /*
  * Flush a particular page from the data cache to RAM.
  * Note: this is necessary because the instruction cache does *not*
index cb195157b318e1fba91b045bf1f5697a3b8ebf40..5d7e583f1588c14d76944e0905436c8b70eaa343 100644 (file)
@@ -66,7 +66,7 @@ PPC64_CACHES:
  *   flush all bytes from start through stop-1 inclusive
  */
 
-_KPROBE(flush_icache_range)
+_GLOBAL(flush_icache_range)
 BEGIN_FTR_SECTION
        PURGE_PREFETCHED_INS
        blr
@@ -109,7 +109,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE)
        bdnz    2b
        isync
        blr
-       .previous .text
+_ASM_NOKPROBE_SYMBOL(flush_icache_range)
+
 /*
  * Like above, but only do the D-cache.
  *