@@ -1979,12 +1979,12 @@ static int trace__read_syscall_info(struct trace *trace, int id)
19791979 return err ;
19801980}
19811981
1982- static int evsel__init_tp_arg_scnprintf (struct evsel * evsel )
1982+ static int evsel__init_tp_arg_scnprintf (struct evsel * evsel , bool * use_btf )
19831983{
19841984 struct syscall_arg_fmt * fmt = evsel__syscall_arg_fmt (evsel );
19851985
19861986 if (fmt != NULL ) {
1987- syscall_arg_fmt__init_array (fmt , evsel -> tp_format -> format .fields , NULL );
1987+ syscall_arg_fmt__init_array (fmt , evsel -> tp_format -> format .fields , use_btf );
19881988 return 0 ;
19891989 }
19901990
@@ -2188,7 +2188,8 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,
21882188 * property isn't set.
21892189 */
21902190 if (val == 0 && !trace -> show_zeros &&
2191- !(sc -> arg_fmt && sc -> arg_fmt [arg .idx ].show_zero ))
2191+ !(sc -> arg_fmt && sc -> arg_fmt [arg .idx ].show_zero ) &&
2192+ !(sc -> arg_fmt && sc -> arg_fmt [arg .idx ].is_enum ))
21922193 continue ;
21932194
21942195 printed += scnprintf (bf + printed , size - printed , "%s" , printed ? ", " : "" );
@@ -2893,14 +2894,23 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct evsel *evsel,
28932894 val = syscall_arg_fmt__mask_val (arg , & syscall_arg , val );
28942895
28952896 /* Suppress this argument if its value is zero and show_zero property isn't set. */
2896- if (val == 0 && !trace -> show_zeros && !arg -> show_zero )
2897+ if (val == 0 && !trace -> show_zeros && !arg -> show_zero && ! arg -> is_enum )
28972898 continue ;
28982899
28992900 printed += scnprintf (bf + printed , size - printed , "%s" , printed ? ", " : "" );
29002901
29012902 if (trace -> show_arg_names )
29022903 printed += scnprintf (bf + printed , size - printed , "%s: " , field -> name );
29032904
2905+ if (arg -> is_enum ) {
2906+ size_t p = trace__btf_enum_scnprintf (trace , arg , bf + printed ,
2907+ size - printed , val , field -> type );
2908+ if (p ) {
2909+ printed += p ;
2910+ continue ;
2911+ }
2912+ }
2913+
29042914 printed += syscall_arg_fmt__scnprintf_val (arg , bf + printed , size - printed , & syscall_arg , val );
29052915 }
29062916
@@ -4553,7 +4563,7 @@ static void evsel__set_syscall_arg_fmt(struct evsel *evsel, const char *name)
45534563 }
45544564}
45554565
4556- static int evlist__set_syscall_tp_fields (struct evlist * evlist )
4566+ static int evlist__set_syscall_tp_fields (struct evlist * evlist , bool * use_btf )
45574567{
45584568 struct evsel * evsel ;
45594569
@@ -4562,7 +4572,7 @@ static int evlist__set_syscall_tp_fields(struct evlist *evlist)
45624572 continue ;
45634573
45644574 if (strcmp (evsel -> tp_format -> system , "syscalls" )) {
4565- evsel__init_tp_arg_scnprintf (evsel );
4575+ evsel__init_tp_arg_scnprintf (evsel , use_btf );
45664576 continue ;
45674577 }
45684578
@@ -5040,11 +5050,16 @@ int cmd_trace(int argc, const char **argv)
50405050 }
50415051
50425052 if (trace .evlist -> core .nr_entries > 0 ) {
5053+ bool use_btf = false;
5054+
50435055 evlist__set_default_evsel_handler (trace .evlist , trace__event_handler );
5044- if (evlist__set_syscall_tp_fields (trace .evlist )) {
5056+ if (evlist__set_syscall_tp_fields (trace .evlist , & use_btf )) {
50455057 perror ("failed to set syscalls:* tracepoint fields" );
50465058 goto out ;
50475059 }
5060+
5061+ if (use_btf )
5062+ trace__load_vmlinux_btf (& trace );
50485063 }
50495064
50505065 if (trace .sort_events ) {
0 commit comments