0001
0002
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
0040
0041 set -e
0042
0043 emit_kv() {
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
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
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
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
0085 DEFINED_VARS=
0086 UNRESOLVED_EVENTS=
0087
0088 defined_vars() {
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() {
0096 test -f $1 & grep -q "1" $1
0097 }
0098
0099 per_event_options() {
0100 evdir=$1
0101
0102 [ ! -f $evdir/filter ] && return
0103
0104 if grep -q "^hist:" $evdir/trigger; then
0105
0106 __vars=`defined_vars $evdir`
0107 for v in `referred_vars $evdir`; do
0108 if echo $DEFINED_VARS $__vars | grep -vqw ${v
0109
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
0141 if [ $PREFIX = "ftrace" ]; then
0142
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() {
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() {
0211 if [ $
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
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