Merge tag 'acpi-5.15-rc1-3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[linux-2.6-microblaze.git] / tools / bootconfig / scripts / ftrace2bconf.sh
1 #!/bin/sh
2 # SPDX-License-Identifier: GPL-2.0-only
3
4 usage() {
5         echo "Dump boot-time tracing bootconfig from ftrace"
6         echo "Usage: $0 [--debug] [ > BOOTCONFIG-FILE]"
7         exit 1
8 }
9
10 DEBUG=
11 while [ x"$1" != x ]; do
12         case "$1" in
13         "--debug")
14                 DEBUG=$1;;
15         -*)
16                 usage
17                 ;;
18         esac
19         shift 1
20 done
21
22 if [ x"$DEBUG" != x ]; then
23         set -x
24 fi
25
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."
30                 exit 1
31         fi
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
35                 exit 1
36         fi
37 fi
38
39 ######## main #########
40
41 set -e
42
43 emit_kv() { # key =|+= value
44         echo "$@"
45 }
46
47 global_options() {
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
51                 cat 1>&2 << EOF
52 # WARN: kernel.fgraph_filters and kernel.fgraph_notrace are not supported, since the wild card expression was expanded and lost from memory.
53 EOF
54         fi
55 }
56
57 kprobe_event_options() {
58         cat $TRACEFS/kprobe_events | while read p args; do
59                 case $p in
60                 r*)
61                 cat 1>&2 << EOF
62 # WARN: A return probe found but it is not supported by bootconfig. Skip it.
63 EOF
64                 continue;;
65                 esac
66                 p=${p#*:}
67                 event=${p#*/}
68                 group=${p%/*}
69                 if [ $group != "kprobes" ]; then
70                         cat 1>&2 << EOF
71 # WARN: kprobes group name $group is changed to "kprobes" for bootconfig.
72 EOF
73                 fi
74                 emit_kv $PREFIX.event.kprobes.$event.probes += $args
75         done
76 }
77
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"`
81         done
82 }
83
84 # Variables resolver
85 DEFINED_VARS=
86 UNRESOLVED_EVENTS=
87
88 defined_vars() { # event-dir
89         grep "^hist" $1/trigger | grep -o ':[a-zA-Z0-9]*='
90 }
91 referred_vars() {
92         grep "^hist" $1/trigger | grep -o '$[a-zA-Z0-9]*'
93 }
94
95 event_is_enabled() { # enable-file
96         test -f $1 & grep -q "1" $1
97 }
98
99 per_event_options() { # event-dir
100         evdir=$1
101         # Check the special event which has no filter and no trigger
102         [ ! -f $evdir/filter ] && return
103
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"
111                                 return;
112                         fi
113                 done
114                 DEFINED_VARS="$DEFINED_VARS "`defined_vars $evdir`
115         fi
116         grep -v "^#" $evdir/trigger | while read action active; do
117                 emit_kv $PREFIX.event.$group.$event.actions += \'$action\'
118         done
119
120         if [ $GROUP_ENABLED -eq 0 ] && event_is_enabled $evdir/enable; then
121                 emit_kv $PREFIX.event.$group.$event.enable
122         fi
123         val=`cat $evdir/filter`
124         if [ "$val" != "none" ]; then
125                 emit_kv $PREFIX.event.$group.$event.filter = "$val"
126         fi
127 }
128
129 retry_unresolved() {
130         unresolved=$UNRESOLVED_EVENTS
131         UNRESOLVED_EVENTS=
132         for evdir in $unresolved; do
133                 event=${evdir##*/}
134                 group=${evdir%/*}; group=${group##*/}
135                 per_event_options $evdir
136         done
137 }
138
139 event_options() {
140         # PREFIX and INSTANCE must be set
141         if [ $PREFIX = "ftrace" ]; then
142                 # define the dynamic events
143                 kprobe_event_options
144                 synth_event_options
145         fi
146         ALL_ENABLED=0
147         if event_is_enabled $INSTANCE/events/enable; then
148                 emit_kv $PREFIX.event.enable
149                 ALL_ENABLED=1
150         fi
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
157                         GROUP_ENABLED=1
158                 fi
159                 for event in `ls $INSTANCE/events/$group/` ;do
160                         [ ! -d $INSTANCE/events/$group/$event ] && continue
161                         per_event_options $INSTANCE/events/$group/$event
162                 done
163         done
164         retry=0
165         while [ $retry -lt 3 ]; do
166                 retry_unresolved
167                 retry=$((retry + 1))
168         done
169         if [ "$UNRESOLVED_EVENTS" ]; then
170                 cat 1>&2 << EOF
171 ! ERROR: hist triggers in $UNRESOLVED_EVENTS use some undefined variables.
172 EOF
173         fi
174 }
175
176 is_default_trace_option() { # option
177 grep -qw $1 << EOF
178 print-parent
179 nosym-offset
180 nosym-addr
181 noverbose
182 noraw
183 nohex
184 nobin
185 noblock
186 trace_printk
187 annotate
188 nouserstacktrace
189 nosym-userobj
190 noprintk-msg-only
191 context-info
192 nolatency-format
193 record-cmd
194 norecord-tgid
195 overwrite
196 nodisable_on_free
197 irq-info
198 markers
199 noevent-fork
200 nopause-on-trace
201 function-trace
202 nofunction-fork
203 nodisplay-graph
204 nostacktrace
205 notest_nop_accept
206 notest_nop_refuse
207 EOF
208 }
209
210 instance_options() { # [instance-name]
211         if [ $# -eq 0 ]; then
212                 PREFIX="ftrace"
213                 INSTANCE=$TRACEFS
214         else
215                 PREFIX="ftrace.instance.$1"
216                 INSTANCE=$TRACEFS/instances/$1
217         fi
218         val=
219         for i in `cat $INSTANCE/trace_options`; do
220                 is_default_trace_option $i && continue
221                 val="$val, $i"
222         done
223         [ "$val" ] && emit_kv $PREFIX.options = "${val#,}"
224         val="local"
225         for i in `cat $INSTANCE/trace_clock` ; do
226                 [ "${i#*]}" ] && continue
227                 i=${i%]}; val=${i#[}
228         done
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"
233         fi
234         if grep -q "is allocated" $INSTANCE/snapshot ; then
235                 emit_kv $PREFIX.alloc_snapshot
236         fi
237         val=`cat $INSTANCE/tracing_cpumask`
238         if [ `echo $val | sed -e s/f//g`x != x ]; then
239                 emit_kv $PREFIX.cpumask = $val
240         fi
241         val=`cat $INSTANCE/tracing_on`
242         if [ "$val" = "0" ]; then
243                 emit_kv $PREFIX.tracing_on = 0
244         fi
245
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
249                 cat 1>&2 << EOF
250 # WARN: kernel.ftrace.filters and kernel.ftrace.notrace are not supported, since the wild card expression was expanded and lost from memory.
251 EOF
252         fi
253         event_options
254 }
255
256 global_options
257 instance_options
258 for i in `ls $TRACEFS/instances` ; do
259         instance_options $i
260 done