2 # SPDX-License-Identifier: GPL-2.0-only
5 echo "Dump boot-time tracing bootconfig from ftrace"
6 echo "Usage: $0 [--debug] [ > BOOTCONFIG-FILE]"
11 while [ x
"$1" != x
]; do
22 if [ x
"$DEBUG" != x
]; then
26 TRACEFS
=`grep -m 1 -w tracefs /proc/mounts | cut -f 2 -d " "`
27 if [ -z "$TRACEFS" ]; then
28 if ! grep -wq debugfs
/proc
/mounts
; then
29 echo "Error: No tracefs/debugfs was mounted."
32 TRACEFS
=`grep -m 1 -w debugfs /proc/mounts | cut -f 2 -d " "`/tracing
33 if [ ! -d $TRACEFS ]; then
34 echo "Error: ftrace is not enabled on this kernel." 1>&2
39 ######## main #########
43 emit_kv
() { # key =|+= value
48 val
=`cat $TRACEFS/max_graph_depth`
49 [ $val != 0 ] && emit_kv kernel.fgraph_max_depth
= $val
50 if grep -qv "^#" $TRACEFS/set_graph_function
$TRACEFS/set_graph_notrace
; then
52 # WARN: kernel.fgraph_filters and kernel.fgraph_notrace are not supported, since the wild card expression was expanded and lost from memory.
57 kprobe_event_options
() {
58 cat $TRACEFS/kprobe_events |
while read p args
; do
62 # WARN: A return probe found but it is not supported by bootconfig. Skip it.
69 if [ $group != "kprobes" ]; then
71 # WARN: kprobes group name $group is changed to "kprobes" for bootconfig.
74 emit_kv
$PREFIX.event.kprobes.
$event.probes
+= $args
78 synth_event_options
() {
79 cat $TRACEFS/synthetic_events |
while read event fields
; do
80 emit_kv
$PREFIX.event.synthetic.
$event.fields
= `echo $fields | sed "s/;/,/g"`
88 defined_vars
() { # event-dir
89 grep "^hist" $1/trigger |
grep -o ':[a-zA-Z0-9]*='
92 grep "^hist" $1/trigger |
grep -o '$[a-zA-Z0-9]*'
95 event_is_enabled
() { # enable-file
96 test -f $1 && grep -q "1" $1
99 per_event_options
() { # event-dir
101 # Check the special event which has no filter and no trigger
102 [ ! -f $evdir/filter
] && return
104 if grep -q "^hist:" $evdir/trigger
; then
105 # hist action can refer the undefined variables
106 __vars
=`defined_vars $evdir`
107 for v
in `referred_vars $evdir`; do
108 if echo $DEFINED_VARS $__vars |
grep -vqw ${v#$}; then
109 # $v is not defined yet, defer it
110 UNRESOLVED_EVENTS
="$UNRESOLVED_EVENTS $evdir"
114 DEFINED_VARS
="$DEFINED_VARS "`defined_vars $evdir`
116 grep -v "^#" $evdir/trigger |
while read action active
; do
117 emit_kv
$PREFIX.event.
$group.
$event.actions
+= \'$action\'
120 if [ $GROUP_ENABLED -eq 0 ] && event_is_enabled
$evdir/enable; then
121 emit_kv
$PREFIX.event.
$group.
$event.
enable
123 val
=`cat $evdir/filter`
124 if [ "$val" != "none" ]; then
125 emit_kv
$PREFIX.event.
$group.
$event.filter
= "$val"
130 unresolved
=$UNRESOLVED_EVENTS
132 for evdir
in $unresolved; do
134 group
=${evdir%/*}; group
=${group##*/}
135 per_event_options
$evdir
140 # PREFIX and INSTANCE must be set
141 if [ $PREFIX = "ftrace" ]; then
142 # define the dynamic events
147 if event_is_enabled
$INSTANCE/events
/enable; then
148 emit_kv
$PREFIX.event.
enable
151 for group
in `ls $INSTANCE/events/` ; do
152 [ ! -d $INSTANCE/events
/$group ] && continue
153 GROUP_ENABLED
=$ALL_ENABLED
154 if [ $ALL_ENABLED -eq 0 ] && \
155 event_is_enabled
$INSTANCE/events
/$group/enable ;then
156 emit_kv
$PREFIX.event.
$group.
enable
159 for event
in `ls $INSTANCE/events/$group/` ;do
160 [ ! -d $INSTANCE/events
/$group/$event ] && continue
161 per_event_options
$INSTANCE/events
/$group/$event
165 while [ $retry -lt 3 ]; do
169 if [ "$UNRESOLVED_EVENTS" ]; then
171 ! ERROR: hist triggers in $UNRESOLVED_EVENTS use some undefined variables.
176 is_default_trace_option
() { # option
210 instance_options
() { # [instance-name]
211 if [ $# -eq 0 ]; then
215 PREFIX
="ftrace.instance.$1"
216 INSTANCE
=$TRACEFS/instances
/$1
219 for i
in `cat $INSTANCE/trace_options`; do
220 is_default_trace_option
$i && continue
223 [ "$val" ] && emit_kv
$PREFIX.options
= "${val#,}"
225 for i
in `cat $INSTANCE/trace_clock` ; do
226 [ "${i#*]}" ] && continue
229 [ $val != "local" ] && emit_kv
$PREFIX.trace_clock
= $val
230 val
=`cat $INSTANCE/buffer_size_kb`
231 if echo $val |
grep -vq "expanded" ; then
232 emit_kv
$PREFIX.buffer_size
= $val"KB"
234 if grep -q "is allocated" $INSTANCE/snapshot
; then
235 emit_kv
$PREFIX.alloc_snapshot
237 val
=`cat $INSTANCE/tracing_cpumask`
238 if [ `echo $val | sed -e s/f//g`x
!= x
]; then
239 emit_kv
$PREFIX.cpumask
= $val
241 val
=`cat $INSTANCE/tracing_on`
242 if [ "$val" = "0" ]; then
243 emit_kv
$PREFIX.tracing_on
= 0
246 val
=`cat $INSTANCE/current_tracer`
247 [ $val != nop
] && emit_kv
$PREFIX.tracer
= $val
248 if grep -qv "^#" $INSTANCE/set_ftrace_filter
$INSTANCE/set_ftrace_notrace
; then
250 # WARN: kernel.ftrace.filters and kernel.ftrace.notrace are not supported, since the wild card expression was expanded and lost from memory.
258 for i
in `ls $TRACEFS/instances` ; do