diff mbox

[RFC,v2,14/26] early kprobes: ARM: introduce early kprobes related code area.

Message ID 1423743635-12629-1-git-send-email-wangnan0@huawei.com (mailing list archive)
State New, archived
Headers show

Commit Message

Wang Nan Feb. 12, 2015, 12:20 p.m. UTC
In arm's vmlinux.lds, introduces code area inside text section.
Executable area used by early kprobes will be allocated from there.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
---
 arch/arm/include/asm/kprobes.h | 31 +++++++++++++++++++++++++++++--
 arch/arm/kernel/vmlinux.lds.S  |  2 ++
 2 files changed, 31 insertions(+), 2 deletions(-)

Comments

Russell King - ARM Linux Feb. 13, 2015, 5:32 p.m. UTC | #1
On Thu, Feb 12, 2015 at 08:20:35PM +0800, Wang Nan wrote:
> In arm's vmlinux.lds, introduces code area inside text section.
> Executable area used by early kprobes will be allocated from there.
> 
> Signed-off-by: Wang Nan <wangnan0@huawei.com>
> ---
>  arch/arm/include/asm/kprobes.h | 31 +++++++++++++++++++++++++++++--
>  arch/arm/kernel/vmlinux.lds.S  |  2 ++
>  2 files changed, 31 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm/include/asm/kprobes.h b/arch/arm/include/asm/kprobes.h
> index 3ea9be5..0a4421e 100644
> --- a/arch/arm/include/asm/kprobes.h
> +++ b/arch/arm/include/asm/kprobes.h
> @@ -17,16 +17,42 @@
>  #define _ARM_KPROBES_H
>  
>  #include <linux/types.h>
> -#include <linux/ptrace.h>
> -#include <linux/notifier.h>
>  
>  #define __ARCH_WANT_KPROBES_INSN_SLOT
>  #define MAX_INSN_SIZE			2
>  
> +#ifdef __ASSEMBLY__
> +
> +#define KPROBE_OPCODE_SIZE	4
> +#define MAX_OPTINSN_SIZE (optprobe_template_end - optprobe_template_entry)
> +
> +#ifdef CONFIG_EARLY_KPROBES
> +#define EARLY_KPROBES_CODES_AREA					\
> +	. = ALIGN(8);							\
> +	VMLINUX_SYMBOL(__early_kprobes_start) = .;			\
> +	VMLINUX_SYMBOL(__early_kprobes_code_area_start) = .;		\
> +	. = . + MAX_OPTINSN_SIZE * CONFIG_NR_EARLY_KPROBES_SLOTS;	\
> +	VMLINUX_SYMBOL(__early_kprobes_code_area_end) = .;		\
> +	. = ALIGN(8);							\
> +	VMLINUX_SYMBOL(__early_kprobes_insn_slot_start) = .;		\
> +	. = . + MAX_INSN_SIZE * KPROBE_OPCODE_SIZE * CONFIG_NR_EARLY_KPROBES_SLOTS;\
> +	VMLINUX_SYMBOL(__early_kprobes_insn_slot_end) = .;		\
> +	VMLINUX_SYMBOL(__early_kprobes_end) = .;
> +
> +#else
> +#define EARLY_KPROBES_CODES_AREA
> +#endif

Please don't spread vmlinux specific stuff around the kernel include files.
Let's try to keep it contained to a minimal set of files.
Wang Nan Feb. 15, 2015, 8:26 a.m. UTC | #2
This is part of early kprobes patch series update. Full series can be
found from [1].

Early kprobes need some statically allocated slots, which is determined
during linking by vmlinux.lds.S. Russell King suggests me not to spread
vmlinux stuff around the kernel include files. This series tries to
extract common code to include/asm-generic/vmlinux.lds.h and let arch
dependent code define macros common code requires.

[1]: https://lkml.org/lkml/2015/2/13/24

Wang Nan (3):
  early kprobes: ARM: add definition for vmlinux.lds use.
  early kprobes: x86: add definition for vmlinux.lds use.
  early kprobes: introduce early kprobes related code area.

 arch/arm/kernel/vmlinux.lds.S     | 10 ++++++++++
 arch/x86/kernel/vmlinux.lds.S     | 10 ++++++++++
 include/asm-generic/vmlinux.lds.h | 19 ++++++++++++++++++-
 3 files changed, 38 insertions(+), 1 deletion(-)
diff mbox

Patch

diff --git a/arch/arm/include/asm/kprobes.h b/arch/arm/include/asm/kprobes.h
index 3ea9be5..0a4421e 100644
--- a/arch/arm/include/asm/kprobes.h
+++ b/arch/arm/include/asm/kprobes.h
@@ -17,16 +17,42 @@ 
 #define _ARM_KPROBES_H
 
 #include <linux/types.h>
-#include <linux/ptrace.h>
-#include <linux/notifier.h>
 
 #define __ARCH_WANT_KPROBES_INSN_SLOT
 #define MAX_INSN_SIZE			2
 
+#ifdef __ASSEMBLY__
+
+#define KPROBE_OPCODE_SIZE	4
+#define MAX_OPTINSN_SIZE (optprobe_template_end - optprobe_template_entry)
+
+#ifdef CONFIG_EARLY_KPROBES
+#define EARLY_KPROBES_CODES_AREA					\
+	. = ALIGN(8);							\
+	VMLINUX_SYMBOL(__early_kprobes_start) = .;			\
+	VMLINUX_SYMBOL(__early_kprobes_code_area_start) = .;		\
+	. = . + MAX_OPTINSN_SIZE * CONFIG_NR_EARLY_KPROBES_SLOTS;	\
+	VMLINUX_SYMBOL(__early_kprobes_code_area_end) = .;		\
+	. = ALIGN(8);							\
+	VMLINUX_SYMBOL(__early_kprobes_insn_slot_start) = .;		\
+	. = . + MAX_INSN_SIZE * KPROBE_OPCODE_SIZE * CONFIG_NR_EARLY_KPROBES_SLOTS;\
+	VMLINUX_SYMBOL(__early_kprobes_insn_slot_end) = .;		\
+	VMLINUX_SYMBOL(__early_kprobes_end) = .;
+
+#else
+#define EARLY_KPROBES_CODES_AREA
+#endif
+
+#else
+
+#include <linux/ptrace.h>
+#include <linux/notifier.h>
+
 #define flush_insn_slot(p)		do { } while (0)
 #define kretprobe_blacklist_size	0
 
 typedef u32 kprobe_opcode_t;
+#define KPROBE_OPCODE_SIZE	sizeof(kprobe_opcode_t)
 struct kprobe;
 #include <asm/probes.h>
 
@@ -83,4 +109,5 @@  struct arch_optimized_insn {
 	 */
 };
 
+#endif /* __ASSEMBLY__ */
 #endif /* _ARM_KPROBES_H */
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S
index 9351f7f..6fa2b85 100644
--- a/arch/arm/kernel/vmlinux.lds.S
+++ b/arch/arm/kernel/vmlinux.lds.S
@@ -11,6 +11,7 @@ 
 #ifdef CONFIG_ARM_KERNMEM_PERMS
 #include <asm/pgtable.h>
 #endif
+#include <asm/kprobes.h>
 	
 #define PROC_INFO							\
 	. = ALIGN(4);							\
@@ -108,6 +109,7 @@  SECTIONS
 			SCHED_TEXT
 			LOCK_TEXT
 			KPROBES_TEXT
+			EARLY_KPROBES_CODES_AREA
 			IDMAP_TEXT
 #ifdef CONFIG_MMU
 			*(.fixup)