linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] kprobes: move kprobe declarations to asm-generic/kprobes.h
@ 2017-01-18 17:48 Luis R. Rodriguez
  2017-01-19  1:38 ` Masami Hiramatsu
  0 siblings, 1 reply; 6+ messages in thread
From: Luis R. Rodriguez @ 2017-01-18 17:48 UTC (permalink / raw)
  To: arnd, mhiramat, ananth, anil.s.keshavamurthy, davem, mingo, tglx,
	hpa, luto, rostedt
  Cc: bp, bp, will.deacon, linux, dhowells, benh, ralf, jpoimboe,
	linux-arch, linux-kernel, Luis R. Rodriguez

Often all is needed is these small helpers, instead of compiler.h
or a full kprobes.h. This is important for asm helpers, in fact even
some asm/kprobes.h make use of these helpers... instead just keep a
generic asm file with helpers useful for asm code with the least amount
of clutter as possible.

Likewise we need now to also address what to do about this file for both
when architectures have CONFIG_HAVE_KPROBES, and when they do not. Then
for when architectures have CONFIG_HAVE_KPROBES but have disabled
CONFIG_KPROBES.

Right now most asm/kprobes.h do not have guards against CONFIG_KPROBES,
this means most architecture code cannot include asm/kprobes.h safely.
Correct this and add guards for architectures missing them. Additionally
provide architectures that not have kprobes support with the default
asm-generic solution. This lets us force asm/kprobes.h on the header
include/linux/kprobes.h always, but most importantly we can now safely
include just asm/kprobes.h on architecture code without bringing
the full kitchen sink of header files.

Two architectures already provided a guard against CONFIG_KPROBES on
its kprobes.h: sh, arch. The rest of the architectures needed gaurds
added. We avoid including any not-needed headers on asm/kprobes.h
unless kprobes have been enabled.

In a subsequent atomic change we can try now to remove compiler.h from
include/linux/kprobes.h.

During this sweep I've also identified a few architectures defining
a common macro needed for both kprobes and ftrace, that of the
definition of the breakput instruction up. Some refer to this as
BREAKPOINT_INSTRUCTION. This must be kept outside of the #ifdef
CONFIG_KPROBES guard.

v5:

o fix BREAKPOINT_INSTRUCTION dependency with kernel architecture
  ftrace implementations:  Although its correct to #ifdef CONFIG_KPROBES
  on the architecture arch/$(ARCH)/include/asm/kprobes.h when
  architectures support ftrace they will rely on the
  BREAKPOINT_INSTRUCTION definition, this needs to be kept out from
  CONFIG_KPROBES as ftrace can be enabled without kprobes. This
  fixes compilation on x86 where kprobes is disabled but ftrace is
  left enabled.

o include <asm/kprobes.h> on arch/arm64/kernel/probes/decode-insn.h

Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org>
---

This was part of the linker table series [0], but I'm going to split up
patches further there. This is an atomic change which is independent
so sending this separately now.

[0] https://lkml.kernel.org/r/20170115211057.17167-1-mcgrof@kernel.org

 MAINTAINERS                            |  1 +
 arch/alpha/include/asm/Kbuild          |  1 +
 arch/arc/include/asm/kprobes.h         |  6 ++++--
 arch/arm/include/asm/kprobes.h         |  4 ++++
 arch/arm/probes/decode.h               |  1 +
 arch/arm64/include/asm/kprobes.h       |  4 ++++
 arch/arm64/kernel/insn.c               |  1 +
 arch/arm64/kernel/probes/decode-insn.h |  2 ++
 arch/avr32/include/asm/kprobes.h       |  7 ++++++-
 arch/blackfin/include/asm/Kbuild       |  1 +
 arch/c6x/include/asm/Kbuild            |  1 +
 arch/cris/include/asm/Kbuild           |  1 +
 arch/frv/include/asm/Kbuild            |  1 +
 arch/h8300/include/asm/Kbuild          |  1 +
 arch/hexagon/include/asm/Kbuild        |  1 +
 arch/ia64/include/asm/kprobes.h        | 12 +++++++++---
 arch/m32r/include/asm/Kbuild           |  1 +
 arch/m68k/include/asm/Kbuild           |  1 +
 arch/metag/include/asm/Kbuild          |  1 +
 arch/microblaze/include/asm/Kbuild     |  1 +
 arch/mips/include/asm/kprobes.h        |  6 +++++-
 arch/mn10300/include/asm/kprobes.h     |  7 ++++++-
 arch/nios2/include/asm/Kbuild          |  1 +
 arch/openrisc/include/asm/Kbuild       |  1 +
 arch/parisc/include/asm/Kbuild         |  1 +
 arch/powerpc/include/asm/kprobes.h     |  3 +++
 arch/s390/include/asm/kprobes.h        |  7 ++++++-
 arch/score/include/asm/Kbuild          |  1 +
 arch/sh/include/asm/kprobes.h          |  5 ++++-
 arch/sparc/include/asm/kprobes.h       | 10 ++++++++--
 arch/tile/include/asm/kprobes.h        |  6 +++++-
 arch/um/include/asm/Kbuild             |  1 +
 arch/unicore32/include/asm/Kbuild      |  1 +
 arch/x86/include/asm/kprobes.h         |  9 ++++++++-
 arch/xtensa/include/asm/Kbuild         |  1 +
 include/asm-generic/kprobes.h          | 25 +++++++++++++++++++++++++
 include/linux/compiler.h               |  8 --------
 include/linux/kprobes.h                | 19 +++----------------
 38 files changed, 123 insertions(+), 38 deletions(-)
 create mode 100644 include/asm-generic/kprobes.h

diff --git a/MAINTAINERS b/MAINTAINERS
index f65eee7fa136..9d9ee0cf7363 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -7251,6 +7251,7 @@ M:	Masami Hiramatsu <mhiramat@kernel.org>
 S:	Maintained
 F:	Documentation/kprobes.txt
 F:	include/linux/kprobes.h
+F:	include/asm-generic/kprobes.h
 F:	kernel/kprobes.c
 
 KS0108 LCD CONTROLLER DRIVER
diff --git a/arch/alpha/include/asm/Kbuild b/arch/alpha/include/asm/Kbuild
index f3bdc31d3c97..54d388fd026f 100644
--- a/arch/alpha/include/asm/Kbuild
+++ b/arch/alpha/include/asm/Kbuild
@@ -13,3 +13,4 @@ generic-y += trace_clock.h
 generic-y += section-core.h
 generic-y += ranges.h
 generic-y += tables.h
+generic-y += kprobes.h
diff --git a/arch/arc/include/asm/kprobes.h b/arch/arc/include/asm/kprobes.h
index 944dbedb38b5..00bdbe167615 100644
--- a/arch/arc/include/asm/kprobes.h
+++ b/arch/arc/include/asm/kprobes.h
@@ -9,6 +9,8 @@
 #ifndef _ARC_KPROBES_H
 #define _ARC_KPROBES_H
 
+#include <asm-generic/kprobes.h>
+
 #ifdef CONFIG_KPROBES
 
 typedef u16 kprobe_opcode_t;
@@ -55,6 +57,6 @@ void trap_is_kprobe(unsigned long address, struct pt_regs *regs);
 static void trap_is_kprobe(unsigned long address, struct pt_regs *regs)
 {
 }
-#endif
+#endif /* CONFIG_KPROBES */
 
-#endif
+#endif /* _ARC_KPROBES_H */
diff --git a/arch/arm/include/asm/kprobes.h b/arch/arm/include/asm/kprobes.h
index 3ea9be559726..59655459da59 100644
--- a/arch/arm/include/asm/kprobes.h
+++ b/arch/arm/include/asm/kprobes.h
@@ -16,6 +16,9 @@
 #ifndef _ARM_KPROBES_H
 #define _ARM_KPROBES_H
 
+#include <asm-generic/kprobes.h>
+
+#ifdef CONFIG_KPROBES
 #include <linux/types.h>
 #include <linux/ptrace.h>
 #include <linux/notifier.h>
@@ -83,4 +86,5 @@ struct arch_optimized_insn {
 	 */
 };
 
+#endif /* CONFIG_KPROBES */
 #endif /* _ARM_KPROBES_H */
diff --git a/arch/arm/probes/decode.h b/arch/arm/probes/decode.h
index f9b08ba7fe73..548d622a3159 100644
--- a/arch/arm/probes/decode.h
+++ b/arch/arm/probes/decode.h
@@ -22,6 +22,7 @@
 #include <linux/types.h>
 #include <linux/stddef.h>
 #include <asm/probes.h>
+#include <asm/kprobes.h>
 
 void __init arm_probes_decode_init(void);
 
diff --git a/arch/arm64/include/asm/kprobes.h b/arch/arm64/include/asm/kprobes.h
index 1737aecfcc5e..6deb8d726041 100644
--- a/arch/arm64/include/asm/kprobes.h
+++ b/arch/arm64/include/asm/kprobes.h
@@ -16,6 +16,9 @@
 #ifndef _ARM_KPROBES_H
 #define _ARM_KPROBES_H
 
+#include <asm-generic/kprobes.h>
+
+#ifdef CONFIG_KPROBES
 #include <linux/types.h>
 #include <linux/ptrace.h>
 #include <linux/percpu.h>
@@ -57,4 +60,5 @@ int kprobe_single_step_handler(struct pt_regs *regs, unsigned int esr);
 void kretprobe_trampoline(void);
 void __kprobes *trampoline_probe_handler(struct pt_regs *regs);
 
+#endif /* CONFIG_KPROBES */
 #endif /* _ARM_KPROBES_H */
diff --git a/arch/arm64/kernel/insn.c b/arch/arm64/kernel/insn.c
index 022d4a9d1738..4e02fd369bf9 100644
--- a/arch/arm64/kernel/insn.c
+++ b/arch/arm64/kernel/insn.c
@@ -31,6 +31,7 @@
 #include <asm/debug-monitors.h>
 #include <asm/fixmap.h>
 #include <asm/insn.h>
+#include <asm/kprobes.h>
 
 #define AARCH64_INSN_SF_BIT	BIT(31)
 #define AARCH64_INSN_N_BIT	BIT(22)
diff --git a/arch/arm64/kernel/probes/decode-insn.h b/arch/arm64/kernel/probes/decode-insn.h
index 76d3f315407f..192ab007bacb 100644
--- a/arch/arm64/kernel/probes/decode-insn.h
+++ b/arch/arm64/kernel/probes/decode-insn.h
@@ -16,6 +16,8 @@
 #ifndef _ARM_KERNEL_KPROBES_ARM64_H
 #define _ARM_KERNEL_KPROBES_ARM64_H
 
+#include <asm/kprobes.h>
+
 /*
  * ARM strongly recommends a limit of 128 bytes between LoadExcl and
  * StoreExcl instructions in a single thread of execution. So keep the
diff --git a/arch/avr32/include/asm/kprobes.h b/arch/avr32/include/asm/kprobes.h
index 45f563ed73fd..28dfc61ad384 100644
--- a/arch/avr32/include/asm/kprobes.h
+++ b/arch/avr32/include/asm/kprobes.h
@@ -11,10 +11,14 @@
 #ifndef __ASM_AVR32_KPROBES_H
 #define __ASM_AVR32_KPROBES_H
 
+#include <asm-generic/kprobes.h>
+
+#define BREAKPOINT_INSTRUCTION	0xd673	/* breakpoint */
+
+#ifdef CONFIG_KPROBES
 #include <linux/types.h>
 
 typedef u16	kprobe_opcode_t;
-#define BREAKPOINT_INSTRUCTION	0xd673	/* breakpoint */
 #define MAX_INSN_SIZE		2
 #define MAX_STACK_SIZE		64	/* 32 would probably be OK */
 
@@ -46,4 +50,5 @@ extern int kprobe_exceptions_notify(struct notifier_block *self,
 
 #define flush_insn_slot(p)	do { } while (0)
 
+#endif /* CONFIG_KPROBES */
 #endif /* __ASM_AVR32_KPROBES_H */
diff --git a/arch/blackfin/include/asm/Kbuild b/arch/blackfin/include/asm/Kbuild
index 9115b215fc7e..52351d3fd36e 100644
--- a/arch/blackfin/include/asm/Kbuild
+++ b/arch/blackfin/include/asm/Kbuild
@@ -50,3 +50,4 @@ generic-y += xor.h
 generic-y += section-core.h
 generic-y += ranges.h
 generic-y += tables.h
+generic-y += kprobes.h
diff --git a/arch/c6x/include/asm/Kbuild b/arch/c6x/include/asm/Kbuild
index cede2a950fbf..c54f7cc1f63e 100644
--- a/arch/c6x/include/asm/Kbuild
+++ b/arch/c6x/include/asm/Kbuild
@@ -64,3 +64,4 @@ generic-y += word-at-a-time.h
 generic-y += xor.h
 generic-y += section-core.h
 generic-y += ranges.h
+generic-y += kprobes.h
diff --git a/arch/cris/include/asm/Kbuild b/arch/cris/include/asm/Kbuild
index 7062c1be7913..051d355feae3 100644
--- a/arch/cris/include/asm/Kbuild
+++ b/arch/cris/include/asm/Kbuild
@@ -48,3 +48,4 @@ generic-y += xor.h
 generic-y += section-core.h
 generic-y += ranges.h
 generic-y += tables.h
+generic-y += kprobes.h
diff --git a/arch/frv/include/asm/Kbuild b/arch/frv/include/asm/Kbuild
index 4a59cbda5091..b58b9fc49383 100644
--- a/arch/frv/include/asm/Kbuild
+++ b/arch/frv/include/asm/Kbuild
@@ -11,3 +11,4 @@ generic-y += word-at-a-time.h
 generic-y += section-core.h
 generic-y += ranges.h
 generic-y += tables.h
+generic-y += kprobes.h
diff --git a/arch/h8300/include/asm/Kbuild b/arch/h8300/include/asm/Kbuild
index d79968d93c12..cfca7de52b37 100644
--- a/arch/h8300/include/asm/Kbuild
+++ b/arch/h8300/include/asm/Kbuild
@@ -78,3 +78,4 @@ generic-y += xor.h
 generic-y += section-core.h
 generic-y += ranges.h
 generic-y += tables.h
+generic-y += kprobes.h
diff --git a/arch/hexagon/include/asm/Kbuild b/arch/hexagon/include/asm/Kbuild
index d59ac1c1858b..d7cc35451f30 100644
--- a/arch/hexagon/include/asm/Kbuild
+++ b/arch/hexagon/include/asm/Kbuild
@@ -63,3 +63,4 @@ generic-y += xor.h
 generic-y += section-core.h
 generic-y += ranges.h
 generic-y += tables.h
+generic-y += kprobes.h
diff --git a/arch/ia64/include/asm/kprobes.h b/arch/ia64/include/asm/kprobes.h
index d5505d6f2382..0302b3664789 100644
--- a/arch/ia64/include/asm/kprobes.h
+++ b/arch/ia64/include/asm/kprobes.h
@@ -23,14 +23,19 @@
  * 2005-Apr     Rusty Lynch <rusty.lynch@intel.com> and Anil S Keshavamurthy
  *              <anil.s.keshavamurthy@intel.com> adapted from i386
  */
+#include <asm-generic/kprobes.h>
+#include <asm/break.h>
+
+#define BREAK_INST	(long)(__IA64_BREAK_KPROBE << 6)
+
+#ifdef CONFIG_KPROBES
+
 #include <linux/types.h>
 #include <linux/ptrace.h>
 #include <linux/percpu.h>
-#include <asm/break.h>
 
 #define __ARCH_WANT_KPROBES_INSN_SLOT
 #define MAX_INSN_SIZE   2	/* last half is for kprobe-booster */
-#define BREAK_INST	(long)(__IA64_BREAK_KPROBE << 6)
 #define NOP_M_INST	(long)(1<<27)
 #define BRL_INST(i1, i2) ((long)((0xcL << 37) |	/* brl */ \
 				(0x1L << 12) |	/* many */ \
@@ -124,4 +129,5 @@ extern void invalidate_stacked_regs(void);
 extern void flush_register_stack(void);
 extern void arch_remove_kprobe(struct kprobe *p);
 
-#endif				/* _ASM_KPROBES_H */
+#endif /* CONFIG_KPROBES */
+#endif /* _ASM_KPROBES_H */
diff --git a/arch/m32r/include/asm/Kbuild b/arch/m32r/include/asm/Kbuild
index f3f1e51dd5be..60024b49b6bb 100644
--- a/arch/m32r/include/asm/Kbuild
+++ b/arch/m32r/include/asm/Kbuild
@@ -15,3 +15,4 @@ generic-y += word-at-a-time.h
 generic-y += section-core.h
 generic-y += ranges.h
 generic-y += tables.h
+generic-y += kprobes.h
diff --git a/arch/m68k/include/asm/Kbuild b/arch/m68k/include/asm/Kbuild
index c28bcdecc764..412dd23ab946 100644
--- a/arch/m68k/include/asm/Kbuild
+++ b/arch/m68k/include/asm/Kbuild
@@ -37,3 +37,4 @@ generic-y += xor.h
 generic-y += section-core.h
 generic-y += ranges.h
 generic-y += tables.h
+generic-y += kprobes.h
diff --git a/arch/metag/include/asm/Kbuild b/arch/metag/include/asm/Kbuild
index c836f7e2a5e7..8371cc9b1b3c 100644
--- a/arch/metag/include/asm/Kbuild
+++ b/arch/metag/include/asm/Kbuild
@@ -58,3 +58,4 @@ generic-y += xor.h
 generic-y += section-core.h
 generic-y += ranges.h
 generic-y += tables.h
+generic-y += kprobes.h
diff --git a/arch/microblaze/include/asm/Kbuild b/arch/microblaze/include/asm/Kbuild
index 01afb1b420f5..865ce3d96443 100644
--- a/arch/microblaze/include/asm/Kbuild
+++ b/arch/microblaze/include/asm/Kbuild
@@ -14,3 +14,4 @@ generic-y += word-at-a-time.h
 generic-y += section-core.h
 generic-y += ranges.h
 generic-y += tables.h
+generic-y += kprobes.h
diff --git a/arch/mips/include/asm/kprobes.h b/arch/mips/include/asm/kprobes.h
index daba1f9a4f79..291846d9ba83 100644
--- a/arch/mips/include/asm/kprobes.h
+++ b/arch/mips/include/asm/kprobes.h
@@ -22,6 +22,9 @@
 #ifndef _ASM_KPROBES_H
 #define _ASM_KPROBES_H
 
+#include <asm-generic/kprobes.h>
+
+#ifdef CONFIG_KPROBES
 #include <linux/ptrace.h>
 #include <linux/types.h>
 
@@ -94,4 +97,5 @@ struct kprobe_ctlblk {
 extern int kprobe_exceptions_notify(struct notifier_block *self,
 				    unsigned long val, void *data);
 
-#endif				/* _ASM_KPROBES_H */
+#endif /* CONFIG_KPROBES */
+#endif /* _ASM_KPROBES_H */
diff --git a/arch/mn10300/include/asm/kprobes.h b/arch/mn10300/include/asm/kprobes.h
index c800b590183a..7abea0bdb549 100644
--- a/arch/mn10300/include/asm/kprobes.h
+++ b/arch/mn10300/include/asm/kprobes.h
@@ -21,13 +21,17 @@
 #ifndef _ASM_KPROBES_H
 #define _ASM_KPROBES_H
 
+#include <asm-generic/kprobes.h>
+
+#define BREAKPOINT_INSTRUCTION	0xff
+
+#ifdef CONFIG_KPROBES
 #include <linux/types.h>
 #include <linux/ptrace.h>
 
 struct kprobe;
 
 typedef unsigned char kprobe_opcode_t;
-#define BREAKPOINT_INSTRUCTION	0xff
 #define MAX_INSN_SIZE 8
 #define MAX_STACK_SIZE 128
 
@@ -47,4 +51,5 @@ extern int kprobe_exceptions_notify(struct notifier_block *self,
 
 extern void arch_remove_kprobe(struct kprobe *p);
 
+#endif /* CONFIG_KPROBES */
 #endif /* _ASM_KPROBES_H */
diff --git a/arch/nios2/include/asm/Kbuild b/arch/nios2/include/asm/Kbuild
index ee6220dac1e8..d6ce7edee7e0 100644
--- a/arch/nios2/include/asm/Kbuild
+++ b/arch/nios2/include/asm/Kbuild
@@ -66,3 +66,4 @@ generic-y += xor.h
 generic-y += section-core.h
 generic-y += ranges.h
 generic-y += tables.h
+generic-y += kprobes.h
diff --git a/arch/openrisc/include/asm/Kbuild b/arch/openrisc/include/asm/Kbuild
index ceafe458e295..1bf89a67317c 100644
--- a/arch/openrisc/include/asm/Kbuild
+++ b/arch/openrisc/include/asm/Kbuild
@@ -74,3 +74,4 @@ generic-y += xor.h
 generic-y += section-core.h
 generic-y += ranges.h
 generic-y += tables.h
+generic-y += kprobes.h
diff --git a/arch/parisc/include/asm/Kbuild b/arch/parisc/include/asm/Kbuild
index aaae8a9f6099..19d5b7e12ecf 100644
--- a/arch/parisc/include/asm/Kbuild
+++ b/arch/parisc/include/asm/Kbuild
@@ -31,3 +31,4 @@ generic-y += xor.h
 generic-y += section-core.h
 generic-y += ranges.h
 generic-y += tables.h
+generic-y += kprobes.h
diff --git a/arch/powerpc/include/asm/kprobes.h b/arch/powerpc/include/asm/kprobes.h
index 97b8c1f83453..c7ee3fcbd6e2 100644
--- a/arch/powerpc/include/asm/kprobes.h
+++ b/arch/powerpc/include/asm/kprobes.h
@@ -1,5 +1,8 @@
 #ifndef _ASM_POWERPC_KPROBES_H
 #define _ASM_POWERPC_KPROBES_H
+
+#include <asm-generic/kprobes.h>
+
 #ifdef __KERNEL__
 /*
  *  Kernel Probes (KProbes)
diff --git a/arch/s390/include/asm/kprobes.h b/arch/s390/include/asm/kprobes.h
index 591e5a5279b0..84c0f9086483 100644
--- a/arch/s390/include/asm/kprobes.h
+++ b/arch/s390/include/asm/kprobes.h
@@ -27,6 +27,11 @@
  * 2005-Dec	Used as a template for s390 by Mike Grundy
  *		<grundym@us.ibm.com>
  */
+#include <asm-generic/kprobes.h>
+
+#define BREAKPOINT_INSTRUCTION	0x0002
+
+#ifdef CONFIG_KPROBES
 #include <linux/types.h>
 #include <linux/ptrace.h>
 #include <linux/percpu.h>
@@ -37,7 +42,6 @@ struct pt_regs;
 struct kprobe;
 
 typedef u16 kprobe_opcode_t;
-#define BREAKPOINT_INSTRUCTION	0x0002
 
 /* Maximum instruction size is 3 (16bit) halfwords: */
 #define MAX_INSN_SIZE		0x0003
@@ -91,4 +95,5 @@ int probe_is_insn_relative_long(u16 *insn);
 
 #define flush_insn_slot(p)	do { } while (0)
 
+#endif /* CONFIG_KPROBES */
 #endif	/* _ASM_S390_KPROBES_H */
diff --git a/arch/score/include/asm/Kbuild b/arch/score/include/asm/Kbuild
index 16ea15a3e432..6ac8a7f5c768 100644
--- a/arch/score/include/asm/Kbuild
+++ b/arch/score/include/asm/Kbuild
@@ -17,3 +17,4 @@ generic-y += word-at-a-time.h
 generic-y += section-core.h
 generic-y += ranges.h
 generic-y += tables.h
+generic-y += kprobes.h
diff --git a/arch/sh/include/asm/kprobes.h b/arch/sh/include/asm/kprobes.h
index 134f3980e44a..f0986f9b3844 100644
--- a/arch/sh/include/asm/kprobes.h
+++ b/arch/sh/include/asm/kprobes.h
@@ -1,13 +1,16 @@
 #ifndef __ASM_SH_KPROBES_H
 #define __ASM_SH_KPROBES_H
 
+#include <asm-generic/kprobes.h>
+
+#define BREAKPOINT_INSTRUCTION	0xc33a
+
 #ifdef CONFIG_KPROBES
 
 #include <linux/types.h>
 #include <linux/ptrace.h>
 
 typedef insn_size_t kprobe_opcode_t;
-#define BREAKPOINT_INSTRUCTION	0xc33a
 
 #define MAX_INSN_SIZE 16
 #define MAX_STACK_SIZE 64
diff --git a/arch/sparc/include/asm/kprobes.h b/arch/sparc/include/asm/kprobes.h
index a145d798e112..49f8402035d7 100644
--- a/arch/sparc/include/asm/kprobes.h
+++ b/arch/sparc/include/asm/kprobes.h
@@ -1,13 +1,17 @@
 #ifndef _SPARC64_KPROBES_H
 #define _SPARC64_KPROBES_H
 
+#include <asm-generic/kprobes.h>
+
+#define BREAKPOINT_INSTRUCTION   0x91d02070 /* ta 0x70 */
+#define BREAKPOINT_INSTRUCTION_2 0x91d02071 /* ta 0x71 */
+
+#ifdef CONFIG_KPROBES
 #include <linux/types.h>
 #include <linux/percpu.h>
 
 typedef u32 kprobe_opcode_t;
 
-#define BREAKPOINT_INSTRUCTION   0x91d02070 /* ta 0x70 */
-#define BREAKPOINT_INSTRUCTION_2 0x91d02071 /* ta 0x71 */
 #define MAX_INSN_SIZE 2
 
 #define kretprobe_blacklist_size 0
@@ -48,4 +52,6 @@ int kprobe_exceptions_notify(struct notifier_block *self,
 int kprobe_fault_handler(struct pt_regs *regs, int trapnr);
 asmlinkage void __kprobes kprobe_trap(unsigned long trap_level,
 				      struct pt_regs *regs);
+
+#endif /* CONFIG_KPROBES */
 #endif /* _SPARC64_KPROBES_H */
diff --git a/arch/tile/include/asm/kprobes.h b/arch/tile/include/asm/kprobes.h
index d8f9a83943b1..4a8b1cadca24 100644
--- a/arch/tile/include/asm/kprobes.h
+++ b/arch/tile/include/asm/kprobes.h
@@ -17,10 +17,13 @@
 #ifndef _ASM_TILE_KPROBES_H
 #define _ASM_TILE_KPROBES_H
 
+#include <asm-generic/kprobes.h>
+
+#ifdef CONFIG_KPROBES
+
 #include <linux/types.h>
 #include <linux/ptrace.h>
 #include <linux/percpu.h>
-
 #include <arch/opcode.h>
 
 #define __ARCH_WANT_KPROBES_INSN_SLOT
@@ -76,4 +79,5 @@ void arch_remove_kprobe(struct kprobe *);
 extern int kprobe_exceptions_notify(struct notifier_block *self,
 			     unsigned long val, void *data);
 
+#endif /* CONFIG_KPROBES */
 #endif /* _ASM_TILE_KPROBES_H */
diff --git a/arch/um/include/asm/Kbuild b/arch/um/include/asm/Kbuild
index d2867aa09e23..ccc5ffeaeef5 100644
--- a/arch/um/include/asm/Kbuild
+++ b/arch/um/include/asm/Kbuild
@@ -29,3 +29,4 @@ generic-y += xor.h
 generic-y += section-core.h
 generic-y += ranges.h
 generic-y += tables.h
+generic-y += kprobes.h
diff --git a/arch/unicore32/include/asm/Kbuild b/arch/unicore32/include/asm/Kbuild
index 6671a1f08ead..5aacafb6d385 100644
--- a/arch/unicore32/include/asm/Kbuild
+++ b/arch/unicore32/include/asm/Kbuild
@@ -63,3 +63,4 @@ generic-y += word-at-a-time.h
 generic-y += xor.h
 generic-y += ranges.h
 generic-y += tables.h
+generic-y += kprobes.h
diff --git a/arch/x86/include/asm/kprobes.h b/arch/x86/include/asm/kprobes.h
index d1d1e5094c28..200581691c6e 100644
--- a/arch/x86/include/asm/kprobes.h
+++ b/arch/x86/include/asm/kprobes.h
@@ -21,6 +21,12 @@
  *
  * See arch/x86/kernel/kprobes.c for x86 kprobes history.
  */
+
+#include <asm-generic/kprobes.h>
+
+#define BREAKPOINT_INSTRUCTION	0xcc
+
+#ifdef CONFIG_KPROBES
 #include <linux/types.h>
 #include <linux/ptrace.h>
 #include <linux/percpu.h>
@@ -32,7 +38,6 @@ struct pt_regs;
 struct kprobe;
 
 typedef u8 kprobe_opcode_t;
-#define BREAKPOINT_INSTRUCTION	0xcc
 #define RELATIVEJUMP_OPCODE 0xe9
 #define RELATIVEJUMP_SIZE 5
 #define RELATIVECALL_OPCODE 0xe8
@@ -116,4 +121,6 @@ extern int kprobe_exceptions_notify(struct notifier_block *self,
 				    unsigned long val, void *data);
 extern int kprobe_int3_handler(struct pt_regs *regs);
 extern int kprobe_debug_handler(struct pt_regs *regs);
+
+#endif /* CONFIG_KPROBES */
 #endif /* _ASM_X86_KPROBES_H */
diff --git a/arch/xtensa/include/asm/Kbuild b/arch/xtensa/include/asm/Kbuild
index 7b41f32a2ba0..20f524ded00e 100644
--- a/arch/xtensa/include/asm/Kbuild
+++ b/arch/xtensa/include/asm/Kbuild
@@ -35,3 +35,4 @@ generic-y += xor.h
 generic-y += section-core.h
 generic-y += ranges.h
 generic-y += tables.h
+generic-y += kprobes.h
diff --git a/include/asm-generic/kprobes.h b/include/asm-generic/kprobes.h
new file mode 100644
index 000000000000..57af9f21d148
--- /dev/null
+++ b/include/asm-generic/kprobes.h
@@ -0,0 +1,25 @@
+#ifndef _ASM_GENERIC_KPROBES_H
+#define _ASM_GENERIC_KPROBES_H
+
+#if defined(__KERNEL__) && !defined(__ASSEMBLY__)
+#ifdef CONFIG_KPROBES
+/*
+ * Blacklist ganerating macro. Specify functions which is not probed
+ * by using this macro.
+ */
+# define __NOKPROBE_SYMBOL(fname)				\
+static unsigned long __used					\
+	__attribute__((__section__("_kprobe_blacklist")))	\
+	_kbl_addr_##fname = (unsigned long)fname;
+# define NOKPROBE_SYMBOL(fname)	__NOKPROBE_SYMBOL(fname)
+/* Use this to forbid a kprobes attach on very low level functions */
+# define __kprobes	__attribute__((__section__(".kprobes.text")))
+# define nokprobe_inline	__always_inline
+#else
+# define NOKPROBE_SYMBOL(fname)
+# define __kprobes
+# define nokprobe_inline	inline
+#endif
+#endif /* defined(__KERNEL__) && !defined(__ASSEMBLY__) */
+
+#endif /* _ASM_GENERIC_KPROBES_H */
diff --git a/include/linux/compiler.h b/include/linux/compiler.h
index 91c30cba984e..b2eb9c0a68c4 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -570,12 +570,4 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s
 	(_________p1); \
 })
 
-/* Ignore/forbid kprobes attach on very low level functions marked by this attribute: */
-#ifdef CONFIG_KPROBES
-# define __kprobes	__attribute__((__section__(".kprobes.text")))
-# define nokprobe_inline	__always_inline
-#else
-# define __kprobes
-# define nokprobe_inline	inline
-#endif
 #endif /* __LINUX_COMPILER_H */
diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h
index 16ddfb8b304a..c328e4f7dcad 100644
--- a/include/linux/kprobes.h
+++ b/include/linux/kprobes.h
@@ -29,7 +29,7 @@
  *		<jkenisto@us.ibm.com>  and Prasanna S Panchamukhi
  *		<prasanna@in.ibm.com> added function-return probes.
  */
-#include <linux/compiler.h>	/* for __kprobes */
+#include <linux/compiler.h>
 #include <linux/linkage.h>
 #include <linux/list.h>
 #include <linux/notifier.h>
@@ -40,9 +40,9 @@
 #include <linux/rcupdate.h>
 #include <linux/mutex.h>
 #include <linux/ftrace.h>
+#include <asm/kprobes.h>
 
 #ifdef CONFIG_KPROBES
-#include <asm/kprobes.h>
 
 /* kprobe_status settings */
 #define KPROBE_HIT_ACTIVE	0x00000001
@@ -51,6 +51,7 @@
 #define KPROBE_HIT_SSDONE	0x00000008
 
 #else /* CONFIG_KPROBES */
+#include <asm-generic/kprobes.h>
 typedef int kprobe_opcode_t;
 struct arch_specific_insn {
 	int dummy;
@@ -509,18 +510,4 @@ static inline bool is_kprobe_optinsn_slot(unsigned long addr)
 }
 #endif
 
-#ifdef CONFIG_KPROBES
-/*
- * Blacklist ganerating macro. Specify functions which is not probed
- * by using this macro.
- */
-#define __NOKPROBE_SYMBOL(fname)			\
-static unsigned long __used				\
-	__attribute__((section("_kprobe_blacklist")))	\
-	_kbl_addr_##fname = (unsigned long)fname;
-#define NOKPROBE_SYMBOL(fname)	__NOKPROBE_SYMBOL(fname)
-#else
-#define NOKPROBE_SYMBOL(fname)
-#endif
-
 #endif /* _LINUX_KPROBES_H */
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] kprobes: move kprobe declarations to asm-generic/kprobes.h
  2017-01-18 17:48 [PATCH] kprobes: move kprobe declarations to asm-generic/kprobes.h Luis R. Rodriguez
@ 2017-01-19  1:38 ` Masami Hiramatsu
  2017-01-19  6:47   ` Masami Hiramatsu
  0 siblings, 1 reply; 6+ messages in thread
From: Masami Hiramatsu @ 2017-01-19  1:38 UTC (permalink / raw)
  To: Luis R. Rodriguez
  Cc: arnd, ananth, anil.s.keshavamurthy, davem, mingo, tglx, hpa,
	luto, rostedt, bp, bp, will.deacon, linux, dhowells, benh, ralf,
	jpoimboe, linux-arch, linux-kernel, Steven Rostedt

Hi Luis,

On Wed, 18 Jan 2017 09:48:40 -0800
"Luis R. Rodriguez" <mcgrof@kernel.org> wrote:

> Often all is needed is these small helpers, instead of compiler.h
> or a full kprobes.h. This is important for asm helpers, in fact even
> some asm/kprobes.h make use of these helpers... instead just keep a
> generic asm file with helpers useful for asm code with the least amount
> of clutter as possible.
> 
> Likewise we need now to also address what to do about this file for both
> when architectures have CONFIG_HAVE_KPROBES, and when they do not. Then
> for when architectures have CONFIG_HAVE_KPROBES but have disabled
> CONFIG_KPROBES.
> 
> Right now most asm/kprobes.h do not have guards against CONFIG_KPROBES,
> this means most architecture code cannot include asm/kprobes.h safely.

Just from curiosity, would you have any actual issue (like compile error)
about that?

> Correct this and add guards for architectures missing them. Additionally
> provide architectures that not have kprobes support with the default
> asm-generic solution. This lets us force asm/kprobes.h on the header
> include/linux/kprobes.h always, but most importantly we can now safely
> include just asm/kprobes.h on architecture code without bringing
> the full kitchen sink of header files.

It is fine to me to separate it into asm-generic/kprobes.h.

> Two architectures already provided a guard against CONFIG_KPROBES on
> its kprobes.h: sh, arch. The rest of the architectures needed gaurds
> added. We avoid including any not-needed headers on asm/kprobes.h
> unless kprobes have been enabled.
> 
> In a subsequent atomic change we can try now to remove compiler.h from
> include/linux/kprobes.h.

Nice :)

> 
> During this sweep I've also identified a few architectures defining
> a common macro needed for both kprobes and ftrace, that of the
> definition of the breakput instruction up. Some refer to this as
> BREAKPOINT_INSTRUCTION. This must be kept outside of the #ifdef
> CONFIG_KPROBES guard.

Hmm, since it depends on ftrace arch-depend implementation, I would
like to ask you to split this part into other patches for each arch,
with a build failure log.

Thank you,

> 
> v5:
> 
> o fix BREAKPOINT_INSTRUCTION dependency with kernel architecture
>   ftrace implementations:  Although its correct to #ifdef CONFIG_KPROBES
>   on the architecture arch/$(ARCH)/include/asm/kprobes.h when
>   architectures support ftrace they will rely on the
>   BREAKPOINT_INSTRUCTION definition, this needs to be kept out from
>   CONFIG_KPROBES as ftrace can be enabled without kprobes. This
>   fixes compilation on x86 where kprobes is disabled but ftrace is
>   left enabled.
> 
> o include <asm/kprobes.h> on arch/arm64/kernel/probes/decode-insn.h
> 
> Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org>
> ---
> 
> This was part of the linker table series [0], but I'm going to split up
> patches further there. This is an atomic change which is independent
> so sending this separately now.
> 
> [0] https://lkml.kernel.org/r/20170115211057.17167-1-mcgrof@kernel.org
> 
>  MAINTAINERS                            |  1 +
>  arch/alpha/include/asm/Kbuild          |  1 +
>  arch/arc/include/asm/kprobes.h         |  6 ++++--
>  arch/arm/include/asm/kprobes.h         |  4 ++++
>  arch/arm/probes/decode.h               |  1 +
>  arch/arm64/include/asm/kprobes.h       |  4 ++++
>  arch/arm64/kernel/insn.c               |  1 +
>  arch/arm64/kernel/probes/decode-insn.h |  2 ++
>  arch/avr32/include/asm/kprobes.h       |  7 ++++++-
>  arch/blackfin/include/asm/Kbuild       |  1 +
>  arch/c6x/include/asm/Kbuild            |  1 +
>  arch/cris/include/asm/Kbuild           |  1 +
>  arch/frv/include/asm/Kbuild            |  1 +
>  arch/h8300/include/asm/Kbuild          |  1 +
>  arch/hexagon/include/asm/Kbuild        |  1 +
>  arch/ia64/include/asm/kprobes.h        | 12 +++++++++---
>  arch/m32r/include/asm/Kbuild           |  1 +
>  arch/m68k/include/asm/Kbuild           |  1 +
>  arch/metag/include/asm/Kbuild          |  1 +
>  arch/microblaze/include/asm/Kbuild     |  1 +
>  arch/mips/include/asm/kprobes.h        |  6 +++++-
>  arch/mn10300/include/asm/kprobes.h     |  7 ++++++-
>  arch/nios2/include/asm/Kbuild          |  1 +
>  arch/openrisc/include/asm/Kbuild       |  1 +
>  arch/parisc/include/asm/Kbuild         |  1 +
>  arch/powerpc/include/asm/kprobes.h     |  3 +++
>  arch/s390/include/asm/kprobes.h        |  7 ++++++-
>  arch/score/include/asm/Kbuild          |  1 +
>  arch/sh/include/asm/kprobes.h          |  5 ++++-
>  arch/sparc/include/asm/kprobes.h       | 10 ++++++++--
>  arch/tile/include/asm/kprobes.h        |  6 +++++-
>  arch/um/include/asm/Kbuild             |  1 +
>  arch/unicore32/include/asm/Kbuild      |  1 +
>  arch/x86/include/asm/kprobes.h         |  9 ++++++++-
>  arch/xtensa/include/asm/Kbuild         |  1 +
>  include/asm-generic/kprobes.h          | 25 +++++++++++++++++++++++++
>  include/linux/compiler.h               |  8 --------
>  include/linux/kprobes.h                | 19 +++----------------
>  38 files changed, 123 insertions(+), 38 deletions(-)
>  create mode 100644 include/asm-generic/kprobes.h
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index f65eee7fa136..9d9ee0cf7363 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -7251,6 +7251,7 @@ M:	Masami Hiramatsu <mhiramat@kernel.org>
>  S:	Maintained
>  F:	Documentation/kprobes.txt
>  F:	include/linux/kprobes.h
> +F:	include/asm-generic/kprobes.h
>  F:	kernel/kprobes.c
>  
>  KS0108 LCD CONTROLLER DRIVER
> diff --git a/arch/alpha/include/asm/Kbuild b/arch/alpha/include/asm/Kbuild
> index f3bdc31d3c97..54d388fd026f 100644
> --- a/arch/alpha/include/asm/Kbuild
> +++ b/arch/alpha/include/asm/Kbuild
> @@ -13,3 +13,4 @@ generic-y += trace_clock.h
>  generic-y += section-core.h
>  generic-y += ranges.h
>  generic-y += tables.h
> +generic-y += kprobes.h
> diff --git a/arch/arc/include/asm/kprobes.h b/arch/arc/include/asm/kprobes.h
> index 944dbedb38b5..00bdbe167615 100644
> --- a/arch/arc/include/asm/kprobes.h
> +++ b/arch/arc/include/asm/kprobes.h
> @@ -9,6 +9,8 @@
>  #ifndef _ARC_KPROBES_H
>  #define _ARC_KPROBES_H
>  
> +#include <asm-generic/kprobes.h>
> +
>  #ifdef CONFIG_KPROBES
>  
>  typedef u16 kprobe_opcode_t;
> @@ -55,6 +57,6 @@ void trap_is_kprobe(unsigned long address, struct pt_regs *regs);
>  static void trap_is_kprobe(unsigned long address, struct pt_regs *regs)
>  {
>  }
> -#endif
> +#endif /* CONFIG_KPROBES */
>  
> -#endif
> +#endif /* _ARC_KPROBES_H */
> diff --git a/arch/arm/include/asm/kprobes.h b/arch/arm/include/asm/kprobes.h
> index 3ea9be559726..59655459da59 100644
> --- a/arch/arm/include/asm/kprobes.h
> +++ b/arch/arm/include/asm/kprobes.h
> @@ -16,6 +16,9 @@
>  #ifndef _ARM_KPROBES_H
>  #define _ARM_KPROBES_H
>  
> +#include <asm-generic/kprobes.h>
> +
> +#ifdef CONFIG_KPROBES
>  #include <linux/types.h>
>  #include <linux/ptrace.h>
>  #include <linux/notifier.h>
> @@ -83,4 +86,5 @@ struct arch_optimized_insn {
>  	 */
>  };
>  
> +#endif /* CONFIG_KPROBES */
>  #endif /* _ARM_KPROBES_H */
> diff --git a/arch/arm/probes/decode.h b/arch/arm/probes/decode.h
> index f9b08ba7fe73..548d622a3159 100644
> --- a/arch/arm/probes/decode.h
> +++ b/arch/arm/probes/decode.h
> @@ -22,6 +22,7 @@
>  #include <linux/types.h>
>  #include <linux/stddef.h>
>  #include <asm/probes.h>
> +#include <asm/kprobes.h>
>  
>  void __init arm_probes_decode_init(void);
>  
> diff --git a/arch/arm64/include/asm/kprobes.h b/arch/arm64/include/asm/kprobes.h
> index 1737aecfcc5e..6deb8d726041 100644
> --- a/arch/arm64/include/asm/kprobes.h
> +++ b/arch/arm64/include/asm/kprobes.h
> @@ -16,6 +16,9 @@
>  #ifndef _ARM_KPROBES_H
>  #define _ARM_KPROBES_H
>  
> +#include <asm-generic/kprobes.h>
> +
> +#ifdef CONFIG_KPROBES
>  #include <linux/types.h>
>  #include <linux/ptrace.h>
>  #include <linux/percpu.h>
> @@ -57,4 +60,5 @@ int kprobe_single_step_handler(struct pt_regs *regs, unsigned int esr);
>  void kretprobe_trampoline(void);
>  void __kprobes *trampoline_probe_handler(struct pt_regs *regs);
>  
> +#endif /* CONFIG_KPROBES */
>  #endif /* _ARM_KPROBES_H */
> diff --git a/arch/arm64/kernel/insn.c b/arch/arm64/kernel/insn.c
> index 022d4a9d1738..4e02fd369bf9 100644
> --- a/arch/arm64/kernel/insn.c
> +++ b/arch/arm64/kernel/insn.c
> @@ -31,6 +31,7 @@
>  #include <asm/debug-monitors.h>
>  #include <asm/fixmap.h>
>  #include <asm/insn.h>
> +#include <asm/kprobes.h>
>  
>  #define AARCH64_INSN_SF_BIT	BIT(31)
>  #define AARCH64_INSN_N_BIT	BIT(22)
> diff --git a/arch/arm64/kernel/probes/decode-insn.h b/arch/arm64/kernel/probes/decode-insn.h
> index 76d3f315407f..192ab007bacb 100644
> --- a/arch/arm64/kernel/probes/decode-insn.h
> +++ b/arch/arm64/kernel/probes/decode-insn.h
> @@ -16,6 +16,8 @@
>  #ifndef _ARM_KERNEL_KPROBES_ARM64_H
>  #define _ARM_KERNEL_KPROBES_ARM64_H
>  
> +#include <asm/kprobes.h>
> +
>  /*
>   * ARM strongly recommends a limit of 128 bytes between LoadExcl and
>   * StoreExcl instructions in a single thread of execution. So keep the
> diff --git a/arch/avr32/include/asm/kprobes.h b/arch/avr32/include/asm/kprobes.h
> index 45f563ed73fd..28dfc61ad384 100644
> --- a/arch/avr32/include/asm/kprobes.h
> +++ b/arch/avr32/include/asm/kprobes.h
> @@ -11,10 +11,14 @@
>  #ifndef __ASM_AVR32_KPROBES_H
>  #define __ASM_AVR32_KPROBES_H
>  
> +#include <asm-generic/kprobes.h>
> +
> +#define BREAKPOINT_INSTRUCTION	0xd673	/* breakpoint */
> +
> +#ifdef CONFIG_KPROBES
>  #include <linux/types.h>
>  
>  typedef u16	kprobe_opcode_t;
> -#define BREAKPOINT_INSTRUCTION	0xd673	/* breakpoint */
>  #define MAX_INSN_SIZE		2
>  #define MAX_STACK_SIZE		64	/* 32 would probably be OK */
>  
> @@ -46,4 +50,5 @@ extern int kprobe_exceptions_notify(struct notifier_block *self,
>  
>  #define flush_insn_slot(p)	do { } while (0)
>  
> +#endif /* CONFIG_KPROBES */
>  #endif /* __ASM_AVR32_KPROBES_H */
> diff --git a/arch/blackfin/include/asm/Kbuild b/arch/blackfin/include/asm/Kbuild
> index 9115b215fc7e..52351d3fd36e 100644
> --- a/arch/blackfin/include/asm/Kbuild
> +++ b/arch/blackfin/include/asm/Kbuild
> @@ -50,3 +50,4 @@ generic-y += xor.h
>  generic-y += section-core.h
>  generic-y += ranges.h
>  generic-y += tables.h
> +generic-y += kprobes.h
> diff --git a/arch/c6x/include/asm/Kbuild b/arch/c6x/include/asm/Kbuild
> index cede2a950fbf..c54f7cc1f63e 100644
> --- a/arch/c6x/include/asm/Kbuild
> +++ b/arch/c6x/include/asm/Kbuild
> @@ -64,3 +64,4 @@ generic-y += word-at-a-time.h
>  generic-y += xor.h
>  generic-y += section-core.h
>  generic-y += ranges.h
> +generic-y += kprobes.h
> diff --git a/arch/cris/include/asm/Kbuild b/arch/cris/include/asm/Kbuild
> index 7062c1be7913..051d355feae3 100644
> --- a/arch/cris/include/asm/Kbuild
> +++ b/arch/cris/include/asm/Kbuild
> @@ -48,3 +48,4 @@ generic-y += xor.h
>  generic-y += section-core.h
>  generic-y += ranges.h
>  generic-y += tables.h
> +generic-y += kprobes.h
> diff --git a/arch/frv/include/asm/Kbuild b/arch/frv/include/asm/Kbuild
> index 4a59cbda5091..b58b9fc49383 100644
> --- a/arch/frv/include/asm/Kbuild
> +++ b/arch/frv/include/asm/Kbuild
> @@ -11,3 +11,4 @@ generic-y += word-at-a-time.h
>  generic-y += section-core.h
>  generic-y += ranges.h
>  generic-y += tables.h
> +generic-y += kprobes.h
> diff --git a/arch/h8300/include/asm/Kbuild b/arch/h8300/include/asm/Kbuild
> index d79968d93c12..cfca7de52b37 100644
> --- a/arch/h8300/include/asm/Kbuild
> +++ b/arch/h8300/include/asm/Kbuild
> @@ -78,3 +78,4 @@ generic-y += xor.h
>  generic-y += section-core.h
>  generic-y += ranges.h
>  generic-y += tables.h
> +generic-y += kprobes.h
> diff --git a/arch/hexagon/include/asm/Kbuild b/arch/hexagon/include/asm/Kbuild
> index d59ac1c1858b..d7cc35451f30 100644
> --- a/arch/hexagon/include/asm/Kbuild
> +++ b/arch/hexagon/include/asm/Kbuild
> @@ -63,3 +63,4 @@ generic-y += xor.h
>  generic-y += section-core.h
>  generic-y += ranges.h
>  generic-y += tables.h
> +generic-y += kprobes.h
> diff --git a/arch/ia64/include/asm/kprobes.h b/arch/ia64/include/asm/kprobes.h
> index d5505d6f2382..0302b3664789 100644
> --- a/arch/ia64/include/asm/kprobes.h
> +++ b/arch/ia64/include/asm/kprobes.h
> @@ -23,14 +23,19 @@
>   * 2005-Apr     Rusty Lynch <rusty.lynch@intel.com> and Anil S Keshavamurthy
>   *              <anil.s.keshavamurthy@intel.com> adapted from i386
>   */
> +#include <asm-generic/kprobes.h>
> +#include <asm/break.h>
> +
> +#define BREAK_INST	(long)(__IA64_BREAK_KPROBE << 6)
> +
> +#ifdef CONFIG_KPROBES
> +
>  #include <linux/types.h>
>  #include <linux/ptrace.h>
>  #include <linux/percpu.h>
> -#include <asm/break.h>
>  
>  #define __ARCH_WANT_KPROBES_INSN_SLOT
>  #define MAX_INSN_SIZE   2	/* last half is for kprobe-booster */
> -#define BREAK_INST	(long)(__IA64_BREAK_KPROBE << 6)
>  #define NOP_M_INST	(long)(1<<27)
>  #define BRL_INST(i1, i2) ((long)((0xcL << 37) |	/* brl */ \
>  				(0x1L << 12) |	/* many */ \
> @@ -124,4 +129,5 @@ extern void invalidate_stacked_regs(void);
>  extern void flush_register_stack(void);
>  extern void arch_remove_kprobe(struct kprobe *p);
>  
> -#endif				/* _ASM_KPROBES_H */
> +#endif /* CONFIG_KPROBES */
> +#endif /* _ASM_KPROBES_H */
> diff --git a/arch/m32r/include/asm/Kbuild b/arch/m32r/include/asm/Kbuild
> index f3f1e51dd5be..60024b49b6bb 100644
> --- a/arch/m32r/include/asm/Kbuild
> +++ b/arch/m32r/include/asm/Kbuild
> @@ -15,3 +15,4 @@ generic-y += word-at-a-time.h
>  generic-y += section-core.h
>  generic-y += ranges.h
>  generic-y += tables.h
> +generic-y += kprobes.h
> diff --git a/arch/m68k/include/asm/Kbuild b/arch/m68k/include/asm/Kbuild
> index c28bcdecc764..412dd23ab946 100644
> --- a/arch/m68k/include/asm/Kbuild
> +++ b/arch/m68k/include/asm/Kbuild
> @@ -37,3 +37,4 @@ generic-y += xor.h
>  generic-y += section-core.h
>  generic-y += ranges.h
>  generic-y += tables.h
> +generic-y += kprobes.h
> diff --git a/arch/metag/include/asm/Kbuild b/arch/metag/include/asm/Kbuild
> index c836f7e2a5e7..8371cc9b1b3c 100644
> --- a/arch/metag/include/asm/Kbuild
> +++ b/arch/metag/include/asm/Kbuild
> @@ -58,3 +58,4 @@ generic-y += xor.h
>  generic-y += section-core.h
>  generic-y += ranges.h
>  generic-y += tables.h
> +generic-y += kprobes.h
> diff --git a/arch/microblaze/include/asm/Kbuild b/arch/microblaze/include/asm/Kbuild
> index 01afb1b420f5..865ce3d96443 100644
> --- a/arch/microblaze/include/asm/Kbuild
> +++ b/arch/microblaze/include/asm/Kbuild
> @@ -14,3 +14,4 @@ generic-y += word-at-a-time.h
>  generic-y += section-core.h
>  generic-y += ranges.h
>  generic-y += tables.h
> +generic-y += kprobes.h
> diff --git a/arch/mips/include/asm/kprobes.h b/arch/mips/include/asm/kprobes.h
> index daba1f9a4f79..291846d9ba83 100644
> --- a/arch/mips/include/asm/kprobes.h
> +++ b/arch/mips/include/asm/kprobes.h
> @@ -22,6 +22,9 @@
>  #ifndef _ASM_KPROBES_H
>  #define _ASM_KPROBES_H
>  
> +#include <asm-generic/kprobes.h>
> +
> +#ifdef CONFIG_KPROBES
>  #include <linux/ptrace.h>
>  #include <linux/types.h>
>  
> @@ -94,4 +97,5 @@ struct kprobe_ctlblk {
>  extern int kprobe_exceptions_notify(struct notifier_block *self,
>  				    unsigned long val, void *data);
>  
> -#endif				/* _ASM_KPROBES_H */
> +#endif /* CONFIG_KPROBES */
> +#endif /* _ASM_KPROBES_H */
> diff --git a/arch/mn10300/include/asm/kprobes.h b/arch/mn10300/include/asm/kprobes.h
> index c800b590183a..7abea0bdb549 100644
> --- a/arch/mn10300/include/asm/kprobes.h
> +++ b/arch/mn10300/include/asm/kprobes.h
> @@ -21,13 +21,17 @@
>  #ifndef _ASM_KPROBES_H
>  #define _ASM_KPROBES_H
>  
> +#include <asm-generic/kprobes.h>
> +
> +#define BREAKPOINT_INSTRUCTION	0xff
> +
> +#ifdef CONFIG_KPROBES
>  #include <linux/types.h>
>  #include <linux/ptrace.h>
>  
>  struct kprobe;
>  
>  typedef unsigned char kprobe_opcode_t;
> -#define BREAKPOINT_INSTRUCTION	0xff
>  #define MAX_INSN_SIZE 8
>  #define MAX_STACK_SIZE 128
>  
> @@ -47,4 +51,5 @@ extern int kprobe_exceptions_notify(struct notifier_block *self,
>  
>  extern void arch_remove_kprobe(struct kprobe *p);
>  
> +#endif /* CONFIG_KPROBES */
>  #endif /* _ASM_KPROBES_H */
> diff --git a/arch/nios2/include/asm/Kbuild b/arch/nios2/include/asm/Kbuild
> index ee6220dac1e8..d6ce7edee7e0 100644
> --- a/arch/nios2/include/asm/Kbuild
> +++ b/arch/nios2/include/asm/Kbuild
> @@ -66,3 +66,4 @@ generic-y += xor.h
>  generic-y += section-core.h
>  generic-y += ranges.h
>  generic-y += tables.h
> +generic-y += kprobes.h
> diff --git a/arch/openrisc/include/asm/Kbuild b/arch/openrisc/include/asm/Kbuild
> index ceafe458e295..1bf89a67317c 100644
> --- a/arch/openrisc/include/asm/Kbuild
> +++ b/arch/openrisc/include/asm/Kbuild
> @@ -74,3 +74,4 @@ generic-y += xor.h
>  generic-y += section-core.h
>  generic-y += ranges.h
>  generic-y += tables.h
> +generic-y += kprobes.h
> diff --git a/arch/parisc/include/asm/Kbuild b/arch/parisc/include/asm/Kbuild
> index aaae8a9f6099..19d5b7e12ecf 100644
> --- a/arch/parisc/include/asm/Kbuild
> +++ b/arch/parisc/include/asm/Kbuild
> @@ -31,3 +31,4 @@ generic-y += xor.h
>  generic-y += section-core.h
>  generic-y += ranges.h
>  generic-y += tables.h
> +generic-y += kprobes.h
> diff --git a/arch/powerpc/include/asm/kprobes.h b/arch/powerpc/include/asm/kprobes.h
> index 97b8c1f83453..c7ee3fcbd6e2 100644
> --- a/arch/powerpc/include/asm/kprobes.h
> +++ b/arch/powerpc/include/asm/kprobes.h
> @@ -1,5 +1,8 @@
>  #ifndef _ASM_POWERPC_KPROBES_H
>  #define _ASM_POWERPC_KPROBES_H
> +
> +#include <asm-generic/kprobes.h>
> +
>  #ifdef __KERNEL__
>  /*
>   *  Kernel Probes (KProbes)
> diff --git a/arch/s390/include/asm/kprobes.h b/arch/s390/include/asm/kprobes.h
> index 591e5a5279b0..84c0f9086483 100644
> --- a/arch/s390/include/asm/kprobes.h
> +++ b/arch/s390/include/asm/kprobes.h
> @@ -27,6 +27,11 @@
>   * 2005-Dec	Used as a template for s390 by Mike Grundy
>   *		<grundym@us.ibm.com>
>   */
> +#include <asm-generic/kprobes.h>
> +
> +#define BREAKPOINT_INSTRUCTION	0x0002
> +
> +#ifdef CONFIG_KPROBES
>  #include <linux/types.h>
>  #include <linux/ptrace.h>
>  #include <linux/percpu.h>
> @@ -37,7 +42,6 @@ struct pt_regs;
>  struct kprobe;
>  
>  typedef u16 kprobe_opcode_t;
> -#define BREAKPOINT_INSTRUCTION	0x0002
>  
>  /* Maximum instruction size is 3 (16bit) halfwords: */
>  #define MAX_INSN_SIZE		0x0003
> @@ -91,4 +95,5 @@ int probe_is_insn_relative_long(u16 *insn);
>  
>  #define flush_insn_slot(p)	do { } while (0)
>  
> +#endif /* CONFIG_KPROBES */
>  #endif	/* _ASM_S390_KPROBES_H */
> diff --git a/arch/score/include/asm/Kbuild b/arch/score/include/asm/Kbuild
> index 16ea15a3e432..6ac8a7f5c768 100644
> --- a/arch/score/include/asm/Kbuild
> +++ b/arch/score/include/asm/Kbuild
> @@ -17,3 +17,4 @@ generic-y += word-at-a-time.h
>  generic-y += section-core.h
>  generic-y += ranges.h
>  generic-y += tables.h
> +generic-y += kprobes.h
> diff --git a/arch/sh/include/asm/kprobes.h b/arch/sh/include/asm/kprobes.h
> index 134f3980e44a..f0986f9b3844 100644
> --- a/arch/sh/include/asm/kprobes.h
> +++ b/arch/sh/include/asm/kprobes.h
> @@ -1,13 +1,16 @@
>  #ifndef __ASM_SH_KPROBES_H
>  #define __ASM_SH_KPROBES_H
>  
> +#include <asm-generic/kprobes.h>
> +
> +#define BREAKPOINT_INSTRUCTION	0xc33a
> +
>  #ifdef CONFIG_KPROBES
>  
>  #include <linux/types.h>
>  #include <linux/ptrace.h>
>  
>  typedef insn_size_t kprobe_opcode_t;
> -#define BREAKPOINT_INSTRUCTION	0xc33a
>  
>  #define MAX_INSN_SIZE 16
>  #define MAX_STACK_SIZE 64
> diff --git a/arch/sparc/include/asm/kprobes.h b/arch/sparc/include/asm/kprobes.h
> index a145d798e112..49f8402035d7 100644
> --- a/arch/sparc/include/asm/kprobes.h
> +++ b/arch/sparc/include/asm/kprobes.h
> @@ -1,13 +1,17 @@
>  #ifndef _SPARC64_KPROBES_H
>  #define _SPARC64_KPROBES_H
>  
> +#include <asm-generic/kprobes.h>
> +
> +#define BREAKPOINT_INSTRUCTION   0x91d02070 /* ta 0x70 */
> +#define BREAKPOINT_INSTRUCTION_2 0x91d02071 /* ta 0x71 */
> +
> +#ifdef CONFIG_KPROBES
>  #include <linux/types.h>
>  #include <linux/percpu.h>
>  
>  typedef u32 kprobe_opcode_t;
>  
> -#define BREAKPOINT_INSTRUCTION   0x91d02070 /* ta 0x70 */
> -#define BREAKPOINT_INSTRUCTION_2 0x91d02071 /* ta 0x71 */
>  #define MAX_INSN_SIZE 2
>  
>  #define kretprobe_blacklist_size 0
> @@ -48,4 +52,6 @@ int kprobe_exceptions_notify(struct notifier_block *self,
>  int kprobe_fault_handler(struct pt_regs *regs, int trapnr);
>  asmlinkage void __kprobes kprobe_trap(unsigned long trap_level,
>  				      struct pt_regs *regs);
> +
> +#endif /* CONFIG_KPROBES */
>  #endif /* _SPARC64_KPROBES_H */
> diff --git a/arch/tile/include/asm/kprobes.h b/arch/tile/include/asm/kprobes.h
> index d8f9a83943b1..4a8b1cadca24 100644
> --- a/arch/tile/include/asm/kprobes.h
> +++ b/arch/tile/include/asm/kprobes.h
> @@ -17,10 +17,13 @@
>  #ifndef _ASM_TILE_KPROBES_H
>  #define _ASM_TILE_KPROBES_H
>  
> +#include <asm-generic/kprobes.h>
> +
> +#ifdef CONFIG_KPROBES
> +
>  #include <linux/types.h>
>  #include <linux/ptrace.h>
>  #include <linux/percpu.h>
> -
>  #include <arch/opcode.h>
>  
>  #define __ARCH_WANT_KPROBES_INSN_SLOT
> @@ -76,4 +79,5 @@ void arch_remove_kprobe(struct kprobe *);
>  extern int kprobe_exceptions_notify(struct notifier_block *self,
>  			     unsigned long val, void *data);
>  
> +#endif /* CONFIG_KPROBES */
>  #endif /* _ASM_TILE_KPROBES_H */
> diff --git a/arch/um/include/asm/Kbuild b/arch/um/include/asm/Kbuild
> index d2867aa09e23..ccc5ffeaeef5 100644
> --- a/arch/um/include/asm/Kbuild
> +++ b/arch/um/include/asm/Kbuild
> @@ -29,3 +29,4 @@ generic-y += xor.h
>  generic-y += section-core.h
>  generic-y += ranges.h
>  generic-y += tables.h
> +generic-y += kprobes.h
> diff --git a/arch/unicore32/include/asm/Kbuild b/arch/unicore32/include/asm/Kbuild
> index 6671a1f08ead..5aacafb6d385 100644
> --- a/arch/unicore32/include/asm/Kbuild
> +++ b/arch/unicore32/include/asm/Kbuild
> @@ -63,3 +63,4 @@ generic-y += word-at-a-time.h
>  generic-y += xor.h
>  generic-y += ranges.h
>  generic-y += tables.h
> +generic-y += kprobes.h
> diff --git a/arch/x86/include/asm/kprobes.h b/arch/x86/include/asm/kprobes.h
> index d1d1e5094c28..200581691c6e 100644
> --- a/arch/x86/include/asm/kprobes.h
> +++ b/arch/x86/include/asm/kprobes.h
> @@ -21,6 +21,12 @@
>   *
>   * See arch/x86/kernel/kprobes.c for x86 kprobes history.
>   */
> +
> +#include <asm-generic/kprobes.h>
> +
> +#define BREAKPOINT_INSTRUCTION	0xcc
> +
> +#ifdef CONFIG_KPROBES
>  #include <linux/types.h>
>  #include <linux/ptrace.h>
>  #include <linux/percpu.h>
> @@ -32,7 +38,6 @@ struct pt_regs;
>  struct kprobe;
>  
>  typedef u8 kprobe_opcode_t;
> -#define BREAKPOINT_INSTRUCTION	0xcc
>  #define RELATIVEJUMP_OPCODE 0xe9
>  #define RELATIVEJUMP_SIZE 5
>  #define RELATIVECALL_OPCODE 0xe8
> @@ -116,4 +121,6 @@ extern int kprobe_exceptions_notify(struct notifier_block *self,
>  				    unsigned long val, void *data);
>  extern int kprobe_int3_handler(struct pt_regs *regs);
>  extern int kprobe_debug_handler(struct pt_regs *regs);
> +
> +#endif /* CONFIG_KPROBES */
>  #endif /* _ASM_X86_KPROBES_H */
> diff --git a/arch/xtensa/include/asm/Kbuild b/arch/xtensa/include/asm/Kbuild
> index 7b41f32a2ba0..20f524ded00e 100644
> --- a/arch/xtensa/include/asm/Kbuild
> +++ b/arch/xtensa/include/asm/Kbuild
> @@ -35,3 +35,4 @@ generic-y += xor.h
>  generic-y += section-core.h
>  generic-y += ranges.h
>  generic-y += tables.h
> +generic-y += kprobes.h
> diff --git a/include/asm-generic/kprobes.h b/include/asm-generic/kprobes.h
> new file mode 100644
> index 000000000000..57af9f21d148
> --- /dev/null
> +++ b/include/asm-generic/kprobes.h
> @@ -0,0 +1,25 @@
> +#ifndef _ASM_GENERIC_KPROBES_H
> +#define _ASM_GENERIC_KPROBES_H
> +
> +#if defined(__KERNEL__) && !defined(__ASSEMBLY__)
> +#ifdef CONFIG_KPROBES
> +/*
> + * Blacklist ganerating macro. Specify functions which is not probed
> + * by using this macro.
> + */
> +# define __NOKPROBE_SYMBOL(fname)				\
> +static unsigned long __used					\
> +	__attribute__((__section__("_kprobe_blacklist")))	\
> +	_kbl_addr_##fname = (unsigned long)fname;
> +# define NOKPROBE_SYMBOL(fname)	__NOKPROBE_SYMBOL(fname)
> +/* Use this to forbid a kprobes attach on very low level functions */
> +# define __kprobes	__attribute__((__section__(".kprobes.text")))
> +# define nokprobe_inline	__always_inline
> +#else
> +# define NOKPROBE_SYMBOL(fname)
> +# define __kprobes
> +# define nokprobe_inline	inline
> +#endif
> +#endif /* defined(__KERNEL__) && !defined(__ASSEMBLY__) */
> +
> +#endif /* _ASM_GENERIC_KPROBES_H */
> diff --git a/include/linux/compiler.h b/include/linux/compiler.h
> index 91c30cba984e..b2eb9c0a68c4 100644
> --- a/include/linux/compiler.h
> +++ b/include/linux/compiler.h
> @@ -570,12 +570,4 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s
>  	(_________p1); \
>  })
>  
> -/* Ignore/forbid kprobes attach on very low level functions marked by this attribute: */
> -#ifdef CONFIG_KPROBES
> -# define __kprobes	__attribute__((__section__(".kprobes.text")))
> -# define nokprobe_inline	__always_inline
> -#else
> -# define __kprobes
> -# define nokprobe_inline	inline
> -#endif
>  #endif /* __LINUX_COMPILER_H */
> diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h
> index 16ddfb8b304a..c328e4f7dcad 100644
> --- a/include/linux/kprobes.h
> +++ b/include/linux/kprobes.h
> @@ -29,7 +29,7 @@
>   *		<jkenisto@us.ibm.com>  and Prasanna S Panchamukhi
>   *		<prasanna@in.ibm.com> added function-return probes.
>   */
> -#include <linux/compiler.h>	/* for __kprobes */
> +#include <linux/compiler.h>
>  #include <linux/linkage.h>
>  #include <linux/list.h>
>  #include <linux/notifier.h>
> @@ -40,9 +40,9 @@
>  #include <linux/rcupdate.h>
>  #include <linux/mutex.h>
>  #include <linux/ftrace.h>
> +#include <asm/kprobes.h>
>  
>  #ifdef CONFIG_KPROBES
> -#include <asm/kprobes.h>
>  
>  /* kprobe_status settings */
>  #define KPROBE_HIT_ACTIVE	0x00000001
> @@ -51,6 +51,7 @@
>  #define KPROBE_HIT_SSDONE	0x00000008
>  
>  #else /* CONFIG_KPROBES */
> +#include <asm-generic/kprobes.h>
>  typedef int kprobe_opcode_t;
>  struct arch_specific_insn {
>  	int dummy;
> @@ -509,18 +510,4 @@ static inline bool is_kprobe_optinsn_slot(unsigned long addr)
>  }
>  #endif
>  
> -#ifdef CONFIG_KPROBES
> -/*
> - * Blacklist ganerating macro. Specify functions which is not probed
> - * by using this macro.
> - */
> -#define __NOKPROBE_SYMBOL(fname)			\
> -static unsigned long __used				\
> -	__attribute__((section("_kprobe_blacklist")))	\
> -	_kbl_addr_##fname = (unsigned long)fname;
> -#define NOKPROBE_SYMBOL(fname)	__NOKPROBE_SYMBOL(fname)
> -#else
> -#define NOKPROBE_SYMBOL(fname)
> -#endif
> -
>  #endif /* _LINUX_KPROBES_H */
> -- 
> 2.11.0
> 


-- 
Masami Hiramatsu <mhiramat@kernel.org>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] kprobes: move kprobe declarations to asm-generic/kprobes.h
  2017-01-19  1:38 ` Masami Hiramatsu
@ 2017-01-19  6:47   ` Masami Hiramatsu
  2017-02-01 21:46     ` Luis R. Rodriguez
  0 siblings, 1 reply; 6+ messages in thread
From: Masami Hiramatsu @ 2017-01-19  6:47 UTC (permalink / raw)
  To: Masami Hiramatsu
  Cc: Luis R. Rodriguez, arnd, ananth, anil.s.keshavamurthy, davem,
	mingo, tglx, hpa, luto, rostedt, bp, bp, will.deacon, linux,
	dhowells, benh, ralf, jpoimboe, linux-arch, linux-kernel

On Thu, 19 Jan 2017 10:38:12 +0900
Masami Hiramatsu <mhiramat@kernel.org> wrote:

> Hi Luis,
> 
> On Wed, 18 Jan 2017 09:48:40 -0800
> "Luis R. Rodriguez" <mcgrof@kernel.org> wrote:
> 
> > Often all is needed is these small helpers, instead of compiler.h
> > or a full kprobes.h. This is important for asm helpers, in fact even
> > some asm/kprobes.h make use of these helpers... instead just keep a
> > generic asm file with helpers useful for asm code with the least amount
> > of clutter as possible.
> > 
> > Likewise we need now to also address what to do about this file for both
> > when architectures have CONFIG_HAVE_KPROBES, and when they do not. Then
> > for when architectures have CONFIG_HAVE_KPROBES but have disabled
> > CONFIG_KPROBES.
> > 
> > Right now most asm/kprobes.h do not have guards against CONFIG_KPROBES,
> > this means most architecture code cannot include asm/kprobes.h safely.
> 
> Just from curiosity, would you have any actual issue (like compile error)
> about that?
> 
> > Correct this and add guards for architectures missing them. Additionally
> > provide architectures that not have kprobes support with the default
> > asm-generic solution. This lets us force asm/kprobes.h on the header
> > include/linux/kprobes.h always, but most importantly we can now safely
> > include just asm/kprobes.h on architecture code without bringing
> > the full kitchen sink of header files.
> 
> It is fine to me to separate it into asm-generic/kprobes.h.
> 
> > Two architectures already provided a guard against CONFIG_KPROBES on
> > its kprobes.h: sh, arch. The rest of the architectures needed gaurds
> > added. We avoid including any not-needed headers on asm/kprobes.h
> > unless kprobes have been enabled.
> > 
> > In a subsequent atomic change we can try now to remove compiler.h from
> > include/linux/kprobes.h.
> 
> Nice :)
> 
> > 
> > During this sweep I've also identified a few architectures defining
> > a common macro needed for both kprobes and ftrace, that of the
> > definition of the breakput instruction up. Some refer to this as
> > BREAKPOINT_INSTRUCTION. This must be kept outside of the #ifdef
> > CONFIG_KPROBES guard.
> 
> Hmm, since it depends on ftrace arch-depend implementation, I would
> like to ask you to split this part into other patches for each arch,
> with a build failure log.

Ah, I understand. This becomes new issue when you make the #ifdef 
guards on asm/kprobes.h. 

OK, then it is OK to me.

Acked-by: Masami Hiramatsu <mhiramat@kernel.org>

Thank you,


> 
> Thank you,
> 
> > 
> > v5:
> > 
> > o fix BREAKPOINT_INSTRUCTION dependency with kernel architecture
> >   ftrace implementations:  Although its correct to #ifdef CONFIG_KPROBES
> >   on the architecture arch/$(ARCH)/include/asm/kprobes.h when
> >   architectures support ftrace they will rely on the
> >   BREAKPOINT_INSTRUCTION definition, this needs to be kept out from
> >   CONFIG_KPROBES as ftrace can be enabled without kprobes. This
> >   fixes compilation on x86 where kprobes is disabled but ftrace is
> >   left enabled.
> > 
> > o include <asm/kprobes.h> on arch/arm64/kernel/probes/decode-insn.h
> > 
> > Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org>
> > ---
> > 
> > This was part of the linker table series [0], but I'm going to split up
> > patches further there. This is an atomic change which is independent
> > so sending this separately now.
> > 
> > [0] https://lkml.kernel.org/r/20170115211057.17167-1-mcgrof@kernel.org
> > 
> >  MAINTAINERS                            |  1 +
> >  arch/alpha/include/asm/Kbuild          |  1 +
> >  arch/arc/include/asm/kprobes.h         |  6 ++++--
> >  arch/arm/include/asm/kprobes.h         |  4 ++++
> >  arch/arm/probes/decode.h               |  1 +
> >  arch/arm64/include/asm/kprobes.h       |  4 ++++
> >  arch/arm64/kernel/insn.c               |  1 +
> >  arch/arm64/kernel/probes/decode-insn.h |  2 ++
> >  arch/avr32/include/asm/kprobes.h       |  7 ++++++-
> >  arch/blackfin/include/asm/Kbuild       |  1 +
> >  arch/c6x/include/asm/Kbuild            |  1 +
> >  arch/cris/include/asm/Kbuild           |  1 +
> >  arch/frv/include/asm/Kbuild            |  1 +
> >  arch/h8300/include/asm/Kbuild          |  1 +
> >  arch/hexagon/include/asm/Kbuild        |  1 +
> >  arch/ia64/include/asm/kprobes.h        | 12 +++++++++---
> >  arch/m32r/include/asm/Kbuild           |  1 +
> >  arch/m68k/include/asm/Kbuild           |  1 +
> >  arch/metag/include/asm/Kbuild          |  1 +
> >  arch/microblaze/include/asm/Kbuild     |  1 +
> >  arch/mips/include/asm/kprobes.h        |  6 +++++-
> >  arch/mn10300/include/asm/kprobes.h     |  7 ++++++-
> >  arch/nios2/include/asm/Kbuild          |  1 +
> >  arch/openrisc/include/asm/Kbuild       |  1 +
> >  arch/parisc/include/asm/Kbuild         |  1 +
> >  arch/powerpc/include/asm/kprobes.h     |  3 +++
> >  arch/s390/include/asm/kprobes.h        |  7 ++++++-
> >  arch/score/include/asm/Kbuild          |  1 +
> >  arch/sh/include/asm/kprobes.h          |  5 ++++-
> >  arch/sparc/include/asm/kprobes.h       | 10 ++++++++--
> >  arch/tile/include/asm/kprobes.h        |  6 +++++-
> >  arch/um/include/asm/Kbuild             |  1 +
> >  arch/unicore32/include/asm/Kbuild      |  1 +
> >  arch/x86/include/asm/kprobes.h         |  9 ++++++++-
> >  arch/xtensa/include/asm/Kbuild         |  1 +
> >  include/asm-generic/kprobes.h          | 25 +++++++++++++++++++++++++
> >  include/linux/compiler.h               |  8 --------
> >  include/linux/kprobes.h                | 19 +++----------------
> >  38 files changed, 123 insertions(+), 38 deletions(-)
> >  create mode 100644 include/asm-generic/kprobes.h
> > 
> > diff --git a/MAINTAINERS b/MAINTAINERS
> > index f65eee7fa136..9d9ee0cf7363 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -7251,6 +7251,7 @@ M:	Masami Hiramatsu <mhiramat@kernel.org>
> >  S:	Maintained
> >  F:	Documentation/kprobes.txt
> >  F:	include/linux/kprobes.h
> > +F:	include/asm-generic/kprobes.h
> >  F:	kernel/kprobes.c
> >  
> >  KS0108 LCD CONTROLLER DRIVER
> > diff --git a/arch/alpha/include/asm/Kbuild b/arch/alpha/include/asm/Kbuild
> > index f3bdc31d3c97..54d388fd026f 100644
> > --- a/arch/alpha/include/asm/Kbuild
> > +++ b/arch/alpha/include/asm/Kbuild
> > @@ -13,3 +13,4 @@ generic-y += trace_clock.h
> >  generic-y += section-core.h
> >  generic-y += ranges.h
> >  generic-y += tables.h
> > +generic-y += kprobes.h
> > diff --git a/arch/arc/include/asm/kprobes.h b/arch/arc/include/asm/kprobes.h
> > index 944dbedb38b5..00bdbe167615 100644
> > --- a/arch/arc/include/asm/kprobes.h
> > +++ b/arch/arc/include/asm/kprobes.h
> > @@ -9,6 +9,8 @@
> >  #ifndef _ARC_KPROBES_H
> >  #define _ARC_KPROBES_H
> >  
> > +#include <asm-generic/kprobes.h>
> > +
> >  #ifdef CONFIG_KPROBES
> >  
> >  typedef u16 kprobe_opcode_t;
> > @@ -55,6 +57,6 @@ void trap_is_kprobe(unsigned long address, struct pt_regs *regs);
> >  static void trap_is_kprobe(unsigned long address, struct pt_regs *regs)
> >  {
> >  }
> > -#endif
> > +#endif /* CONFIG_KPROBES */
> >  
> > -#endif
> > +#endif /* _ARC_KPROBES_H */
> > diff --git a/arch/arm/include/asm/kprobes.h b/arch/arm/include/asm/kprobes.h
> > index 3ea9be559726..59655459da59 100644
> > --- a/arch/arm/include/asm/kprobes.h
> > +++ b/arch/arm/include/asm/kprobes.h
> > @@ -16,6 +16,9 @@
> >  #ifndef _ARM_KPROBES_H
> >  #define _ARM_KPROBES_H
> >  
> > +#include <asm-generic/kprobes.h>
> > +
> > +#ifdef CONFIG_KPROBES
> >  #include <linux/types.h>
> >  #include <linux/ptrace.h>
> >  #include <linux/notifier.h>
> > @@ -83,4 +86,5 @@ struct arch_optimized_insn {
> >  	 */
> >  };
> >  
> > +#endif /* CONFIG_KPROBES */
> >  #endif /* _ARM_KPROBES_H */
> > diff --git a/arch/arm/probes/decode.h b/arch/arm/probes/decode.h
> > index f9b08ba7fe73..548d622a3159 100644
> > --- a/arch/arm/probes/decode.h
> > +++ b/arch/arm/probes/decode.h
> > @@ -22,6 +22,7 @@
> >  #include <linux/types.h>
> >  #include <linux/stddef.h>
> >  #include <asm/probes.h>
> > +#include <asm/kprobes.h>
> >  
> >  void __init arm_probes_decode_init(void);
> >  
> > diff --git a/arch/arm64/include/asm/kprobes.h b/arch/arm64/include/asm/kprobes.h
> > index 1737aecfcc5e..6deb8d726041 100644
> > --- a/arch/arm64/include/asm/kprobes.h
> > +++ b/arch/arm64/include/asm/kprobes.h
> > @@ -16,6 +16,9 @@
> >  #ifndef _ARM_KPROBES_H
> >  #define _ARM_KPROBES_H
> >  
> > +#include <asm-generic/kprobes.h>
> > +
> > +#ifdef CONFIG_KPROBES
> >  #include <linux/types.h>
> >  #include <linux/ptrace.h>
> >  #include <linux/percpu.h>
> > @@ -57,4 +60,5 @@ int kprobe_single_step_handler(struct pt_regs *regs, unsigned int esr);
> >  void kretprobe_trampoline(void);
> >  void __kprobes *trampoline_probe_handler(struct pt_regs *regs);
> >  
> > +#endif /* CONFIG_KPROBES */
> >  #endif /* _ARM_KPROBES_H */
> > diff --git a/arch/arm64/kernel/insn.c b/arch/arm64/kernel/insn.c
> > index 022d4a9d1738..4e02fd369bf9 100644
> > --- a/arch/arm64/kernel/insn.c
> > +++ b/arch/arm64/kernel/insn.c
> > @@ -31,6 +31,7 @@
> >  #include <asm/debug-monitors.h>
> >  #include <asm/fixmap.h>
> >  #include <asm/insn.h>
> > +#include <asm/kprobes.h>
> >  
> >  #define AARCH64_INSN_SF_BIT	BIT(31)
> >  #define AARCH64_INSN_N_BIT	BIT(22)
> > diff --git a/arch/arm64/kernel/probes/decode-insn.h b/arch/arm64/kernel/probes/decode-insn.h
> > index 76d3f315407f..192ab007bacb 100644
> > --- a/arch/arm64/kernel/probes/decode-insn.h
> > +++ b/arch/arm64/kernel/probes/decode-insn.h
> > @@ -16,6 +16,8 @@
> >  #ifndef _ARM_KERNEL_KPROBES_ARM64_H
> >  #define _ARM_KERNEL_KPROBES_ARM64_H
> >  
> > +#include <asm/kprobes.h>
> > +
> >  /*
> >   * ARM strongly recommends a limit of 128 bytes between LoadExcl and
> >   * StoreExcl instructions in a single thread of execution. So keep the
> > diff --git a/arch/avr32/include/asm/kprobes.h b/arch/avr32/include/asm/kprobes.h
> > index 45f563ed73fd..28dfc61ad384 100644
> > --- a/arch/avr32/include/asm/kprobes.h
> > +++ b/arch/avr32/include/asm/kprobes.h
> > @@ -11,10 +11,14 @@
> >  #ifndef __ASM_AVR32_KPROBES_H
> >  #define __ASM_AVR32_KPROBES_H
> >  
> > +#include <asm-generic/kprobes.h>
> > +
> > +#define BREAKPOINT_INSTRUCTION	0xd673	/* breakpoint */
> > +
> > +#ifdef CONFIG_KPROBES
> >  #include <linux/types.h>
> >  
> >  typedef u16	kprobe_opcode_t;
> > -#define BREAKPOINT_INSTRUCTION	0xd673	/* breakpoint */
> >  #define MAX_INSN_SIZE		2
> >  #define MAX_STACK_SIZE		64	/* 32 would probably be OK */
> >  
> > @@ -46,4 +50,5 @@ extern int kprobe_exceptions_notify(struct notifier_block *self,
> >  
> >  #define flush_insn_slot(p)	do { } while (0)
> >  
> > +#endif /* CONFIG_KPROBES */
> >  #endif /* __ASM_AVR32_KPROBES_H */
> > diff --git a/arch/blackfin/include/asm/Kbuild b/arch/blackfin/include/asm/Kbuild
> > index 9115b215fc7e..52351d3fd36e 100644
> > --- a/arch/blackfin/include/asm/Kbuild
> > +++ b/arch/blackfin/include/asm/Kbuild
> > @@ -50,3 +50,4 @@ generic-y += xor.h
> >  generic-y += section-core.h
> >  generic-y += ranges.h
> >  generic-y += tables.h
> > +generic-y += kprobes.h
> > diff --git a/arch/c6x/include/asm/Kbuild b/arch/c6x/include/asm/Kbuild
> > index cede2a950fbf..c54f7cc1f63e 100644
> > --- a/arch/c6x/include/asm/Kbuild
> > +++ b/arch/c6x/include/asm/Kbuild
> > @@ -64,3 +64,4 @@ generic-y += word-at-a-time.h
> >  generic-y += xor.h
> >  generic-y += section-core.h
> >  generic-y += ranges.h
> > +generic-y += kprobes.h
> > diff --git a/arch/cris/include/asm/Kbuild b/arch/cris/include/asm/Kbuild
> > index 7062c1be7913..051d355feae3 100644
> > --- a/arch/cris/include/asm/Kbuild
> > +++ b/arch/cris/include/asm/Kbuild
> > @@ -48,3 +48,4 @@ generic-y += xor.h
> >  generic-y += section-core.h
> >  generic-y += ranges.h
> >  generic-y += tables.h
> > +generic-y += kprobes.h
> > diff --git a/arch/frv/include/asm/Kbuild b/arch/frv/include/asm/Kbuild
> > index 4a59cbda5091..b58b9fc49383 100644
> > --- a/arch/frv/include/asm/Kbuild
> > +++ b/arch/frv/include/asm/Kbuild
> > @@ -11,3 +11,4 @@ generic-y += word-at-a-time.h
> >  generic-y += section-core.h
> >  generic-y += ranges.h
> >  generic-y += tables.h
> > +generic-y += kprobes.h
> > diff --git a/arch/h8300/include/asm/Kbuild b/arch/h8300/include/asm/Kbuild
> > index d79968d93c12..cfca7de52b37 100644
> > --- a/arch/h8300/include/asm/Kbuild
> > +++ b/arch/h8300/include/asm/Kbuild
> > @@ -78,3 +78,4 @@ generic-y += xor.h
> >  generic-y += section-core.h
> >  generic-y += ranges.h
> >  generic-y += tables.h
> > +generic-y += kprobes.h
> > diff --git a/arch/hexagon/include/asm/Kbuild b/arch/hexagon/include/asm/Kbuild
> > index d59ac1c1858b..d7cc35451f30 100644
> > --- a/arch/hexagon/include/asm/Kbuild
> > +++ b/arch/hexagon/include/asm/Kbuild
> > @@ -63,3 +63,4 @@ generic-y += xor.h
> >  generic-y += section-core.h
> >  generic-y += ranges.h
> >  generic-y += tables.h
> > +generic-y += kprobes.h
> > diff --git a/arch/ia64/include/asm/kprobes.h b/arch/ia64/include/asm/kprobes.h
> > index d5505d6f2382..0302b3664789 100644
> > --- a/arch/ia64/include/asm/kprobes.h
> > +++ b/arch/ia64/include/asm/kprobes.h
> > @@ -23,14 +23,19 @@
> >   * 2005-Apr     Rusty Lynch <rusty.lynch@intel.com> and Anil S Keshavamurthy
> >   *              <anil.s.keshavamurthy@intel.com> adapted from i386
> >   */
> > +#include <asm-generic/kprobes.h>
> > +#include <asm/break.h>
> > +
> > +#define BREAK_INST	(long)(__IA64_BREAK_KPROBE << 6)
> > +
> > +#ifdef CONFIG_KPROBES
> > +
> >  #include <linux/types.h>
> >  #include <linux/ptrace.h>
> >  #include <linux/percpu.h>
> > -#include <asm/break.h>
> >  
> >  #define __ARCH_WANT_KPROBES_INSN_SLOT
> >  #define MAX_INSN_SIZE   2	/* last half is for kprobe-booster */
> > -#define BREAK_INST	(long)(__IA64_BREAK_KPROBE << 6)
> >  #define NOP_M_INST	(long)(1<<27)
> >  #define BRL_INST(i1, i2) ((long)((0xcL << 37) |	/* brl */ \
> >  				(0x1L << 12) |	/* many */ \
> > @@ -124,4 +129,5 @@ extern void invalidate_stacked_regs(void);
> >  extern void flush_register_stack(void);
> >  extern void arch_remove_kprobe(struct kprobe *p);
> >  
> > -#endif				/* _ASM_KPROBES_H */
> > +#endif /* CONFIG_KPROBES */
> > +#endif /* _ASM_KPROBES_H */
> > diff --git a/arch/m32r/include/asm/Kbuild b/arch/m32r/include/asm/Kbuild
> > index f3f1e51dd5be..60024b49b6bb 100644
> > --- a/arch/m32r/include/asm/Kbuild
> > +++ b/arch/m32r/include/asm/Kbuild
> > @@ -15,3 +15,4 @@ generic-y += word-at-a-time.h
> >  generic-y += section-core.h
> >  generic-y += ranges.h
> >  generic-y += tables.h
> > +generic-y += kprobes.h
> > diff --git a/arch/m68k/include/asm/Kbuild b/arch/m68k/include/asm/Kbuild
> > index c28bcdecc764..412dd23ab946 100644
> > --- a/arch/m68k/include/asm/Kbuild
> > +++ b/arch/m68k/include/asm/Kbuild
> > @@ -37,3 +37,4 @@ generic-y += xor.h
> >  generic-y += section-core.h
> >  generic-y += ranges.h
> >  generic-y += tables.h
> > +generic-y += kprobes.h
> > diff --git a/arch/metag/include/asm/Kbuild b/arch/metag/include/asm/Kbuild
> > index c836f7e2a5e7..8371cc9b1b3c 100644
> > --- a/arch/metag/include/asm/Kbuild
> > +++ b/arch/metag/include/asm/Kbuild
> > @@ -58,3 +58,4 @@ generic-y += xor.h
> >  generic-y += section-core.h
> >  generic-y += ranges.h
> >  generic-y += tables.h
> > +generic-y += kprobes.h
> > diff --git a/arch/microblaze/include/asm/Kbuild b/arch/microblaze/include/asm/Kbuild
> > index 01afb1b420f5..865ce3d96443 100644
> > --- a/arch/microblaze/include/asm/Kbuild
> > +++ b/arch/microblaze/include/asm/Kbuild
> > @@ -14,3 +14,4 @@ generic-y += word-at-a-time.h
> >  generic-y += section-core.h
> >  generic-y += ranges.h
> >  generic-y += tables.h
> > +generic-y += kprobes.h
> > diff --git a/arch/mips/include/asm/kprobes.h b/arch/mips/include/asm/kprobes.h
> > index daba1f9a4f79..291846d9ba83 100644
> > --- a/arch/mips/include/asm/kprobes.h
> > +++ b/arch/mips/include/asm/kprobes.h
> > @@ -22,6 +22,9 @@
> >  #ifndef _ASM_KPROBES_H
> >  #define _ASM_KPROBES_H
> >  
> > +#include <asm-generic/kprobes.h>
> > +
> > +#ifdef CONFIG_KPROBES
> >  #include <linux/ptrace.h>
> >  #include <linux/types.h>
> >  
> > @@ -94,4 +97,5 @@ struct kprobe_ctlblk {
> >  extern int kprobe_exceptions_notify(struct notifier_block *self,
> >  				    unsigned long val, void *data);
> >  
> > -#endif				/* _ASM_KPROBES_H */
> > +#endif /* CONFIG_KPROBES */
> > +#endif /* _ASM_KPROBES_H */
> > diff --git a/arch/mn10300/include/asm/kprobes.h b/arch/mn10300/include/asm/kprobes.h
> > index c800b590183a..7abea0bdb549 100644
> > --- a/arch/mn10300/include/asm/kprobes.h
> > +++ b/arch/mn10300/include/asm/kprobes.h
> > @@ -21,13 +21,17 @@
> >  #ifndef _ASM_KPROBES_H
> >  #define _ASM_KPROBES_H
> >  
> > +#include <asm-generic/kprobes.h>
> > +
> > +#define BREAKPOINT_INSTRUCTION	0xff
> > +
> > +#ifdef CONFIG_KPROBES
> >  #include <linux/types.h>
> >  #include <linux/ptrace.h>
> >  
> >  struct kprobe;
> >  
> >  typedef unsigned char kprobe_opcode_t;
> > -#define BREAKPOINT_INSTRUCTION	0xff
> >  #define MAX_INSN_SIZE 8
> >  #define MAX_STACK_SIZE 128
> >  
> > @@ -47,4 +51,5 @@ extern int kprobe_exceptions_notify(struct notifier_block *self,
> >  
> >  extern void arch_remove_kprobe(struct kprobe *p);
> >  
> > +#endif /* CONFIG_KPROBES */
> >  #endif /* _ASM_KPROBES_H */
> > diff --git a/arch/nios2/include/asm/Kbuild b/arch/nios2/include/asm/Kbuild
> > index ee6220dac1e8..d6ce7edee7e0 100644
> > --- a/arch/nios2/include/asm/Kbuild
> > +++ b/arch/nios2/include/asm/Kbuild
> > @@ -66,3 +66,4 @@ generic-y += xor.h
> >  generic-y += section-core.h
> >  generic-y += ranges.h
> >  generic-y += tables.h
> > +generic-y += kprobes.h
> > diff --git a/arch/openrisc/include/asm/Kbuild b/arch/openrisc/include/asm/Kbuild
> > index ceafe458e295..1bf89a67317c 100644
> > --- a/arch/openrisc/include/asm/Kbuild
> > +++ b/arch/openrisc/include/asm/Kbuild
> > @@ -74,3 +74,4 @@ generic-y += xor.h
> >  generic-y += section-core.h
> >  generic-y += ranges.h
> >  generic-y += tables.h
> > +generic-y += kprobes.h
> > diff --git a/arch/parisc/include/asm/Kbuild b/arch/parisc/include/asm/Kbuild
> > index aaae8a9f6099..19d5b7e12ecf 100644
> > --- a/arch/parisc/include/asm/Kbuild
> > +++ b/arch/parisc/include/asm/Kbuild
> > @@ -31,3 +31,4 @@ generic-y += xor.h
> >  generic-y += section-core.h
> >  generic-y += ranges.h
> >  generic-y += tables.h
> > +generic-y += kprobes.h
> > diff --git a/arch/powerpc/include/asm/kprobes.h b/arch/powerpc/include/asm/kprobes.h
> > index 97b8c1f83453..c7ee3fcbd6e2 100644
> > --- a/arch/powerpc/include/asm/kprobes.h
> > +++ b/arch/powerpc/include/asm/kprobes.h
> > @@ -1,5 +1,8 @@
> >  #ifndef _ASM_POWERPC_KPROBES_H
> >  #define _ASM_POWERPC_KPROBES_H
> > +
> > +#include <asm-generic/kprobes.h>
> > +
> >  #ifdef __KERNEL__
> >  /*
> >   *  Kernel Probes (KProbes)
> > diff --git a/arch/s390/include/asm/kprobes.h b/arch/s390/include/asm/kprobes.h
> > index 591e5a5279b0..84c0f9086483 100644
> > --- a/arch/s390/include/asm/kprobes.h
> > +++ b/arch/s390/include/asm/kprobes.h
> > @@ -27,6 +27,11 @@
> >   * 2005-Dec	Used as a template for s390 by Mike Grundy
> >   *		<grundym@us.ibm.com>
> >   */
> > +#include <asm-generic/kprobes.h>
> > +
> > +#define BREAKPOINT_INSTRUCTION	0x0002
> > +
> > +#ifdef CONFIG_KPROBES
> >  #include <linux/types.h>
> >  #include <linux/ptrace.h>
> >  #include <linux/percpu.h>
> > @@ -37,7 +42,6 @@ struct pt_regs;
> >  struct kprobe;
> >  
> >  typedef u16 kprobe_opcode_t;
> > -#define BREAKPOINT_INSTRUCTION	0x0002
> >  
> >  /* Maximum instruction size is 3 (16bit) halfwords: */
> >  #define MAX_INSN_SIZE		0x0003
> > @@ -91,4 +95,5 @@ int probe_is_insn_relative_long(u16 *insn);
> >  
> >  #define flush_insn_slot(p)	do { } while (0)
> >  
> > +#endif /* CONFIG_KPROBES */
> >  #endif	/* _ASM_S390_KPROBES_H */
> > diff --git a/arch/score/include/asm/Kbuild b/arch/score/include/asm/Kbuild
> > index 16ea15a3e432..6ac8a7f5c768 100644
> > --- a/arch/score/include/asm/Kbuild
> > +++ b/arch/score/include/asm/Kbuild
> > @@ -17,3 +17,4 @@ generic-y += word-at-a-time.h
> >  generic-y += section-core.h
> >  generic-y += ranges.h
> >  generic-y += tables.h
> > +generic-y += kprobes.h
> > diff --git a/arch/sh/include/asm/kprobes.h b/arch/sh/include/asm/kprobes.h
> > index 134f3980e44a..f0986f9b3844 100644
> > --- a/arch/sh/include/asm/kprobes.h
> > +++ b/arch/sh/include/asm/kprobes.h
> > @@ -1,13 +1,16 @@
> >  #ifndef __ASM_SH_KPROBES_H
> >  #define __ASM_SH_KPROBES_H
> >  
> > +#include <asm-generic/kprobes.h>
> > +
> > +#define BREAKPOINT_INSTRUCTION	0xc33a
> > +
> >  #ifdef CONFIG_KPROBES
> >  
> >  #include <linux/types.h>
> >  #include <linux/ptrace.h>
> >  
> >  typedef insn_size_t kprobe_opcode_t;
> > -#define BREAKPOINT_INSTRUCTION	0xc33a
> >  
> >  #define MAX_INSN_SIZE 16
> >  #define MAX_STACK_SIZE 64
> > diff --git a/arch/sparc/include/asm/kprobes.h b/arch/sparc/include/asm/kprobes.h
> > index a145d798e112..49f8402035d7 100644
> > --- a/arch/sparc/include/asm/kprobes.h
> > +++ b/arch/sparc/include/asm/kprobes.h
> > @@ -1,13 +1,17 @@
> >  #ifndef _SPARC64_KPROBES_H
> >  #define _SPARC64_KPROBES_H
> >  
> > +#include <asm-generic/kprobes.h>
> > +
> > +#define BREAKPOINT_INSTRUCTION   0x91d02070 /* ta 0x70 */
> > +#define BREAKPOINT_INSTRUCTION_2 0x91d02071 /* ta 0x71 */
> > +
> > +#ifdef CONFIG_KPROBES
> >  #include <linux/types.h>
> >  #include <linux/percpu.h>
> >  
> >  typedef u32 kprobe_opcode_t;
> >  
> > -#define BREAKPOINT_INSTRUCTION   0x91d02070 /* ta 0x70 */
> > -#define BREAKPOINT_INSTRUCTION_2 0x91d02071 /* ta 0x71 */
> >  #define MAX_INSN_SIZE 2
> >  
> >  #define kretprobe_blacklist_size 0
> > @@ -48,4 +52,6 @@ int kprobe_exceptions_notify(struct notifier_block *self,
> >  int kprobe_fault_handler(struct pt_regs *regs, int trapnr);
> >  asmlinkage void __kprobes kprobe_trap(unsigned long trap_level,
> >  				      struct pt_regs *regs);
> > +
> > +#endif /* CONFIG_KPROBES */
> >  #endif /* _SPARC64_KPROBES_H */
> > diff --git a/arch/tile/include/asm/kprobes.h b/arch/tile/include/asm/kprobes.h
> > index d8f9a83943b1..4a8b1cadca24 100644
> > --- a/arch/tile/include/asm/kprobes.h
> > +++ b/arch/tile/include/asm/kprobes.h
> > @@ -17,10 +17,13 @@
> >  #ifndef _ASM_TILE_KPROBES_H
> >  #define _ASM_TILE_KPROBES_H
> >  
> > +#include <asm-generic/kprobes.h>
> > +
> > +#ifdef CONFIG_KPROBES
> > +
> >  #include <linux/types.h>
> >  #include <linux/ptrace.h>
> >  #include <linux/percpu.h>
> > -
> >  #include <arch/opcode.h>
> >  
> >  #define __ARCH_WANT_KPROBES_INSN_SLOT
> > @@ -76,4 +79,5 @@ void arch_remove_kprobe(struct kprobe *);
> >  extern int kprobe_exceptions_notify(struct notifier_block *self,
> >  			     unsigned long val, void *data);
> >  
> > +#endif /* CONFIG_KPROBES */
> >  #endif /* _ASM_TILE_KPROBES_H */
> > diff --git a/arch/um/include/asm/Kbuild b/arch/um/include/asm/Kbuild
> > index d2867aa09e23..ccc5ffeaeef5 100644
> > --- a/arch/um/include/asm/Kbuild
> > +++ b/arch/um/include/asm/Kbuild
> > @@ -29,3 +29,4 @@ generic-y += xor.h
> >  generic-y += section-core.h
> >  generic-y += ranges.h
> >  generic-y += tables.h
> > +generic-y += kprobes.h
> > diff --git a/arch/unicore32/include/asm/Kbuild b/arch/unicore32/include/asm/Kbuild
> > index 6671a1f08ead..5aacafb6d385 100644
> > --- a/arch/unicore32/include/asm/Kbuild
> > +++ b/arch/unicore32/include/asm/Kbuild
> > @@ -63,3 +63,4 @@ generic-y += word-at-a-time.h
> >  generic-y += xor.h
> >  generic-y += ranges.h
> >  generic-y += tables.h
> > +generic-y += kprobes.h
> > diff --git a/arch/x86/include/asm/kprobes.h b/arch/x86/include/asm/kprobes.h
> > index d1d1e5094c28..200581691c6e 100644
> > --- a/arch/x86/include/asm/kprobes.h
> > +++ b/arch/x86/include/asm/kprobes.h
> > @@ -21,6 +21,12 @@
> >   *
> >   * See arch/x86/kernel/kprobes.c for x86 kprobes history.
> >   */
> > +
> > +#include <asm-generic/kprobes.h>
> > +
> > +#define BREAKPOINT_INSTRUCTION	0xcc
> > +
> > +#ifdef CONFIG_KPROBES
> >  #include <linux/types.h>
> >  #include <linux/ptrace.h>
> >  #include <linux/percpu.h>
> > @@ -32,7 +38,6 @@ struct pt_regs;
> >  struct kprobe;
> >  
> >  typedef u8 kprobe_opcode_t;
> > -#define BREAKPOINT_INSTRUCTION	0xcc
> >  #define RELATIVEJUMP_OPCODE 0xe9
> >  #define RELATIVEJUMP_SIZE 5
> >  #define RELATIVECALL_OPCODE 0xe8
> > @@ -116,4 +121,6 @@ extern int kprobe_exceptions_notify(struct notifier_block *self,
> >  				    unsigned long val, void *data);
> >  extern int kprobe_int3_handler(struct pt_regs *regs);
> >  extern int kprobe_debug_handler(struct pt_regs *regs);
> > +
> > +#endif /* CONFIG_KPROBES */
> >  #endif /* _ASM_X86_KPROBES_H */
> > diff --git a/arch/xtensa/include/asm/Kbuild b/arch/xtensa/include/asm/Kbuild
> > index 7b41f32a2ba0..20f524ded00e 100644
> > --- a/arch/xtensa/include/asm/Kbuild
> > +++ b/arch/xtensa/include/asm/Kbuild
> > @@ -35,3 +35,4 @@ generic-y += xor.h
> >  generic-y += section-core.h
> >  generic-y += ranges.h
> >  generic-y += tables.h
> > +generic-y += kprobes.h
> > diff --git a/include/asm-generic/kprobes.h b/include/asm-generic/kprobes.h
> > new file mode 100644
> > index 000000000000..57af9f21d148
> > --- /dev/null
> > +++ b/include/asm-generic/kprobes.h
> > @@ -0,0 +1,25 @@
> > +#ifndef _ASM_GENERIC_KPROBES_H
> > +#define _ASM_GENERIC_KPROBES_H
> > +
> > +#if defined(__KERNEL__) && !defined(__ASSEMBLY__)
> > +#ifdef CONFIG_KPROBES
> > +/*
> > + * Blacklist ganerating macro. Specify functions which is not probed
> > + * by using this macro.
> > + */
> > +# define __NOKPROBE_SYMBOL(fname)				\
> > +static unsigned long __used					\
> > +	__attribute__((__section__("_kprobe_blacklist")))	\
> > +	_kbl_addr_##fname = (unsigned long)fname;
> > +# define NOKPROBE_SYMBOL(fname)	__NOKPROBE_SYMBOL(fname)
> > +/* Use this to forbid a kprobes attach on very low level functions */
> > +# define __kprobes	__attribute__((__section__(".kprobes.text")))
> > +# define nokprobe_inline	__always_inline
> > +#else
> > +# define NOKPROBE_SYMBOL(fname)
> > +# define __kprobes
> > +# define nokprobe_inline	inline
> > +#endif
> > +#endif /* defined(__KERNEL__) && !defined(__ASSEMBLY__) */
> > +
> > +#endif /* _ASM_GENERIC_KPROBES_H */
> > diff --git a/include/linux/compiler.h b/include/linux/compiler.h
> > index 91c30cba984e..b2eb9c0a68c4 100644
> > --- a/include/linux/compiler.h
> > +++ b/include/linux/compiler.h
> > @@ -570,12 +570,4 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s
> >  	(_________p1); \
> >  })
> >  
> > -/* Ignore/forbid kprobes attach on very low level functions marked by this attribute: */
> > -#ifdef CONFIG_KPROBES
> > -# define __kprobes	__attribute__((__section__(".kprobes.text")))
> > -# define nokprobe_inline	__always_inline
> > -#else
> > -# define __kprobes
> > -# define nokprobe_inline	inline
> > -#endif
> >  #endif /* __LINUX_COMPILER_H */
> > diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h
> > index 16ddfb8b304a..c328e4f7dcad 100644
> > --- a/include/linux/kprobes.h
> > +++ b/include/linux/kprobes.h
> > @@ -29,7 +29,7 @@
> >   *		<jkenisto@us.ibm.com>  and Prasanna S Panchamukhi
> >   *		<prasanna@in.ibm.com> added function-return probes.
> >   */
> > -#include <linux/compiler.h>	/* for __kprobes */
> > +#include <linux/compiler.h>
> >  #include <linux/linkage.h>
> >  #include <linux/list.h>
> >  #include <linux/notifier.h>
> > @@ -40,9 +40,9 @@
> >  #include <linux/rcupdate.h>
> >  #include <linux/mutex.h>
> >  #include <linux/ftrace.h>
> > +#include <asm/kprobes.h>
> >  
> >  #ifdef CONFIG_KPROBES
> > -#include <asm/kprobes.h>
> >  
> >  /* kprobe_status settings */
> >  #define KPROBE_HIT_ACTIVE	0x00000001
> > @@ -51,6 +51,7 @@
> >  #define KPROBE_HIT_SSDONE	0x00000008
> >  
> >  #else /* CONFIG_KPROBES */
> > +#include <asm-generic/kprobes.h>
> >  typedef int kprobe_opcode_t;
> >  struct arch_specific_insn {
> >  	int dummy;
> > @@ -509,18 +510,4 @@ static inline bool is_kprobe_optinsn_slot(unsigned long addr)
> >  }
> >  #endif
> >  
> > -#ifdef CONFIG_KPROBES
> > -/*
> > - * Blacklist ganerating macro. Specify functions which is not probed
> > - * by using this macro.
> > - */
> > -#define __NOKPROBE_SYMBOL(fname)			\
> > -static unsigned long __used				\
> > -	__attribute__((section("_kprobe_blacklist")))	\
> > -	_kbl_addr_##fname = (unsigned long)fname;
> > -#define NOKPROBE_SYMBOL(fname)	__NOKPROBE_SYMBOL(fname)
> > -#else
> > -#define NOKPROBE_SYMBOL(fname)
> > -#endif
> > -
> >  #endif /* _LINUX_KPROBES_H */
> > -- 
> > 2.11.0
> > 
> 
> 
> -- 
> Masami Hiramatsu <mhiramat@kernel.org>


-- 
Masami Hiramatsu <mhiramat@kernel.org>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] kprobes: move kprobe declarations to asm-generic/kprobes.h
  2017-01-19  6:47   ` Masami Hiramatsu
@ 2017-02-01 21:46     ` Luis R. Rodriguez
  2017-02-02  3:00       ` Steven Rostedt
  0 siblings, 1 reply; 6+ messages in thread
From: Luis R. Rodriguez @ 2017-02-01 21:46 UTC (permalink / raw)
  To: Masami Hiramatsu
  Cc: Luis R. Rodriguez, arnd, ananth, anil.s.keshavamurthy, davem,
	mingo, tglx, hpa, luto, rostedt, bp, bp, will.deacon, linux,
	dhowells, benh, ralf, jpoimboe, linux-arch, linux-kernel

On Thu, Jan 19, 2017 at 03:47:35PM +0900, Masami Hiramatsu wrote:
> OK, then it is OK to me.
> 
> Acked-by: Masami Hiramatsu <mhiramat@kernel.org>

Aha, actually I *did* send this out separately already :) --
who's tree should this go through ?

  Luis

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] kprobes: move kprobe declarations to asm-generic/kprobes.h
  2017-02-01 21:46     ` Luis R. Rodriguez
@ 2017-02-02  3:00       ` Steven Rostedt
  2017-02-03 23:24         ` Luis R. Rodriguez
  0 siblings, 1 reply; 6+ messages in thread
From: Steven Rostedt @ 2017-02-02  3:00 UTC (permalink / raw)
  To: Luis R. Rodriguez, Andrew Morton
  Cc: Masami Hiramatsu, arnd, ananth, anil.s.keshavamurthy, davem,
	mingo, tglx, hpa, luto, bp, bp, will.deacon, linux, dhowells,
	benh, ralf, jpoimboe, linux-arch, linux-kernel

On Wed, 1 Feb 2017 22:46:04 +0100
"Luis R. Rodriguez" <mcgrof@kernel.org> wrote:

> On Thu, Jan 19, 2017 at 03:47:35PM +0900, Masami Hiramatsu wrote:
> > OK, then it is OK to me.
> > 
> > Acked-by: Masami Hiramatsu <mhiramat@kernel.org>  
> 
> Aha, actually I *did* send this out separately already :) --
> who's tree should this go through ?

This hits a lot of archs. Perhaps it should go through the default
tree... Andrew?

-- Steve

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] kprobes: move kprobe declarations to asm-generic/kprobes.h
  2017-02-02  3:00       ` Steven Rostedt
@ 2017-02-03 23:24         ` Luis R. Rodriguez
  0 siblings, 0 replies; 6+ messages in thread
From: Luis R. Rodriguez @ 2017-02-03 23:24 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Luis R. Rodriguez, Andrew Morton, Masami Hiramatsu, arnd, ananth,
	anil.s.keshavamurthy, davem, mingo, tglx, hpa, luto, bp, bp,
	will.deacon, linux, dhowells, benh, ralf, jpoimboe, linux-arch,
	linux-kernel

On Wed, Feb 01, 2017 at 10:00:57PM -0500, Steven Rostedt wrote:
> On Wed, 1 Feb 2017 22:46:04 +0100
> "Luis R. Rodriguez" <mcgrof@kernel.org> wrote:
> 
> > On Thu, Jan 19, 2017 at 03:47:35PM +0900, Masami Hiramatsu wrote:
> > > OK, then it is OK to me.
> > > 
> > > Acked-by: Masami Hiramatsu <mhiramat@kernel.org>  
> > 
> > Aha, actually I *did* send this out separately already :) --
> > who's tree should this go through ?
> 
> This hits a lot of archs. Perhaps it should go through the default
> tree... Andrew?

Sure, will rebase and send again.

  Luis

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-02-03 23:25 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-01-18 17:48 [PATCH] kprobes: move kprobe declarations to asm-generic/kprobes.h Luis R. Rodriguez
2017-01-19  1:38 ` Masami Hiramatsu
2017-01-19  6:47   ` Masami Hiramatsu
2017-02-01 21:46     ` Luis R. Rodriguez
2017-02-02  3:00       ` Steven Rostedt
2017-02-03 23:24         ` Luis R. Rodriguez

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).