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