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
952b86062aSMasami Hiramatsuper_event_options() { # event-dir
962b86062aSMasami Hiramatsu	evdir=$1
972b86062aSMasami Hiramatsu	# Check the special event which has no filter and no trigger
982b86062aSMasami Hiramatsu	[ ! -f $evdir/filter ] && return
992b86062aSMasami Hiramatsu
1002b86062aSMasami Hiramatsu	if grep -q "^hist:" $evdir/trigger; then
1012b86062aSMasami Hiramatsu		# hist action can refer the undefined variables
1022b86062aSMasami Hiramatsu		__vars=`defined_vars $evdir`
1032b86062aSMasami Hiramatsu		for v in `referred_vars $evdir`; do
1042b86062aSMasami Hiramatsu			if echo $DEFINED_VARS $__vars | grep -vqw ${v#$}; then
1052b86062aSMasami Hiramatsu				# $v is not defined yet, defer it
1062b86062aSMasami Hiramatsu				UNRESOLVED_EVENTS="$UNRESOLVED_EVENTS $evdir"
1072b86062aSMasami Hiramatsu				return;
1082b86062aSMasami Hiramatsu			fi
1092b86062aSMasami Hiramatsu		done
1102b86062aSMasami Hiramatsu		DEFINED_VARS="$DEFINED_VARS "`defined_vars $evdir`
1112b86062aSMasami Hiramatsu	fi
1122b86062aSMasami Hiramatsu	grep -v "^#" $evdir/trigger | while read action active; do
1132b86062aSMasami Hiramatsu		emit_kv $PREFIX.event.$group.$event.actions += \'$action\'
1142b86062aSMasami Hiramatsu	done
1152b86062aSMasami Hiramatsu
1162b86062aSMasami Hiramatsu	# enable is not checked; this is done by set_event in the instance.
1172b86062aSMasami Hiramatsu	val=`cat $evdir/filter`
1182b86062aSMasami Hiramatsu	if [ "$val" != "none" ]; then
1192b86062aSMasami Hiramatsu		emit_kv $PREFIX.event.$group.$event.filter = "$val"
1202b86062aSMasami Hiramatsu	fi
1212b86062aSMasami Hiramatsu}
1222b86062aSMasami Hiramatsu
1232b86062aSMasami Hiramatsuretry_unresolved() {
1242b86062aSMasami Hiramatsu	unresolved=$UNRESOLVED_EVENTS
1252b86062aSMasami Hiramatsu	UNRESOLVED_EVENTS=
1262b86062aSMasami Hiramatsu	for evdir in $unresolved; do
1272b86062aSMasami Hiramatsu		event=${evdir##*/}
1282b86062aSMasami Hiramatsu		group=${evdir%/*}; group=${group##*/}
1292b86062aSMasami Hiramatsu		per_event_options $evdir
1302b86062aSMasami Hiramatsu	done
1312b86062aSMasami Hiramatsu}
1322b86062aSMasami Hiramatsu
1332b86062aSMasami Hiramatsuevent_options() {
1342b86062aSMasami Hiramatsu	# PREFIX and INSTANCE must be set
1352b86062aSMasami Hiramatsu	if [ $PREFIX = "ftrace" ]; then
1362b86062aSMasami Hiramatsu		# define the dynamic events
1372b86062aSMasami Hiramatsu		kprobe_event_options
1382b86062aSMasami Hiramatsu		synth_event_options
1392b86062aSMasami Hiramatsu	fi
1402b86062aSMasami Hiramatsu	for group in `ls $INSTANCE/events/` ; do
1412b86062aSMasami Hiramatsu		[ ! -d $INSTANCE/events/$group ] && continue
1422b86062aSMasami Hiramatsu		for event in `ls $INSTANCE/events/$group/` ;do
1432b86062aSMasami Hiramatsu			[ ! -d $INSTANCE/events/$group/$event ] && continue
1442b86062aSMasami Hiramatsu			per_event_options $INSTANCE/events/$group/$event
1452b86062aSMasami Hiramatsu		done
1462b86062aSMasami Hiramatsu	done
1472b86062aSMasami Hiramatsu	retry=0
1482b86062aSMasami Hiramatsu	while [ $retry -lt 3 ]; do
1492b86062aSMasami Hiramatsu		retry_unresolved
1502b86062aSMasami Hiramatsu		retry=$((retry + 1))
1512b86062aSMasami Hiramatsu	done
1522b86062aSMasami Hiramatsu	if [ "$UNRESOLVED_EVENTS" ]; then
1532b86062aSMasami Hiramatsu		cat 1>&2 << EOF
1542b86062aSMasami Hiramatsu! ERROR: hist triggers in $UNRESOLVED_EVENTS use some undefined variables.
1552b86062aSMasami HiramatsuEOF
1562b86062aSMasami Hiramatsu	fi
1572b86062aSMasami Hiramatsu}
1582b86062aSMasami Hiramatsu
1592b86062aSMasami Hiramatsuis_default_trace_option() { # option
1602b86062aSMasami Hiramatsugrep -qw $1 << EOF
1612b86062aSMasami Hiramatsuprint-parent
1622b86062aSMasami Hiramatsunosym-offset
1632b86062aSMasami Hiramatsunosym-addr
1642b86062aSMasami Hiramatsunoverbose
1652b86062aSMasami Hiramatsunoraw
1662b86062aSMasami Hiramatsunohex
1672b86062aSMasami Hiramatsunobin
1682b86062aSMasami Hiramatsunoblock
1692b86062aSMasami Hiramatsutrace_printk
1702b86062aSMasami Hiramatsuannotate
1712b86062aSMasami Hiramatsunouserstacktrace
1722b86062aSMasami Hiramatsunosym-userobj
1732b86062aSMasami Hiramatsunoprintk-msg-only
1742b86062aSMasami Hiramatsucontext-info
1752b86062aSMasami Hiramatsunolatency-format
1762b86062aSMasami Hiramatsurecord-cmd
1772b86062aSMasami Hiramatsunorecord-tgid
1782b86062aSMasami Hiramatsuoverwrite
1792b86062aSMasami Hiramatsunodisable_on_free
1802b86062aSMasami Hiramatsuirq-info
1812b86062aSMasami Hiramatsumarkers
1822b86062aSMasami Hiramatsunoevent-fork
1832b86062aSMasami Hiramatsunopause-on-trace
1842b86062aSMasami Hiramatsufunction-trace
1852b86062aSMasami Hiramatsunofunction-fork
1862b86062aSMasami Hiramatsunodisplay-graph
1872b86062aSMasami Hiramatsunostacktrace
1882b86062aSMasami Hiramatsunotest_nop_accept
1892b86062aSMasami Hiramatsunotest_nop_refuse
1902b86062aSMasami HiramatsuEOF
1912b86062aSMasami Hiramatsu}
1922b86062aSMasami Hiramatsu
1932b86062aSMasami Hiramatsuinstance_options() { # [instance-name]
1942b86062aSMasami Hiramatsu	if [ $# -eq 0 ]; then
1952b86062aSMasami Hiramatsu		PREFIX="ftrace"
1962b86062aSMasami Hiramatsu		INSTANCE=$TRACEFS
1972b86062aSMasami Hiramatsu	else
1982b86062aSMasami Hiramatsu		PREFIX="ftrace.instance.$1"
1992b86062aSMasami Hiramatsu		INSTANCE=$TRACEFS/instances/$1
2002b86062aSMasami Hiramatsu	fi
2012b86062aSMasami Hiramatsu	val=
2022b86062aSMasami Hiramatsu	for i in `cat $INSTANCE/trace_options`; do
2032b86062aSMasami Hiramatsu		is_default_trace_option $i && continue
2042b86062aSMasami Hiramatsu		val="$val, $i"
2052b86062aSMasami Hiramatsu	done
2062b86062aSMasami Hiramatsu	[ "$val" ] && emit_kv $PREFIX.options = "${val#,}"
2072b86062aSMasami Hiramatsu	val="local"
2082b86062aSMasami Hiramatsu	for i in `cat $INSTANCE/trace_clock` ; do
2092b86062aSMasami Hiramatsu		[ "${i#*]}" ] && continue
2102b86062aSMasami Hiramatsu		i=${i%]}; val=${i#[}
2112b86062aSMasami Hiramatsu	done
2122b86062aSMasami Hiramatsu	[ $val != "local" ] && emit_kv $PREFIX.trace_clock = $val
2132b86062aSMasami Hiramatsu	val=`cat $INSTANCE/buffer_size_kb`
2142b86062aSMasami Hiramatsu	if echo $val | grep -vq "expanded" ; then
2152b86062aSMasami Hiramatsu		emit_kv $PREFIX.buffer_size = $val"KB"
2162b86062aSMasami Hiramatsu	fi
2172b86062aSMasami Hiramatsu	if grep -q "is allocated" $INSTANCE/snapshot ; then
2182b86062aSMasami Hiramatsu		emit_kv $PREFIX.alloc_snapshot
2192b86062aSMasami Hiramatsu	fi
2202b86062aSMasami Hiramatsu	val=`cat $INSTANCE/tracing_cpumask`
2212b86062aSMasami Hiramatsu	if [ `echo $val | sed -e s/f//g`x != x ]; then
2222b86062aSMasami Hiramatsu		emit_kv $PREFIX.cpumask = $val
2232b86062aSMasami Hiramatsu	fi
224*55ed4560SMasami Hiramatsu	val=`cat $INSTANCE/tracing_on`
225*55ed4560SMasami Hiramatsu	if [ `echo $val | sed -e s/f//g`x != x ]; then
226*55ed4560SMasami Hiramatsu		emit_kv $PREFIX.tracing_on = $val
227*55ed4560SMasami Hiramatsu	fi
2282b86062aSMasami Hiramatsu
2292b86062aSMasami Hiramatsu	val=
2302b86062aSMasami Hiramatsu	for i in `cat $INSTANCE/set_event`; do
2312b86062aSMasami Hiramatsu		val="$val, $i"
2322b86062aSMasami Hiramatsu	done
2332b86062aSMasami Hiramatsu	[ "$val" ] && emit_kv $PREFIX.events = "${val#,}"
2342b86062aSMasami Hiramatsu	val=`cat $INSTANCE/current_tracer`
2352b86062aSMasami Hiramatsu	[ $val != nop ] && emit_kv $PREFIX.tracer = $val
2362b86062aSMasami Hiramatsu	if grep -qv "^#" $INSTANCE/set_ftrace_filter $INSTANCE/set_ftrace_notrace; then
2372b86062aSMasami Hiramatsu		cat 1>&2 << EOF
2382b86062aSMasami Hiramatsu# WARN: kernel.ftrace.filters and kernel.ftrace.notrace are not supported, since the wild card expression was expanded and lost from memory.
2392b86062aSMasami HiramatsuEOF
2402b86062aSMasami Hiramatsu	fi
2412b86062aSMasami Hiramatsu	event_options
2422b86062aSMasami Hiramatsu}
2432b86062aSMasami Hiramatsu
2442b86062aSMasami Hiramatsuglobal_options
2452b86062aSMasami Hiramatsuinstance_options
2462b86062aSMasami Hiramatsufor i in `ls $TRACEFS/instances` ; do
2472b86062aSMasami Hiramatsu	instance_options $i
2482b86062aSMasami Hiramatsudone
249