1# SPDX-License-Identifier: GPL-2.0 2 3# Do not instrument the tracer itself: 4 5ccflags-remove-$(CONFIG_FUNCTION_TRACER) += $(CC_FLAGS_FTRACE) 6 7ifdef CONFIG_FUNCTION_TRACER 8 9# Avoid recursion due to instrumentation. 10KCSAN_SANITIZE := n 11 12ifdef CONFIG_FTRACE_SELFTEST 13# selftest needs instrumentation 14CFLAGS_trace_selftest_dynamic.o = $(CC_FLAGS_FTRACE) 15obj-y += trace_selftest_dynamic.o 16endif 17endif 18 19# Allow some files to be function traced 20ifdef CONFIG_FUNCTION_SELF_TRACING 21CFLAGS_trace_output.o = $(CC_FLAGS_FTRACE) 22CFLAGS_trace_seq.o = $(CC_FLAGS_FTRACE) 23CFLAGS_trace_stat.o = $(CC_FLAGS_FTRACE) 24CFLAGS_tracing_map.o = $(CC_FLAGS_FTRACE) 25CFLAGS_synth_event_gen_test.o = $(CC_FLAGS_FTRACE) 26CFLAGS_trace_events.o = $(CC_FLAGS_FTRACE) 27CFLAGS_trace_syscalls.o = $(CC_FLAGS_FTRACE) 28CFLAGS_trace_events_filter.o = $(CC_FLAGS_FTRACE) 29CFLAGS_trace_events_trigger.o = $(CC_FLAGS_FTRACE) 30CFLAGS_trace_events_synth.o = $(CC_FLAGS_FTRACE) 31CFLAGS_trace_events_hist.o = $(CC_FLAGS_FTRACE) 32CFLAGS_trace_events_user.o = $(CC_FLAGS_FTRACE) 33CFLAGS_trace_dynevent.o = $(CC_FLAGS_FTRACE) 34endif 35 36ifdef CONFIG_FTRACE_STARTUP_TEST 37CFLAGS_trace_kprobe_selftest.o = $(CC_FLAGS_FTRACE) 38obj-$(CONFIG_KPROBE_EVENTS) += trace_kprobe_selftest.o 39endif 40 41# If unlikely tracing is enabled, do not trace these files 42ifdef CONFIG_TRACING_BRANCHES 43KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING 44endif 45 46# for GCOV coverage profiling 47ifdef CONFIG_GCOV_PROFILE_FTRACE 48GCOV_PROFILE := y 49endif 50 51# Functions in this file could be invoked from early interrupt 52# code and produce random code coverage. 53KCOV_INSTRUMENT_trace_preemptirq.o := n 54 55CFLAGS_bpf_trace.o := -I$(src) 56 57CFLAGS_trace_benchmark.o := -I$(src) 58CFLAGS_trace_events_filter.o := -I$(src) 59 60obj-$(CONFIG_TRACE_CLOCK) += trace_clock.o 61 62obj-$(CONFIG_FUNCTION_TRACER) += libftrace.o 63obj-$(CONFIG_RING_BUFFER) += ring_buffer.o 64obj-$(CONFIG_RING_BUFFER_BENCHMARK) += ring_buffer_benchmark.o 65 66obj-$(CONFIG_TRACING) += trace.o 67obj-$(CONFIG_TRACING) += trace_output.o 68obj-$(CONFIG_TRACING) += trace_seq.o 69obj-$(CONFIG_TRACING) += trace_stat.o 70obj-$(CONFIG_TRACING) += trace_printk.o 71obj-$(CONFIG_TRACING) += trace_pid.o 72obj-$(CONFIG_TRACING) += pid_list.o 73obj-$(CONFIG_TRACING_MAP) += tracing_map.o 74obj-$(CONFIG_PREEMPTIRQ_DELAY_TEST) += preemptirq_delay_test.o 75obj-$(CONFIG_SYNTH_EVENT_GEN_TEST) += synth_event_gen_test.o 76obj-$(CONFIG_KPROBE_EVENT_GEN_TEST) += kprobe_event_gen_test.o 77obj-$(CONFIG_CONTEXT_SWITCH_TRACER) += trace_sched_switch.o 78obj-$(CONFIG_FUNCTION_TRACER) += trace_functions.o 79obj-$(CONFIG_PREEMPTIRQ_TRACEPOINTS) += trace_preemptirq.o 80obj-$(CONFIG_IRQSOFF_TRACER) += trace_irqsoff.o 81obj-$(CONFIG_PREEMPT_TRACER) += trace_irqsoff.o 82obj-$(CONFIG_SCHED_TRACER) += trace_sched_wakeup.o 83obj-$(CONFIG_HWLAT_TRACER) += trace_hwlat.o 84obj-$(CONFIG_OSNOISE_TRACER) += trace_osnoise.o 85obj-$(CONFIG_NOP_TRACER) += trace_nop.o 86obj-$(CONFIG_STACK_TRACER) += trace_stack.o 87obj-$(CONFIG_MMIOTRACE) += trace_mmiotrace.o 88obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += trace_functions_graph.o 89obj-$(CONFIG_TRACE_BRANCH_PROFILING) += trace_branch.o 90obj-$(CONFIG_BLK_DEV_IO_TRACE) += blktrace.o 91obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += fgraph.o 92ifeq ($(CONFIG_BLOCK),y) 93obj-$(CONFIG_EVENT_TRACING) += blktrace.o 94endif 95obj-$(CONFIG_EVENT_TRACING) += trace_events.o 96obj-$(CONFIG_EVENT_TRACING) += trace_export.o 97obj-$(CONFIG_FTRACE_SYSCALLS) += trace_syscalls.o 98ifeq ($(CONFIG_PERF_EVENTS),y) 99obj-$(CONFIG_EVENT_TRACING) += trace_event_perf.o 100endif 101obj-$(CONFIG_EVENT_TRACING) += trace_events_filter.o 102obj-$(CONFIG_EVENT_TRACING) += trace_events_trigger.o 103obj-$(CONFIG_EPROBE_EVENTS) += trace_eprobe.o 104obj-$(CONFIG_TRACE_EVENT_INJECT) += trace_events_inject.o 105obj-$(CONFIG_SYNTH_EVENTS) += trace_events_synth.o 106obj-$(CONFIG_HIST_TRIGGERS) += trace_events_hist.o 107obj-$(CONFIG_USER_EVENTS) += trace_events_user.o 108obj-$(CONFIG_BPF_EVENTS) += bpf_trace.o 109obj-$(CONFIG_KPROBE_EVENTS) += trace_kprobe.o 110obj-$(CONFIG_TRACEPOINTS) += error_report-traces.o 111obj-$(CONFIG_TRACEPOINTS) += power-traces.o 112ifeq ($(CONFIG_PM),y) 113obj-$(CONFIG_TRACEPOINTS) += rpm-traces.o 114endif 115ifeq ($(CONFIG_TRACING),y) 116obj-$(CONFIG_KGDB_KDB) += trace_kdb.o 117endif 118obj-$(CONFIG_DYNAMIC_EVENTS) += trace_dynevent.o 119obj-$(CONFIG_PROBE_EVENTS) += trace_probe.o 120obj-$(CONFIG_PROBE_EVENTS_BTF_ARGS) += trace_btf.o 121obj-$(CONFIG_UPROBE_EVENTS) += trace_uprobe.o 122obj-$(CONFIG_BOOTTIME_TRACING) += trace_boot.o 123obj-$(CONFIG_FTRACE_RECORD_RECURSION) += trace_recursion_record.o 124obj-$(CONFIG_FPROBE) += fprobe.o 125obj-$(CONFIG_RETHOOK) += rethook.o 126obj-$(CONFIG_FPROBE_EVENTS) += trace_fprobe.o 127 128obj-$(CONFIG_TRACEPOINT_BENCHMARK) += trace_benchmark.o 129obj-$(CONFIG_RV) += rv/ 130 131obj-$(CONFIG_TRACE_REMOTE) += trace_remote.o 132obj-$(CONFIG_SIMPLE_RING_BUFFER) += simple_ring_buffer.o 133obj-$(CONFIG_TRACE_REMOTE_TEST) += remote_test.o 134 135# 136# simple_ring_buffer is used by the pKVM hypervisor which does not have access 137# to all kernel symbols. Fail the build if forbidden symbols are found. 138# 139# undefsyms_base generates a set of compiler and tooling-generated symbols that can 140# safely be ignored for simple_ring_buffer. 141# 142filechk_undefsyms_base = \ 143 echo '$(pound)include <linux/atomic.h>'; \ 144 echo '$(pound)include <linux/string.h>'; \ 145 echo '$(pound)include <asm/page.h>'; \ 146 echo 'static char page[PAGE_SIZE] __aligned(PAGE_SIZE);'; \ 147 echo 'void undefsyms_base(void *p, int n);'; \ 148 echo 'void undefsyms_base(void *p, int n) {'; \ 149 echo ' char buffer[256] = { 0 };'; \ 150 echo ' u32 u = 0;'; \ 151 echo ' memset((char * volatile)page, 8, PAGE_SIZE);'; \ 152 echo ' memset((char * volatile)buffer, 8, sizeof(buffer));'; \ 153 echo ' memcpy((void * volatile)p, buffer, sizeof(buffer));'; \ 154 echo ' cmpxchg((u32 * volatile)&u, 0, 8);'; \ 155 echo ' WARN_ON(n == 0xdeadbeef);'; \ 156 echo '}' 157 158$(obj)/undefsyms_base.c: FORCE 159 $(call filechk,undefsyms_base) 160 161clean-files += undefsyms_base.c 162 163$(obj)/undefsyms_base.o: $(obj)/undefsyms_base.c 164 165targets += undefsyms_base.o 166 167# Ensure KASAN is enabled to avoid logic that may disable FORTIFY_SOURCE when 168# KASAN is not enabled. undefsyms_base.o does not automatically get KASAN flags 169# because it is not linked into vmlinux. 170KASAN_SANITIZE_undefsyms_base.o := y 171 172UNDEFINED_ALLOWLIST = __asan __gcov __kasan __kcsan __hwasan __sancov __sanitizer __tsan __ubsan __x86_indirect_thunk \ 173 __msan simple_ring_buffer \ 174 $(shell $(NM) -u $(obj)/undefsyms_base.o 2>/dev/null | awk '{print $$2}') 175 176quiet_cmd_check_undefined = NM $< 177 cmd_check_undefined = \ 178 undefsyms=$$($(NM) -u $< | grep -v $(addprefix -e , $(UNDEFINED_ALLOWLIST)) || true); \ 179 if [ -n "$$undefsyms" ]; then \ 180 echo "Unexpected symbols in $<:" >&2; \ 181 echo "$$undefsyms" >&2; \ 182 false; \ 183 fi 184 185$(obj)/%.o.checked: $(obj)/%.o $(obj)/undefsyms_base.o FORCE 186 $(call if_changed,check_undefined) 187 188always-$(CONFIG_SIMPLE_RING_BUFFER) += simple_ring_buffer.o.checked 189 190libftrace-y := ftrace.o 191