=== Ftrace unit tests ===
[1] Basic trace file check [PASS]
[2] Basic test for tracers [PASS]
[3] Basic trace clock test [PASS]
[4] Basic event tracing check [PASS]
[5] event tracing - enable/disable with event level files [PASS]
[6] event tracing - restricts events based on pid [PASS]
[7] event tracing - enable/disable with subsystem level files [PASS]
[8] event tracing - enable/disable with top level files [PASS]
[9] ftrace - function graph filters with stack tracer [PASS]
[10] ftrace - function graph filters [PASS]
[11] ftrace - function glob filters [PASS]
[12] ftrace - function profiler with function tracing [PASS]
[13] Test creation and deletion of trace instances while setting an event [PASS]
[14] Test creation and deletion of trace instances [PASS]
[15] Kprobe dynamic event - adding and removing [PASS]
[16] Kprobe dynamic event - busy event check [PASS]
[17] Kprobe dynamic event with arguments [PASS]
[18] Kprobes event arguments with types [PASS]
[19] Kprobe dynamic event with function tracer [PASS]
[20] Kretprobe dynamic event with arguments [PASS]
[21] event trigger - test event enable/disable trigger [PASS]
[22] event trigger - test trigger filter [PASS]
[23] event trigger - test histogram modifiers [PASS]
[24] event trigger - test histogram trigger [PASS]
[25] event trigger - test multiple histogram triggers [PASS]
[26] event trigger - test snapshot-trigger [PASS]
[27] event trigger - test stacktrace-trigger [PASS]
[28] event trigger - test traceon/off trigger [PASS]
v5:
o Use ..rng.* instead of .rng.* as suggested by Nicholas Piggin.
This is the typical way to avoid clash with compiler generated
section.
o Replace section macros with section names
v4:
o arm64 build fixes with allmodconfig
o build fix suggested for avr32 with allnoconfig, otherwise we end up with:
arch/avr32/kernel/built-in.o: In function `save_full_context_ex':
(.ex.text+0x1c4): relocation truncated to fit: R_AVR32_16N_PCREL against
symbol `debug_trampoline' defined in .text.rng.kprobes.any section in
arch/avr32/kernel/built-in.o
arch/avr32/kernel/built-in.o: In function `debug_exit_work':
(.text.rng.kprobes.any+0xa8): relocation truncated to fit:
R_AVR32_16N_PCREL against `.ex.text'+3aa
make: *** [Makefile:953: vmlinux] Error 1
o open-code section use on scripts/ code -- folks to prefer the
simplicity over dealing with having more tool code access kernel
headers.
o NOPE: include #include <asm-generic/ranges.h> on compiler.h -- solves
a few 0-day compilation issues
v3:
o after v2 arch/arm/kernel/vmlinux-xip.lds.S got kprobe support,
this just removes the custom linker script reference to kprobes as
that is no longer needed with linker tables.
o split kprobe linker table and kprobe section ranges use into
two separate patches. This should make it easier to review and
also demos both distinct use types, one a linker table another
a simple section range.
v2: introduced this patch in this series
Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org>
---
arch/arc/kernel/vmlinux.lds.S | 1 -
arch/arm/kernel/entry-armv.S | 3 ++-
arch/arm/kernel/vmlinux-xip.lds.S | 1 -
arch/arm/kernel/vmlinux.lds.S | 1 -
arch/arm64/kernel/armv8_deprecated.c | 1 +
arch/arm64/kernel/probes/kprobes.c | 4 ++--
arch/arm64/kernel/vmlinux.lds.S | 1 -
arch/avr32/kernel/entry-avr32b.S | 13 +++++++++++--
arch/avr32/kernel/vmlinux.lds.S | 1 -
arch/blackfin/kernel/vmlinux.lds.S | 1 -
arch/c6x/kernel/vmlinux.lds.S | 1 -
arch/hexagon/kernel/vmlinux.lds.S | 1 -
arch/ia64/kernel/jprobes.S | 3 ++-
arch/ia64/kernel/vmlinux.lds.S | 1 -
arch/ia64/lib/flush.S | 6 +++---
arch/metag/kernel/vmlinux.lds.S | 1 -
arch/microblaze/kernel/vmlinux.lds.S | 1 -
arch/mips/kernel/vmlinux.lds.S | 1 -
arch/mn10300/kernel/vmlinux.lds.S | 1 -
arch/nios2/kernel/vmlinux.lds.S | 1 -
arch/openrisc/kernel/vmlinux.lds.S | 1 -
arch/parisc/kernel/vmlinux.lds.S | 1 -
arch/powerpc/include/asm/ppc_asm.h | 1 +
arch/powerpc/kernel/vmlinux.lds.S | 1 -
arch/s390/kernel/entry.S | 5 +++--
arch/s390/kernel/kprobes.c | 6 +++---
arch/s390/kernel/mcount.S | 3 ++-
arch/s390/kernel/vmlinux.lds.S | 1 -
arch/score/kernel/vmlinux.lds.S | 1 -
arch/sh/kernel/vmlinux.lds.S | 1 -
arch/sparc/kernel/vmlinux.lds.S | 1 -
arch/sparc/mm/ultra.S | 3 ++-
arch/tile/kernel/vmlinux.lds.S | 1 -
arch/x86/kernel/kprobes/core.c | 11 +++++------
arch/x86/kernel/vmlinux.lds.S | 1 -
include/asm-generic/kprobes.h | 3 ++-
include/asm-generic/sections.h | 2 --
include/asm-generic/vmlinux.lds.h | 2 +-
include/linux/kprobes.h | 3 +++
kernel/kprobes.c | 6 ++++--
scripts/mod/modpost.c | 2 +-
scripts/recordmcount.c | 2 +-
scripts/recordmcount.pl | 2 +-
43 files changed, 50 insertions(+), 54 deletions(-)
@@ -91,7 +91,6 @@ SECTIONS
SCHED_TEXT
CPUIDLE_TEXT
LOCK_TEXT
- KPROBES_TEXT
*(.fixup)
*(.gnu.warning)
}
@@ -34,6 +34,7 @@
#include "entry-header.S"
#include <asm/entry-macro-multi.S>
#include <asm/probes.h>
+#include <asm/ranges.h>
/*
* Interrupt handling.
@@ -83,7 +84,7 @@
.endm
#ifdef CONFIG_KPROBES
- .section .kprobes.text,"ax",%progbits
+ set_section_rng_type(.text, kprobes, ax, %progbits)
#else
.text
#endif
@@ -103,7 +103,6 @@ SECTIONS
SCHED_TEXT
CPUIDLE_TEXT
LOCK_TEXT
- KPROBES_TEXT
*(.gnu.warning)
*(.glue_7)
*(.glue_7t)
@@ -114,7 +114,6 @@ SECTIONS
CPUIDLE_TEXT
LOCK_TEXT
HYPERVISOR_TEXT
- KPROBES_TEXT
*(.gnu.warning)
*(.glue_7)
*(.glue_7t)
@@ -21,6 +21,7 @@
#include <asm/traps.h>
#include <linux/uaccess.h>
#include <asm/cpufeature.h>
+#include <asm/kprobes.h>
#define CREATE_TRACE_POINTS
#include "trace-events-emulation.h"
@@ -23,6 +23,7 @@
#include <linux/slab.h>
#include <linux/stop_machine.h>
#include <linux/stringify.h>
+#include <linux/ranges.h>
#include <asm/traps.h>
#include <asm/ptrace.h>
#include <asm/cacheflush.h>
@@ -540,8 +541,7 @@ int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
bool arch_within_kprobe_blacklist(unsigned long addr)
{
- if ((addr >= (unsigned long)__kprobes_text_start &&
- addr < (unsigned long)__kprobes_text_end) ||
+ if (SECTION_RANGE_ADDR_WITHIN(kprobes, addr) ||
(addr >= (unsigned long)__entry_text_start &&
addr < (unsigned long)__entry_text_end) ||
(addr >= (unsigned long)__idmap_text_start &&
@@ -124,7 +124,6 @@ SECTIONS
SCHED_TEXT
CPUIDLE_TEXT
LOCK_TEXT
- KPROBES_TEXT
HYPERVISOR_TEXT
IDMAP_TEXT
HIBERNATE_TEXT
@@ -23,6 +23,7 @@
#include <asm/sysreg.h>
#include <asm/thread_info.h>
#include <asm/unistd.h>
+#include <asm/ranges.h>
#ifdef CONFIG_PREEMPT
# define preempt_stop mask_interrupts
@@ -605,7 +606,11 @@ fault_exit_work:
brcc fault_resume_user
rjmp enter_monitor_mode
- .section .kprobes.text, "ax", @progbits
+#ifdef CONFIG_KPROBES
+ set_section_rng_type(.text, kprobes, ax, @progbits)
+#else
+ .text
+#endif
.type handle_debug, @function
handle_debug:
sub sp, 4 /* r12_orig */
@@ -826,7 +831,11 @@ irq_level\level:
IRQ_LEVEL 2
IRQ_LEVEL 3
- .section .kprobes.text, "ax", @progbits
+#ifdef CONFIG_KPROBES
+ set_section_rng_type(.text, kprobes, ax, @progbits)
+#else
+ .text
+#endif
.type enter_monitor_mode, @function
enter_monitor_mode:
/*
@@ -49,7 +49,6 @@ SECTIONS
_stext = .;
*(.ex.text)
*(.irq.text)
- KPROBES_TEXT
TEXT_TEXT
SCHED_TEXT
CPUIDLE_TEXT
@@ -37,7 +37,6 @@ SECTIONS
LOCK_TEXT
IRQENTRY_TEXT
SOFTIRQENTRY_TEXT
- KPROBES_TEXT
#ifdef CONFIG_ROMKERNEL
__sinittext = .;
INIT_TEXT
@@ -74,7 +74,6 @@ SECTIONS
LOCK_TEXT
IRQENTRY_TEXT
SOFTIRQENTRY_TEXT
- KPROBES_TEXT
*(.fixup)
*(.gnu.warning)
}
@@ -52,7 +52,6 @@ SECTIONS
SCHED_TEXT
CPUIDLE_TEXT
LOCK_TEXT
- KPROBES_TEXT
*(.fixup)
}
_etext = .;
@@ -46,11 +46,12 @@
*/
#include <asm/asmmacro.h>
#include <asm/break.h>
+#include <asm/ranges.h>
/*
* void jprobe_break(void)
*/
- .section .kprobes.text, "ax"
+ set_section_rng(.text, kprobes, ax)
ENTRY(jprobe_break)
break.m __IA64_BREAK_JPROBE
END(jprobe_break)
@@ -48,7 +48,6 @@ SECTIONS {
SCHED_TEXT
CPUIDLE_TEXT
LOCK_TEXT
- KPROBES_TEXT
*(.gnu.linkonce.t*)
}
@@ -9,7 +9,7 @@
#include <asm/asmmacro.h>
#include <asm/export.h>
-
+#include <asm/ranges.h>
/*
* flush_icache_range(start,end)
@@ -21,7 +21,7 @@
*
* Note: "in0" and "in1" are preserved for debugging purposes.
*/
- .section .kprobes.text,"ax"
+ set_section_rng(.text, kprobes, ax)
GLOBAL_ENTRY(flush_icache_range)
.prologue
@@ -74,7 +74,7 @@ EXPORT_SYMBOL_GPL(flush_icache_range)
*
* Note: "in0" and "in1" are preserved for debugging purposes.
*/
- .section .kprobes.text,"ax"
+ set_section_rng(.text, kprobes, ax)
GLOBAL_ENTRY(clflush_cache_range)
.prologue
@@ -23,7 +23,6 @@ SECTIONS
SCHED_TEXT
CPUIDLE_TEXT
LOCK_TEXT
- KPROBES_TEXT
IRQENTRY_TEXT
SOFTIRQENTRY_TEXT
*(.text.*)
@@ -35,7 +35,6 @@ SECTIONS {
SCHED_TEXT
CPUIDLE_TEXT
LOCK_TEXT
- KPROBES_TEXT
IRQENTRY_TEXT
SOFTIRQENTRY_TEXT
. = ALIGN (4) ;
@@ -57,7 +57,6 @@ SECTIONS
SCHED_TEXT
CPUIDLE_TEXT
LOCK_TEXT
- KPROBES_TEXT
IRQENTRY_TEXT
SOFTIRQENTRY_TEXT
*(.text.*)
@@ -32,7 +32,6 @@ SECTIONS
SCHED_TEXT
CPUIDLE_TEXT
LOCK_TEXT
- KPROBES_TEXT
*(.fixup)
*(.gnu.warning)
} = 0xcb
@@ -41,7 +41,6 @@ SECTIONS
LOCK_TEXT
IRQENTRY_TEXT
SOFTIRQENTRY_TEXT
- KPROBES_TEXT
} =0
_etext = .;
@@ -57,7 +57,6 @@ SECTIONS
SCHED_TEXT
CPUIDLE_TEXT
LOCK_TEXT
- KPROBES_TEXT
IRQENTRY_TEXT
SOFTIRQENTRY_TEXT
*(.fixup)
@@ -71,7 +71,6 @@ SECTIONS
SCHED_TEXT
CPUIDLE_TEXT
LOCK_TEXT
- KPROBES_TEXT
IRQENTRY_TEXT
SOFTIRQENTRY_TEXT
*(.text.do_softirq)
@@ -9,6 +9,7 @@
#include <asm/processor.h>
#include <asm/ppc-opcode.h>
#include <asm/firmware.h>
+#include <asm/ranges.h>
#ifdef __ASSEMBLY__
@@ -112,7 +112,6 @@ SECTIONS
SCHED_TEXT
CPUIDLE_TEXT
LOCK_TEXT
- KPROBES_TEXT
IRQENTRY_TEXT
SOFTIRQENTRY_TEXT
MEM_KEEP(init.text)
@@ -24,6 +24,7 @@
#include <asm/setup.h>
#include <asm/nmi.h>
#include <asm/export.h>
+#include <asm/ranges.h>
__PT_R0 = __PT_GPRS
__PT_R1 = __PT_GPRS + 8
@@ -169,7 +170,7 @@ _PIF_WORK = (_PIF_PER_TRAP)
tm off+\addr, \mask
.endm
- .section .kprobes.text, "ax"
+ set_section_rng(.text, kprobes, ax)
.Ldummy:
/*
* This nop exists only in order to avoid that __switch_to starts at
@@ -986,7 +987,7 @@ ENTRY(restart_int_handler)
brc 2,2b
3: j 3b
- .section .kprobes.text, "ax"
+ set_section_rng(.text, kprobes, ax)
#ifdef CONFIG_CHECK_STACK
/*
@@ -289,9 +289,9 @@ static void kprobe_reenter_check(struct kprobe_ctlblk *kcb, struct kprobe *p)
case KPROBE_REENTER:
default:
/*
- * A kprobe on the code path to single step an instruction
- * is a BUG. The code path resides in the .kprobes.text
- * section and is executed with interrupts disabled.
+ * A kprobe on the code path to single step an instruction is a
+ * BUG. The code path resides in the kprobes section range and
+ * is executed with interrupts disabled.
*/
printk(KERN_EMERG "Invalid kprobe detected at %p.\n", p->addr);
dump_kprobe(p);
@@ -10,8 +10,9 @@
#include <asm/ftrace.h>
#include <asm/ptrace.h>
#include <asm/export.h>
+#include <asm/ranges.h>
- .section .kprobes.text, "ax"
+ set_section_rng(.text, kprobes, ax)
ENTRY(ftrace_stub)
br %r14
@@ -37,7 +37,6 @@ SECTIONS
SCHED_TEXT
CPUIDLE_TEXT
LOCK_TEXT
- KPROBES_TEXT
IRQENTRY_TEXT
SOFTIRQENTRY_TEXT
*(.fixup)
@@ -42,7 +42,6 @@ SECTIONS
SCHED_TEXT
CPUIDLE_TEXT
LOCK_TEXT
- KPROBES_TEXT
*(.text.*)
*(.fixup)
. = ALIGN (4) ;
@@ -38,7 +38,6 @@ SECTIONS
SCHED_TEXT
CPUIDLE_TEXT
LOCK_TEXT
- KPROBES_TEXT
IRQENTRY_TEXT
SOFTIRQENTRY_TEXT
*(.fixup)
@@ -51,7 +51,6 @@ SECTIONS
SCHED_TEXT
CPUIDLE_TEXT
LOCK_TEXT
- KPROBES_TEXT
IRQENTRY_TEXT
SOFTIRQENTRY_TEXT
*(.gnu.warning)
@@ -16,6 +16,7 @@
#include <asm/cacheflush.h>
#include <asm/hypervisor.h>
#include <asm/cpudata.h>
+#include <asm/ranges.h>
/* Basically, most of the Spitfire vs. Cheetah madness
* has to do with the fact that Cheetah does not support
@@ -185,7 +186,7 @@ __spitfire_flush_tlb_mm_slow:
/*
* The following code flushes one page_size worth.
*/
- .section .kprobes.text, "ax"
+ set_section_rng(.text, kprobes, ax)
.align 32
.globl __flush_icache_page
__flush_icache_page: /* %o0 = phys_page */
@@ -44,7 +44,6 @@ SECTIONS
SCHED_TEXT
CPUIDLE_TEXT
LOCK_TEXT
- KPROBES_TEXT
IRQENTRY_TEXT
SOFTIRQENTRY_TEXT
__fix_text_end = .; /* tile-cpack won't rearrange before this */
@@ -580,9 +580,9 @@ static int reenter_kprobe(struct kprobe *p, struct pt_regs *regs,
case KPROBE_REENTER:
/* A probe has been hit in the codepath leading up to, or just
* after, single-stepping of a probed instruction. This entire
- * codepath should strictly reside in .kprobes.text section.
- * Raise a BUG or we'll continue in an endless reentering loop
- * and eventually a stack overflow.
+ * codepath should strictly reside in the kprobes section
+ * range. Raise a BUG or we'll continue in an endless
+ * reentering loop and eventually a stack overflow.
*/
printk(KERN_WARNING "Unrecoverable kprobe detected at %p.\n",
p->addr);
@@ -1133,10 +1133,9 @@ NOKPROBE_SYMBOL(longjmp_break_handler);
bool arch_within_kprobe_blacklist(unsigned long addr)
{
- return (addr >= (unsigned long)__kprobes_text_start &&
- addr < (unsigned long)__kprobes_text_end) ||
+ return (SECTION_RANGE_ADDR_WITHIN(kprobes, addr) ||
(addr >= (unsigned long)__entry_text_start &&
- addr < (unsigned long)__entry_text_end);
+ addr < (unsigned long)__entry_text_end));
}
int __init arch_init_kprobes(void)
@@ -99,7 +99,6 @@ SECTIONS
SCHED_TEXT
CPUIDLE_TEXT
LOCK_TEXT
- KPROBES_TEXT
ENTRY_TEXT
IRQENTRY_TEXT
SOFTIRQENTRY_TEXT
@@ -3,6 +3,7 @@
#if defined(__KERNEL__) && !defined(__ASSEMBLY__)
#ifdef CONFIG_KPROBES
+#include <asm/ranges.h>
/*
* Blacklist ganerating macro. Specify functions which is not probed
* by using this macro.
@@ -13,7 +14,7 @@ static unsigned long __used \
_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 __kprobes __LINUX_RANGE(.text, kprobes)
# define nokprobe_inline __always_inline
#else
# define NOKPROBE_SYMBOL(fname)
@@ -26,7 +26,6 @@
* Following global variables are optional and may be unavailable on some
* architectures and/or kernel configurations.
* _text, _data
- * __kprobes_text_start, __kprobes_text_end
* __entry_text_start, __entry_text_end
* __ctors_start, __ctors_end
*/
@@ -38,7 +37,6 @@ extern char _sinittext[], _einittext[];
extern char __start_data_ro_after_init[], __end_data_ro_after_init[];
extern char _end[];
extern char __per_cpu_load[], __per_cpu_start[], __per_cpu_end[];
-extern char __kprobes_text_start[], __kprobes_text_end[];
extern char __entry_text_start[], __entry_text_end[];
extern char __start_rodata[], __end_rodata[];
@@ -471,7 +471,7 @@
#define KPROBES_TEXT \
ALIGN_FUNCTION(); \
VMLINUX_SYMBOL(__kprobes_text_start) = .; \
- *(.kprobes.text) \
+ *(.text..rng.kprobes.any) \
VMLINUX_SYMBOL(__kprobes_text_end) = .;
#define ENTRY_TEXT \
@@ -43,6 +43,9 @@
#include <asm/kprobes.h>
#ifdef CONFIG_KPROBES
+#include <linux/ranges.h>
+
+DECLARE_SECTION_RANGE(kprobes);
/* kprobe_status settings */
#define KPROBE_HIT_ACTIVE 0x00000001
@@ -1328,8 +1328,7 @@ static int register_aggr_kprobe(struct kprobe *orig_p, struct kprobe *p)
bool __weak arch_within_kprobe_blacklist(unsigned long addr)
{
/* The __kprobes marked functions and entry code must not be probed */
- return addr >= (unsigned long)__kprobes_text_start &&
- addr < (unsigned long)__kprobes_text_end;
+ return SECTION_RANGE_ADDR_WITHIN(kprobes, addr);
}
bool within_kprobe_blacklist(unsigned long addr)
@@ -2129,6 +2128,9 @@ static struct notifier_block kprobe_module_nb = {
extern unsigned long __start_kprobe_blacklist[];
extern unsigned long __stop_kprobe_blacklist[];
+/* Actual kprobes section range */
+DEFINE_SECTION_RANGE(kprobes, .text);
+
static int __init init_kprobes(void)
{
int i, err = 0;
@@ -894,7 +894,7 @@ static void check_section(const char *modname, struct elf_info *elf,
#define DATA_SECTIONS ".data", ".data.rel"
#define TEXT_SECTIONS ".text", ".text.unlikely", ".sched.text", \
- ".kprobes.text", ".cpuidle.text"
+ ".text..rng.kprobes.any", ".cpuidle.text"
#define OTHER_TEXT_SECTIONS ".ref.text", ".head.text", ".spinlock.text", \
".fixup", ".entry.text", ".exception.text", ".text.*", \
".coldtext"
@@ -417,7 +417,7 @@ is_mcounted_section_name(char const *const txtname)
strcmp(".spinlock.text", txtname) == 0 ||
strcmp(".irqentry.text", txtname) == 0 ||
strcmp(".softirqentry.text", txtname) == 0 ||
- strcmp(".kprobes.text", txtname) == 0 ||
+ strcmp(".text..rng.kprobes.any", txtname) == 0 ||
strcmp(".cpuidle.text", txtname) == 0 ||
strcmp(".text.unlikely", txtname) == 0;
}
@@ -135,7 +135,7 @@ my %text_sections = (
".spinlock.text" => 1,
".irqentry.text" => 1,
".softirqentry.text" => 1,
- ".kprobes.text" => 1,
+ ".text..rng.kprobes.any" => 1,
".cpuidle.text" => 1,
".text.unlikely" => 1,
);