Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/sh
0002 # SPDX-License-Identifier: GPL-2.0-only
0003 
0004 usage() {
0005         echo "Dump boot-time tracing bootconfig from ftrace"
0006         echo "Usage: $0 [--debug] [ > BOOTCONFIG-FILE]"
0007         exit 1
0008 }
0009 
0010 DEBUG=
0011 while [ x"$1" != x ]; do
0012         case "$1" in
0013         "--debug")
0014                 DEBUG=$1;;
0015         -*)
0016                 usage
0017                 ;;
0018         esac
0019         shift 1
0020 done
0021 
0022 if [ x"$DEBUG" != x ]; then
0023         set -x
0024 fi
0025 
0026 TRACEFS=`grep -m 1 -w tracefs /proc/mounts | cut -f 2 -d " "`
0027 if [ -z "$TRACEFS" ]; then
0028         if ! grep -wq debugfs /proc/mounts; then
0029                 echo "Error: No tracefs/debugfs was mounted."
0030                 exit 1
0031         fi
0032         TRACEFS=`grep -m 1 -w debugfs /proc/mounts | cut -f 2 -d " "`/tracing
0033         if [ ! -d $TRACEFS ]; then
0034                 echo "Error: ftrace is not enabled on this kernel." 1>&2
0035                 exit 1
0036         fi
0037 fi
0038 
0039 ######## main #########
0040 
0041 set -e
0042 
0043 emit_kv() { # key =|+= value
0044         echo "$@"
0045 }
0046 
0047 global_options() {
0048         val=`cat $TRACEFS/max_graph_depth`
0049         [ $val != 0 ] && emit_kv kernel.fgraph_max_depth = $val
0050         if grep -qv "^#" $TRACEFS/set_graph_function $TRACEFS/set_graph_notrace ; then
0051                 cat 1>&2 << EOF
0052 # WARN: kernel.fgraph_filters and kernel.fgraph_notrace are not supported, since the wild card expression was expanded and lost from memory.
0053 EOF
0054         fi
0055 }
0056 
0057 kprobe_event_options() {
0058         cat $TRACEFS/kprobe_events | while read p args; do
0059                 case $p in
0060                 r*)
0061                 cat 1>&2 << EOF
0062 # WARN: A return probe found but it is not supported by bootconfig. Skip it.
0063 EOF
0064                 continue;;
0065                 esac
0066                 p=${p#*:}
0067                 event=${p#*/}
0068                 group=${p%/*}
0069                 if [ $group != "kprobes" ]; then
0070                         cat 1>&2 << EOF
0071 # WARN: kprobes group name $group is changed to "kprobes" for bootconfig.
0072 EOF
0073                 fi
0074                 emit_kv $PREFIX.event.kprobes.$event.probes += $args
0075         done
0076 }
0077 
0078 synth_event_options() {
0079         cat $TRACEFS/synthetic_events | while read event fields; do
0080                 emit_kv $PREFIX.event.synthetic.$event.fields = `echo $fields | sed "s/;/,/g"`
0081         done
0082 }
0083 
0084 # Variables resolver
0085 DEFINED_VARS=
0086 UNRESOLVED_EVENTS=
0087 
0088 defined_vars() { # event-dir
0089         grep "^hist" $1/trigger | grep -o ':[a-zA-Z0-9]*='
0090 }
0091 referred_vars() {
0092         grep "^hist" $1/trigger | grep -o '$[a-zA-Z0-9]*'
0093 }
0094 
0095 event_is_enabled() { # enable-file
0096         test -f $1 & grep -q "1" $1
0097 }
0098 
0099 per_event_options() { # event-dir
0100         evdir=$1
0101         # Check the special event which has no filter and no trigger
0102         [ ! -f $evdir/filter ] && return
0103 
0104         if grep -q "^hist:" $evdir/trigger; then
0105                 # hist action can refer the undefined variables
0106                 __vars=`defined_vars $evdir`
0107                 for v in `referred_vars $evdir`; do
0108                         if echo $DEFINED_VARS $__vars | grep -vqw ${v#$}; then
0109                                 # $v is not defined yet, defer it
0110                                 UNRESOLVED_EVENTS="$UNRESOLVED_EVENTS $evdir"
0111                                 return;
0112                         fi
0113                 done
0114                 DEFINED_VARS="$DEFINED_VARS "`defined_vars $evdir`
0115         fi
0116         grep -v "^#" $evdir/trigger | while read action active; do
0117                 emit_kv $PREFIX.event.$group.$event.actions += \'$action\'
0118         done
0119 
0120         if [ $GROUP_ENABLED -eq 0 ] && event_is_enabled $evdir/enable; then
0121                 emit_kv $PREFIX.event.$group.$event.enable
0122         fi
0123         val=`cat $evdir/filter`
0124         if [ "$val" != "none" ]; then
0125                 emit_kv $PREFIX.event.$group.$event.filter = "$val"
0126         fi
0127 }
0128 
0129 retry_unresolved() {
0130         unresolved=$UNRESOLVED_EVENTS
0131         UNRESOLVED_EVENTS=
0132         for evdir in $unresolved; do
0133                 event=${evdir##*/}
0134                 group=${evdir%/*}; group=${group##*/}
0135                 per_event_options $evdir
0136         done
0137 }
0138 
0139 event_options() {
0140         # PREFIX and INSTANCE must be set
0141         if [ $PREFIX = "ftrace" ]; then
0142                 # define the dynamic events
0143                 kprobe_event_options
0144                 synth_event_options
0145         fi
0146         ALL_ENABLED=0
0147         if event_is_enabled $INSTANCE/events/enable; then
0148                 emit_kv $PREFIX.event.enable
0149                 ALL_ENABLED=1
0150         fi
0151         for group in `ls $INSTANCE/events/` ; do
0152                 [ ! -d $INSTANCE/events/$group ] && continue
0153                 GROUP_ENABLED=$ALL_ENABLED
0154                 if [ $ALL_ENABLED -eq 0 ] && \
0155                    event_is_enabled $INSTANCE/events/$group/enable ;then
0156                         emit_kv $PREFIX.event.$group.enable
0157                         GROUP_ENABLED=1
0158                 fi
0159                 for event in `ls $INSTANCE/events/$group/` ;do
0160                         [ ! -d $INSTANCE/events/$group/$event ] && continue
0161                         per_event_options $INSTANCE/events/$group/$event
0162                 done
0163         done
0164         retry=0
0165         while [ $retry -lt 3 ]; do
0166                 retry_unresolved
0167                 retry=$((retry + 1))
0168         done
0169         if [ "$UNRESOLVED_EVENTS" ]; then
0170                 cat 1>&2 << EOF
0171 ! ERROR: hist triggers in $UNRESOLVED_EVENTS use some undefined variables.
0172 EOF
0173         fi
0174 }
0175 
0176 is_default_trace_option() { # option
0177 grep -qw $1 << EOF
0178 print-parent
0179 nosym-offset
0180 nosym-addr
0181 noverbose
0182 noraw
0183 nohex
0184 nobin
0185 noblock
0186 trace_printk
0187 annotate
0188 nouserstacktrace
0189 nosym-userobj
0190 noprintk-msg-only
0191 context-info
0192 nolatency-format
0193 record-cmd
0194 norecord-tgid
0195 overwrite
0196 nodisable_on_free
0197 irq-info
0198 markers
0199 noevent-fork
0200 nopause-on-trace
0201 function-trace
0202 nofunction-fork
0203 nodisplay-graph
0204 nostacktrace
0205 notest_nop_accept
0206 notest_nop_refuse
0207 EOF
0208 }
0209 
0210 instance_options() { # [instance-name]
0211         if [ $# -eq 0 ]; then
0212                 PREFIX="ftrace"
0213                 INSTANCE=$TRACEFS
0214         else
0215                 PREFIX="ftrace.instance.$1"
0216                 INSTANCE=$TRACEFS/instances/$1
0217         fi
0218         val=
0219         for i in `cat $INSTANCE/trace_options`; do
0220                 is_default_trace_option $i && continue
0221                 val="$val, $i"
0222         done
0223         [ "$val" ] && emit_kv $PREFIX.options = "${val#,}"
0224         val="local"
0225         for i in `cat $INSTANCE/trace_clock` ; do
0226                 [ "${i#*]}" ] && continue
0227                 i=${i%]}; val=${i#[}
0228         done
0229         [ $val != "local" ] && emit_kv $PREFIX.trace_clock = $val
0230         val=`cat $INSTANCE/buffer_size_kb`
0231         if echo $val | grep -vq "expanded" ; then
0232                 emit_kv $PREFIX.buffer_size = $val"KB"
0233         fi
0234         if grep -q "is allocated" $INSTANCE/snapshot ; then
0235                 emit_kv $PREFIX.alloc_snapshot
0236         fi
0237         val=`cat $INSTANCE/tracing_cpumask`
0238         if [ `echo $val | sed -e s/f//g`x != x ]; then
0239                 emit_kv $PREFIX.cpumask = $val
0240         fi
0241         val=`cat $INSTANCE/tracing_on`
0242         if [ "$val" = "0" ]; then
0243                 emit_kv $PREFIX.tracing_on = 0
0244         fi
0245 
0246         val=`cat $INSTANCE/current_tracer`
0247         [ $val != nop ] && emit_kv $PREFIX.tracer = $val
0248         if grep -qv "^#" $INSTANCE/set_ftrace_filter $INSTANCE/set_ftrace_notrace; then
0249                 cat 1>&2 << EOF
0250 # WARN: kernel.ftrace.filters and kernel.ftrace.notrace are not supported, since the wild card expression was expanded and lost from memory.
0251 EOF
0252         fi
0253         event_options
0254 }
0255 
0256 global_options
0257 instance_options
0258 for i in `ls $TRACEFS/instances` ; do
0259         instance_options $i
0260 done