12b86062aSMasami Hiramatsu#!/bin/sh
22b86062aSMasami Hiramatsu# SPDX-License-Identifier: GPL-2.0-only
32b86062aSMasami Hiramatsu
42b86062aSMasami Hiramatsuusage() {
52b86062aSMasami Hiramatsu	echo "Dump boot-time tracing bootconfig from ftrace"
62b86062aSMasami Hiramatsu	echo "Usage: $0 [--debug] [ > BOOTCONFIG-FILE]"
72b86062aSMasami Hiramatsu	exit 1
82b86062aSMasami Hiramatsu}
92b86062aSMasami Hiramatsu
102b86062aSMasami HiramatsuDEBUG=
112b86062aSMasami Hiramatsuwhile [ x"$1" != x ]; do
122b86062aSMasami Hiramatsu	case "$1" in
132b86062aSMasami Hiramatsu	"--debug")
142b86062aSMasami Hiramatsu		DEBUG=$1;;
152b86062aSMasami Hiramatsu	-*)
162b86062aSMasami Hiramatsu		usage
172b86062aSMasami Hiramatsu		;;
182b86062aSMasami Hiramatsu	esac
192b86062aSMasami Hiramatsu	shift 1
202b86062aSMasami Hiramatsudone
212b86062aSMasami Hiramatsu
222b86062aSMasami Hiramatsuif [ x"$DEBUG" != x ]; then
232b86062aSMasami Hiramatsu	set -x
242b86062aSMasami Hiramatsufi
252b86062aSMasami Hiramatsu
262b86062aSMasami HiramatsuTRACEFS=`grep -m 1 -w tracefs /proc/mounts | cut -f 2 -d " "`
272b86062aSMasami Hiramatsuif [ -z "$TRACEFS" ]; then
282b86062aSMasami Hiramatsu	if ! grep -wq debugfs /proc/mounts; then
292b86062aSMasami Hiramatsu		echo "Error: No tracefs/debugfs was mounted."
302b86062aSMasami Hiramatsu		exit 1
312b86062aSMasami Hiramatsu	fi
322b86062aSMasami Hiramatsu	TRACEFS=`grep -m 1 -w debugfs /proc/mounts | cut -f 2 -d " "`/tracing
332b86062aSMasami Hiramatsu	if [ ! -d $TRACEFS ]; then
342b86062aSMasami Hiramatsu		echo "Error: ftrace is not enabled on this kernel." 1>&2
352b86062aSMasami Hiramatsu		exit 1
362b86062aSMasami Hiramatsu	fi
372b86062aSMasami Hiramatsufi
382b86062aSMasami Hiramatsu
392b86062aSMasami Hiramatsu######## main #########
402b86062aSMasami Hiramatsu
412b86062aSMasami Hiramatsuset -e
422b86062aSMasami Hiramatsu
432b86062aSMasami Hiramatsuemit_kv() { # key =|+= value
442b86062aSMasami Hiramatsu	echo "$@"
452b86062aSMasami Hiramatsu}
462b86062aSMasami Hiramatsu
472b86062aSMasami Hiramatsuglobal_options() {
482b86062aSMasami Hiramatsu	val=`cat $TRACEFS/max_graph_depth`
492b86062aSMasami Hiramatsu	[ $val != 0 ] && emit_kv kernel.fgraph_max_depth = $val
502b86062aSMasami Hiramatsu	if grep -qv "^#" $TRACEFS/set_graph_function $TRACEFS/set_graph_notrace ; then
512b86062aSMasami Hiramatsu		cat 1>&2 << EOF
522b86062aSMasami Hiramatsu# WARN: kernel.fgraph_filters and kernel.fgraph_notrace are not supported, since the wild card expression was expanded and lost from memory.
532b86062aSMasami HiramatsuEOF
542b86062aSMasami Hiramatsu	fi
552b86062aSMasami Hiramatsu}
562b86062aSMasami Hiramatsu
572b86062aSMasami Hiramatsukprobe_event_options() {
582b86062aSMasami Hiramatsu	cat $TRACEFS/kprobe_events | while read p args; do
592b86062aSMasami Hiramatsu		case $p in
602b86062aSMasami Hiramatsu		r*)
612b86062aSMasami Hiramatsu		cat 1>&2 << EOF
622b86062aSMasami Hiramatsu# WARN: A return probe found but it is not supported by bootconfig. Skip it.
632b86062aSMasami HiramatsuEOF
642b86062aSMasami Hiramatsu		continue;;
652b86062aSMasami Hiramatsu		esac
662b86062aSMasami Hiramatsu		p=${p#*:}
672b86062aSMasami Hiramatsu		event=${p#*/}
682b86062aSMasami Hiramatsu		group=${p%/*}
692b86062aSMasami Hiramatsu		if [ $group != "kprobes" ]; then
702b86062aSMasami Hiramatsu			cat 1>&2 << EOF
712b86062aSMasami Hiramatsu# WARN: kprobes group name $group is changed to "kprobes" for bootconfig.
722b86062aSMasami HiramatsuEOF
732b86062aSMasami Hiramatsu		fi
742b86062aSMasami Hiramatsu		emit_kv $PREFIX.event.kprobes.$event.probes += $args
752b86062aSMasami Hiramatsu	done
762b86062aSMasami Hiramatsu}
772b86062aSMasami Hiramatsu
782b86062aSMasami Hiramatsusynth_event_options() {
792b86062aSMasami Hiramatsu	cat $TRACEFS/synthetic_events | while read event fields; do
802b86062aSMasami Hiramatsu		emit_kv $PREFIX.event.synthetic.$event.fields = `echo $fields | sed "s/;/,/g"`
812b86062aSMasami Hiramatsu	done
822b86062aSMasami Hiramatsu}
832b86062aSMasami Hiramatsu
842b86062aSMasami Hiramatsu# Variables resolver
852b86062aSMasami HiramatsuDEFINED_VARS=
862b86062aSMasami HiramatsuUNRESOLVED_EVENTS=
872b86062aSMasami Hiramatsu
882b86062aSMasami Hiramatsudefined_vars() { # event-dir
892b86062aSMasami Hiramatsu	grep "^hist" $1/trigger | grep -o ':[a-zA-Z0-9]*='
902b86062aSMasami Hiramatsu}
912b86062aSMasami Hiramatsureferred_vars() {
922b86062aSMasami Hiramatsu	grep "^hist" $1/trigger | grep -o '$[a-zA-Z0-9]*'
932b86062aSMasami Hiramatsu}
942b86062aSMasami Hiramatsu
951eaad3acSMasami Hiramatsuevent_is_enabled() { # enable-file
96*cf8c59a3SAntonio Alvarez Feijoo	test -f $1 && grep -q "1" $1
971eaad3acSMasami Hiramatsu}
981eaad3acSMasami Hiramatsu
992b86062aSMasami Hiramatsuper_event_options() { # event-dir
1002b86062aSMasami Hiramatsu	evdir=$1
1012b86062aSMasami Hiramatsu	# Check the special event which has no filter and no trigger
1022b86062aSMasami Hiramatsu	[ ! -f $evdir/filter ] && return
1032b86062aSMasami Hiramatsu
1042b86062aSMasami Hiramatsu	if grep -q "^hist:" $evdir/trigger; then
1052b86062aSMasami Hiramatsu		# hist action can refer the undefined variables
1062b86062aSMasami Hiramatsu		__vars=`defined_vars $evdir`
1072b86062aSMasami Hiramatsu		for v in `referred_vars $evdir`; do
1082b86062aSMasami Hiramatsu			if echo $DEFINED_VARS $__vars | grep -vqw ${v#$}; then
1092b86062aSMasami Hiramatsu				# $v is not defined yet, defer it
1102b86062aSMasami Hiramatsu				UNRESOLVED_EVENTS="$UNRESOLVED_EVENTS $evdir"
1112b86062aSMasami Hiramatsu				return;
1122b86062aSMasami Hiramatsu			fi
1132b86062aSMasami Hiramatsu		done
1142b86062aSMasami Hiramatsu		DEFINED_VARS="$DEFINED_VARS "`defined_vars $evdir`
1152b86062aSMasami Hiramatsu	fi
1162b86062aSMasami Hiramatsu	grep -v "^#" $evdir/trigger | while read action active; do
1172b86062aSMasami Hiramatsu		emit_kv $PREFIX.event.$group.$event.actions += \'$action\'
1182b86062aSMasami Hiramatsu	done
1192b86062aSMasami Hiramatsu
1201eaad3acSMasami Hiramatsu	if [ $GROUP_ENABLED -eq 0 ] && event_is_enabled $evdir/enable; then
1211eaad3acSMasami Hiramatsu		emit_kv $PREFIX.event.$group.$event.enable
1221eaad3acSMasami Hiramatsu	fi
1232b86062aSMasami Hiramatsu	val=`cat $evdir/filter`
1242b86062aSMasami Hiramatsu	if [ "$val" != "none" ]; then
1252b86062aSMasami Hiramatsu		emit_kv $PREFIX.event.$group.$event.filter = "$val"
1262b86062aSMasami Hiramatsu	fi
1272b86062aSMasami Hiramatsu}
1282b86062aSMasami Hiramatsu
1292b86062aSMasami Hiramatsuretry_unresolved() {
1302b86062aSMasami Hiramatsu	unresolved=$UNRESOLVED_EVENTS
1312b86062aSMasami Hiramatsu	UNRESOLVED_EVENTS=
1322b86062aSMasami Hiramatsu	for evdir in $unresolved; do
1332b86062aSMasami Hiramatsu		event=${evdir##*/}
1342b86062aSMasami Hiramatsu		group=${evdir%/*}; group=${group##*/}
1352b86062aSMasami Hiramatsu		per_event_options $evdir
1362b86062aSMasami Hiramatsu	done
1372b86062aSMasami Hiramatsu}
1382b86062aSMasami Hiramatsu
1392b86062aSMasami Hiramatsuevent_options() {
1402b86062aSMasami Hiramatsu	# PREFIX and INSTANCE must be set
1412b86062aSMasami Hiramatsu	if [ $PREFIX = "ftrace" ]; then
1422b86062aSMasami Hiramatsu		# define the dynamic events
1432b86062aSMasami Hiramatsu		kprobe_event_options
1442b86062aSMasami Hiramatsu		synth_event_options
1452b86062aSMasami Hiramatsu	fi
1461eaad3acSMasami Hiramatsu	ALL_ENABLED=0
1471eaad3acSMasami Hiramatsu	if event_is_enabled $INSTANCE/events/enable; then
1481eaad3acSMasami Hiramatsu		emit_kv $PREFIX.event.enable
1491eaad3acSMasami Hiramatsu		ALL_ENABLED=1
1501eaad3acSMasami Hiramatsu	fi
1512b86062aSMasami Hiramatsu	for group in `ls $INSTANCE/events/` ; do
1522b86062aSMasami Hiramatsu		[ ! -d $INSTANCE/events/$group ] && continue
1531eaad3acSMasami Hiramatsu		GROUP_ENABLED=$ALL_ENABLED
1541eaad3acSMasami Hiramatsu		if [ $ALL_ENABLED -eq 0 ] && \
1551eaad3acSMasami Hiramatsu		   event_is_enabled $INSTANCE/events/$group/enable ;then
1561eaad3acSMasami Hiramatsu			emit_kv $PREFIX.event.$group.enable
1571eaad3acSMasami Hiramatsu			GROUP_ENABLED=1
1581eaad3acSMasami Hiramatsu		fi
1592b86062aSMasami Hiramatsu		for event in `ls $INSTANCE/events/$group/` ;do
1602b86062aSMasami Hiramatsu			[ ! -d $INSTANCE/events/$group/$event ] && continue
1612b86062aSMasami Hiramatsu			per_event_options $INSTANCE/events/$group/$event
1622b86062aSMasami Hiramatsu		done
1632b86062aSMasami Hiramatsu	done
1642b86062aSMasami Hiramatsu	retry=0
1652b86062aSMasami Hiramatsu	while [ $retry -lt 3 ]; do
1662b86062aSMasami Hiramatsu		retry_unresolved
1672b86062aSMasami Hiramatsu		retry=$((retry + 1))
1682b86062aSMasami Hiramatsu	done
1692b86062aSMasami Hiramatsu	if [ "$UNRESOLVED_EVENTS" ]; then
1702b86062aSMasami Hiramatsu		cat 1>&2 << EOF
1712b86062aSMasami Hiramatsu! ERROR: hist triggers in $UNRESOLVED_EVENTS use some undefined variables.
1722b86062aSMasami HiramatsuEOF
1732b86062aSMasami Hiramatsu	fi
1742b86062aSMasami Hiramatsu}
1752b86062aSMasami Hiramatsu
1762b86062aSMasami Hiramatsuis_default_trace_option() { # option
1772b86062aSMasami Hiramatsugrep -qw $1 << EOF
1782b86062aSMasami Hiramatsuprint-parent
1792b86062aSMasami Hiramatsunosym-offset
1802b86062aSMasami Hiramatsunosym-addr
1812b86062aSMasami Hiramatsunoverbose
1822b86062aSMasami Hiramatsunoraw
1832b86062aSMasami Hiramatsunohex
1842b86062aSMasami Hiramatsunobin
1852b86062aSMasami Hiramatsunoblock
1862b86062aSMasami Hiramatsutrace_printk
1872b86062aSMasami Hiramatsuannotate
1882b86062aSMasami Hiramatsunouserstacktrace
1892b86062aSMasami Hiramatsunosym-userobj
1902b86062aSMasami Hiramatsunoprintk-msg-only
1912b86062aSMasami Hiramatsucontext-info
1922b86062aSMasami Hiramatsunolatency-format
1932b86062aSMasami Hiramatsurecord-cmd
1942b86062aSMasami Hiramatsunorecord-tgid
1952b86062aSMasami Hiramatsuoverwrite
1962b86062aSMasami Hiramatsunodisable_on_free
1972b86062aSMasami Hiramatsuirq-info
1982b86062aSMasami Hiramatsumarkers
1992b86062aSMasami Hiramatsunoevent-fork
2002b86062aSMasami Hiramatsunopause-on-trace
2012b86062aSMasami Hiramatsufunction-trace
2022b86062aSMasami Hiramatsunofunction-fork
2032b86062aSMasami Hiramatsunodisplay-graph
2042b86062aSMasami Hiramatsunostacktrace
2052b86062aSMasami Hiramatsunotest_nop_accept
2062b86062aSMasami Hiramatsunotest_nop_refuse
2072b86062aSMasami HiramatsuEOF
2082b86062aSMasami Hiramatsu}
2092b86062aSMasami Hiramatsu
2102b86062aSMasami Hiramatsuinstance_options() { # [instance-name]
2112b86062aSMasami Hiramatsu	if [ $# -eq 0 ]; then
2122b86062aSMasami Hiramatsu		PREFIX="ftrace"
2132b86062aSMasami Hiramatsu		INSTANCE=$TRACEFS
2142b86062aSMasami Hiramatsu	else
2152b86062aSMasami Hiramatsu		PREFIX="ftrace.instance.$1"
2162b86062aSMasami Hiramatsu		INSTANCE=$TRACEFS/instances/$1
2172b86062aSMasami Hiramatsu	fi
2182b86062aSMasami Hiramatsu	val=
2192b86062aSMasami Hiramatsu	for i in `cat $INSTANCE/trace_options`; do
2202b86062aSMasami Hiramatsu		is_default_trace_option $i && continue
2212b86062aSMasami Hiramatsu		val="$val, $i"
2222b86062aSMasami Hiramatsu	done
2232b86062aSMasami Hiramatsu	[ "$val" ] && emit_kv $PREFIX.options = "${val#,}"
2242b86062aSMasami Hiramatsu	val="local"
2252b86062aSMasami Hiramatsu	for i in `cat $INSTANCE/trace_clock` ; do
2262b86062aSMasami Hiramatsu		[ "${i#*]}" ] && continue
2272b86062aSMasami Hiramatsu		i=${i%]}; val=${i#[}
2282b86062aSMasami Hiramatsu	done
2292b86062aSMasami Hiramatsu	[ $val != "local" ] && emit_kv $PREFIX.trace_clock = $val
2302b86062aSMasami Hiramatsu	val=`cat $INSTANCE/buffer_size_kb`
2312b86062aSMasami Hiramatsu	if echo $val | grep -vq "expanded" ; then
2322b86062aSMasami Hiramatsu		emit_kv $PREFIX.buffer_size = $val"KB"
2332b86062aSMasami Hiramatsu	fi
2342b86062aSMasami Hiramatsu	if grep -q "is allocated" $INSTANCE/snapshot ; then
2352b86062aSMasami Hiramatsu		emit_kv $PREFIX.alloc_snapshot
2362b86062aSMasami Hiramatsu	fi
2372b86062aSMasami Hiramatsu	val=`cat $INSTANCE/tracing_cpumask`
2382b86062aSMasami Hiramatsu	if [ `echo $val | sed -e s/f//g`x != x ]; then
2392b86062aSMasami Hiramatsu		emit_kv $PREFIX.cpumask = $val
2402b86062aSMasami Hiramatsu	fi
24155ed4560SMasami Hiramatsu	val=`cat $INSTANCE/tracing_on`
24232ba9f0fSMasami Hiramatsu	if [ "$val" = "0" ]; then
24332ba9f0fSMasami Hiramatsu		emit_kv $PREFIX.tracing_on = 0
24455ed4560SMasami Hiramatsu	fi
2452b86062aSMasami Hiramatsu
2462b86062aSMasami Hiramatsu	val=`cat $INSTANCE/current_tracer`
2472b86062aSMasami Hiramatsu	[ $val != nop ] && emit_kv $PREFIX.tracer = $val
2482b86062aSMasami Hiramatsu	if grep -qv "^#" $INSTANCE/set_ftrace_filter $INSTANCE/set_ftrace_notrace; then
2492b86062aSMasami Hiramatsu		cat 1>&2 << EOF
2502b86062aSMasami Hiramatsu# WARN: kernel.ftrace.filters and kernel.ftrace.notrace are not supported, since the wild card expression was expanded and lost from memory.
2512b86062aSMasami HiramatsuEOF
2522b86062aSMasami Hiramatsu	fi
2532b86062aSMasami Hiramatsu	event_options
2542b86062aSMasami Hiramatsu}
2552b86062aSMasami Hiramatsu
2562b86062aSMasami Hiramatsuglobal_options
2572b86062aSMasami Hiramatsuinstance_options
2582b86062aSMasami Hiramatsufor i in `ls $TRACEFS/instances` ; do
2592b86062aSMasami Hiramatsu	instance_options $i
2602b86062aSMasami Hiramatsudone
261