aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2018-12-20 12:51:47 -0500
committerIngo Molnar <mingo@kernel.org>2018-12-20 12:51:47 -0500
commit883f4def8b77e6870ce42be279564cca0256c611 (patch)
treed9dbc81b55e35c01ea416896b8424dbfa4becdce
parentca46afdb2754dbb4a5d5772332fa16957d9bc618 (diff)
parent89a0948984896352cac1ebe079cb3d64d6c3adc6 (diff)
Merge tag 'perf-core-for-mingo-4.21-20181218' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core
Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo: - Implement BPF based syscall filtering in 'perf trace', using BPF maps and the augmented_raw_syscalls.c BPF proggie (Arnaldo Carvalho de Melo) - Allow specifying in .perfconfig a set of events use in 'perf trace' in addition to any other specified from the command line. This initially will be used to always use the augmented_raw_syscalls.o precompiled BPF program for getting pointer contents. (Arnaldo Carvalho de Melo) - Allow fine grained control about how the syscall output should be formatted. This will be used to allow producing the same output produced by the 'strace' tool, to then use in regression tests comparing the output of 'perf trace' with the one produced from 'strace' (Arnaldo Carvalho de Melo) - Beautify the renameat2 olddirfd, newdirfd and flags arguments (Arnaldo Carvalho de Melo) - Beautify arch_prctl 'code' syscall arg (Arnaldo Carvalho de Melo) - Beautify fadvise64 'advice' syscall arg (Arnaldo Carvalho de Melo) - Relax checks on perf-PID.map ownership, resulting in symbols in executable anonymous maps setup by JITs in things like node.js to be resolved in a 'perf top' session run by root without the need for --force to be used (Arnaldo Carvalho de Melo) - Update asm-generic/unistd.h copy (Arnaldo Carvalho de Melo) - Do not use the first and last symbols when setting up address filters in auxtrace, this fails when we don't have a symbol table, filter the entire area based on the dso size. (Adrian Hunter) - Do not use kernel headers to build libsubcmd, we shouldn't use anything from outside tools/, fixes the build with the Android NDK (Arnaldo Carvalho de Melo) - Add several prototypes for systems lacking those, such as open_memstream(), sigqueue(), fixing warnings building with Android's bionic libc that were preventing the use of -Werror there (Arnaldo Carvalho de Melo) - Use LDFLAGS in the libtraceevent build commands, allowing developers to override its values (Jiri Olsa) - Link libperf-jvmti.so with LDFLAGS variable, allowing distro packages to propagate its settings when building this library (Jiri Olsa) - cs-etm (ARM CoreSight) fixes: (Leo Yan) - Correct packets swapping in cs_etm__flush() - Avoid stale branch samples when flush packet - Remove unused 'trace_on' in cs_etm_decoder - Refactor enumeration cs_etm_sample_type - Rename CS_ETM_TRACE_ON to CS_ETM_DISCONTINUITY - Treat NO_SYNC element as trace discontinuity - Treat EO_TRACE element as trace discontinuity - Generate branch sample for exception packet - Use shebangs in the 'perf test' shell scripts, making them identifiable as shell scripts (Michael Petlan) - Avoid segfaults caused by negated options in 'perf stat' (Michael Petlan) - Fix processing of dereferenced args in bprintk events in libtracevent (Steven Rostedt) Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--tools/arch/x86/include/uapi/asm/prctl.h17
-rw-r--r--tools/include/uapi/asm-generic/unistd.h4
-rw-r--r--tools/include/uapi/linux/fadvise.h22
-rw-r--r--tools/lib/subcmd/Makefile2
-rw-r--r--tools/lib/traceevent/Makefile4
-rw-r--r--tools/lib/traceevent/event-parse.c1
-rw-r--r--tools/perf/Documentation/perf-config.txt32
-rw-r--r--tools/perf/Documentation/perf-trace.txt6
-rw-r--r--tools/perf/Makefile.config2
-rw-r--r--tools/perf/Makefile.perf27
-rw-r--r--tools/perf/builtin-config.c7
-rw-r--r--tools/perf/builtin-stat.c8
-rw-r--r--tools/perf/builtin-timechart.c4
-rw-r--r--tools/perf/builtin-trace.c370
-rwxr-xr-xtools/perf/check-headers.sh2
-rw-r--r--tools/perf/examples/bpf/augmented_raw_syscalls.c33
-rw-r--r--tools/perf/include/bpf/bpf.h2
-rw-r--r--tools/perf/include/bpf/stdio.h3
-rw-r--r--tools/perf/tests/builtin-test.c3
-rwxr-xr-xtools/perf/tests/shell/probe_vfs_getname.sh1
-rwxr-xr-xtools/perf/tests/shell/record+probe_libc_inet_pton.sh1
-rwxr-xr-xtools/perf/tests/shell/record+script_probe_vfs_getname.sh1
-rwxr-xr-xtools/perf/tests/shell/trace+probe_vfs_getname.sh1
-rw-r--r--tools/perf/trace/beauty/Build2
-rw-r--r--tools/perf/trace/beauty/arch_prctl.c33
-rw-r--r--tools/perf/trace/beauty/beauty.h36
-rw-r--r--tools/perf/trace/beauty/clone.c7
-rw-r--r--tools/perf/trace/beauty/eventfd.c4
-rwxr-xr-xtools/perf/trace/beauty/fadvise.sh22
-rw-r--r--tools/perf/trace/beauty/fcntl.c22
-rw-r--r--tools/perf/trace/beauty/flock.c4
-rw-r--r--tools/perf/trace/beauty/futex_op.c8
-rw-r--r--tools/perf/trace/beauty/futex_val3.c3
-rw-r--r--tools/perf/trace/beauty/ioctl.c31
-rw-r--r--tools/perf/trace/beauty/kcmp.c8
-rw-r--r--tools/perf/trace/beauty/mmap.c22
-rw-r--r--tools/perf/trace/beauty/mode_t.c4
-rw-r--r--tools/perf/trace/beauty/mount_flags.c8
-rw-r--r--tools/perf/trace/beauty/msg_flags.c4
-rw-r--r--tools/perf/trace/beauty/open_flags.c13
-rw-r--r--tools/perf/trace/beauty/perf_event_open.c4
-rw-r--r--tools/perf/trace/beauty/pkey_alloc.c14
-rw-r--r--tools/perf/trace/beauty/prctl.c16
-rwxr-xr-xtools/perf/trace/beauty/rename_flags.sh15
-rw-r--r--tools/perf/trace/beauty/renameat.c19
-rw-r--r--tools/perf/trace/beauty/sched_policy.c6
-rw-r--r--tools/perf/trace/beauty/seccomp.c8
-rw-r--r--tools/perf/trace/beauty/signum.c4
-rw-r--r--tools/perf/trace/beauty/sockaddr.c4
-rw-r--r--tools/perf/trace/beauty/socket.c8
-rw-r--r--tools/perf/trace/beauty/socket_type.c4
-rw-r--r--tools/perf/trace/beauty/statx.c10
-rw-r--r--tools/perf/trace/beauty/waitid_options.c4
-rwxr-xr-xtools/perf/trace/beauty/x86_arch_prctl.sh26
-rw-r--r--tools/perf/util/auxtrace.c11
-rw-r--r--tools/perf/util/cs-etm-decoder/cs-etm-decoder.c42
-rw-r--r--tools/perf/util/cs-etm-decoder/cs-etm-decoder.h10
-rw-r--r--tools/perf/util/cs-etm.c77
-rw-r--r--tools/perf/util/dso.c6
-rw-r--r--tools/perf/util/dso.h1
-rw-r--r--tools/perf/util/evlist.c4
-rw-r--r--tools/perf/util/header.c4
-rw-r--r--tools/perf/util/s390-cpumsf.c2
-rw-r--r--tools/perf/util/symbol.c11
64 files changed, 842 insertions, 252 deletions
diff --git a/tools/arch/x86/include/uapi/asm/prctl.h b/tools/arch/x86/include/uapi/asm/prctl.h
new file mode 100644
index 000000000000..5a6aac9fa41f
--- /dev/null
+++ b/tools/arch/x86/include/uapi/asm/prctl.h
@@ -0,0 +1,17 @@
1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2#ifndef _ASM_X86_PRCTL_H
3#define _ASM_X86_PRCTL_H
4
5#define ARCH_SET_GS 0x1001
6#define ARCH_SET_FS 0x1002
7#define ARCH_GET_FS 0x1003
8#define ARCH_GET_GS 0x1004
9
10#define ARCH_GET_CPUID 0x1011
11#define ARCH_SET_CPUID 0x1012
12
13#define ARCH_MAP_VDSO_X32 0x2001
14#define ARCH_MAP_VDSO_32 0x2002
15#define ARCH_MAP_VDSO_64 0x2003
16
17#endif /* _ASM_X86_PRCTL_H */
diff --git a/tools/include/uapi/asm-generic/unistd.h b/tools/include/uapi/asm-generic/unistd.h
index 538546edbfbd..c7f3321fbe43 100644
--- a/tools/include/uapi/asm-generic/unistd.h
+++ b/tools/include/uapi/asm-generic/unistd.h
@@ -760,8 +760,10 @@ __SYSCALL(__NR_rseq, sys_rseq)
760#define __NR_ftruncate __NR3264_ftruncate 760#define __NR_ftruncate __NR3264_ftruncate
761#define __NR_lseek __NR3264_lseek 761#define __NR_lseek __NR3264_lseek
762#define __NR_sendfile __NR3264_sendfile 762#define __NR_sendfile __NR3264_sendfile
763#if defined(__ARCH_WANT_NEW_STAT) || defined(__ARCH_WANT_STAT64)
763#define __NR_newfstatat __NR3264_fstatat 764#define __NR_newfstatat __NR3264_fstatat
764#define __NR_fstat __NR3264_fstat 765#define __NR_fstat __NR3264_fstat
766#endif
765#define __NR_mmap __NR3264_mmap 767#define __NR_mmap __NR3264_mmap
766#define __NR_fadvise64 __NR3264_fadvise64 768#define __NR_fadvise64 __NR3264_fadvise64
767#ifdef __NR3264_stat 769#ifdef __NR3264_stat
@@ -776,8 +778,10 @@ __SYSCALL(__NR_rseq, sys_rseq)
776#define __NR_ftruncate64 __NR3264_ftruncate 778#define __NR_ftruncate64 __NR3264_ftruncate
777#define __NR_llseek __NR3264_lseek 779#define __NR_llseek __NR3264_lseek
778#define __NR_sendfile64 __NR3264_sendfile 780#define __NR_sendfile64 __NR3264_sendfile
781#if defined(__ARCH_WANT_NEW_STAT) || defined(__ARCH_WANT_STAT64)
779#define __NR_fstatat64 __NR3264_fstatat 782#define __NR_fstatat64 __NR3264_fstatat
780#define __NR_fstat64 __NR3264_fstat 783#define __NR_fstat64 __NR3264_fstat
784#endif
781#define __NR_mmap2 __NR3264_mmap 785#define __NR_mmap2 __NR3264_mmap
782#define __NR_fadvise64_64 __NR3264_fadvise64 786#define __NR_fadvise64_64 __NR3264_fadvise64
783#ifdef __NR3264_stat 787#ifdef __NR3264_stat
diff --git a/tools/include/uapi/linux/fadvise.h b/tools/include/uapi/linux/fadvise.h
new file mode 100644
index 000000000000..0862b87434c2
--- /dev/null
+++ b/tools/include/uapi/linux/fadvise.h
@@ -0,0 +1,22 @@
1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2#ifndef FADVISE_H_INCLUDED
3#define FADVISE_H_INCLUDED
4
5#define POSIX_FADV_NORMAL 0 /* No further special treatment. */
6#define POSIX_FADV_RANDOM 1 /* Expect random page references. */
7#define POSIX_FADV_SEQUENTIAL 2 /* Expect sequential page references. */
8#define POSIX_FADV_WILLNEED 3 /* Will need these pages. */
9
10/*
11 * The advise values for POSIX_FADV_DONTNEED and POSIX_ADV_NOREUSE
12 * for s390-64 differ from the values for the rest of the world.
13 */
14#if defined(__s390x__)
15#define POSIX_FADV_DONTNEED 6 /* Don't need these pages. */
16#define POSIX_FADV_NOREUSE 7 /* Data will be accessed once. */
17#else
18#define POSIX_FADV_DONTNEED 4 /* Don't need these pages. */
19#define POSIX_FADV_NOREUSE 5 /* Data will be accessed once. */
20#endif
21
22#endif /* FADVISE_H_INCLUDED */
diff --git a/tools/lib/subcmd/Makefile b/tools/lib/subcmd/Makefile
index 95563b8e1ad7..ed61fb3a46c0 100644
--- a/tools/lib/subcmd/Makefile
+++ b/tools/lib/subcmd/Makefile
@@ -36,8 +36,6 @@ endif
36CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE 36CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
37 37
38CFLAGS += -I$(srctree)/tools/include/ 38CFLAGS += -I$(srctree)/tools/include/
39CFLAGS += -I$(srctree)/include/uapi
40CFLAGS += -I$(srctree)/include
41 39
42SUBCMD_IN := $(OUTPUT)libsubcmd-in.o 40SUBCMD_IN := $(OUTPUT)libsubcmd-in.o
43 41
diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
index 67fe5d7ef190..941761d9923d 100644
--- a/tools/lib/traceevent/Makefile
+++ b/tools/lib/traceevent/Makefile
@@ -177,7 +177,7 @@ $(TE_IN): force
177 $(Q)$(MAKE) $(build)=libtraceevent 177 $(Q)$(MAKE) $(build)=libtraceevent
178 178
179$(OUTPUT)libtraceevent.so.$(EVENT_PARSE_VERSION): $(TE_IN) 179$(OUTPUT)libtraceevent.so.$(EVENT_PARSE_VERSION): $(TE_IN)
180 $(QUIET_LINK)$(CC) --shared $^ -Wl,-soname,libtraceevent.so.$(EP_VERSION) -o $@ 180 $(QUIET_LINK)$(CC) --shared $(LDFLAGS) $^ -Wl,-soname,libtraceevent.so.$(EP_VERSION) -o $@
181 @ln -sf $(@F) $(OUTPUT)libtraceevent.so 181 @ln -sf $(@F) $(OUTPUT)libtraceevent.so
182 @ln -sf $(@F) $(OUTPUT)libtraceevent.so.$(EP_VERSION) 182 @ln -sf $(@F) $(OUTPUT)libtraceevent.so.$(EP_VERSION)
183 183
@@ -196,7 +196,7 @@ $(PLUGINS_IN): force
196 $(Q)$(MAKE) $(build)=$(plugin_obj) 196 $(Q)$(MAKE) $(build)=$(plugin_obj)
197 197
198$(OUTPUT)%.so: $(OUTPUT)%-in.o 198$(OUTPUT)%.so: $(OUTPUT)%-in.o
199 $(QUIET_LINK)$(CC) $(CFLAGS) -shared -nostartfiles -o $@ $^ 199 $(QUIET_LINK)$(CC) $(CFLAGS) -shared $(LDFLAGS) -nostartfiles -o $@ $^
200 200
201define make_version.h 201define make_version.h
202 (echo '/* This file is automatically generated. Do not modify. */'; \ 202 (echo '/* This file is automatically generated. Do not modify. */'; \
diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
index a5ed291b8a9f..69a96e39f0ab 100644
--- a/tools/lib/traceevent/event-parse.c
+++ b/tools/lib/traceevent/event-parse.c
@@ -4973,6 +4973,7 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct tep_e
4973 4973
4974 if (arg->type == TEP_PRINT_BSTRING) { 4974 if (arg->type == TEP_PRINT_BSTRING) {
4975 trace_seq_puts(s, arg->string.string); 4975 trace_seq_puts(s, arg->string.string);
4976 arg = arg->next;
4976 break; 4977 break;
4977 } 4978 }
4978 4979
diff --git a/tools/perf/Documentation/perf-config.txt b/tools/perf/Documentation/perf-config.txt
index 661b1fb3f8ba..4ac7775fbc11 100644
--- a/tools/perf/Documentation/perf-config.txt
+++ b/tools/perf/Documentation/perf-config.txt
@@ -521,6 +521,38 @@ diff.*::
521 Possible values are 'delta', 'delta-abs', 'ratio' and 521 Possible values are 'delta', 'delta-abs', 'ratio' and
522 'wdiff'. Default is 'delta'. 522 'wdiff'. Default is 'delta'.
523 523
524trace.*::
525 trace.add_events::
526 Allows adding a set of events to add to the ones specified
527 by the user, or use as a default one if none was specified.
528 The initial use case is to add augmented_raw_syscalls.o to
529 activate the 'perf trace' logic that looks for syscall
530 pointer contents after the normal tracepoint payload.
531
532 trace.args_alignment::
533 Number of columns to align the argument list, default is 70,
534 use 40 for the strace default, zero to no alignment.
535
536 trace.no_inherit::
537 Do not follow children threads.
538
539 trace.show_arg_names::
540 Should syscall argument names be printed? If not then trace.show_zeros
541 will be set.
542
543 trace.show_duration::
544 Show syscall duration.
545
546 trace.show_prefix::
547 If set to 'yes' will show common string prefixes in tables. The default
548 is to remove the common prefix in things like "MAP_SHARED", showing just "SHARED".
549
550 trace.show_timestamp::
551 Show syscall start timestamp.
552
553 trace.show_zeros::
554 Do not suppress syscall arguments that are equal to zero.
555
524SEE ALSO 556SEE ALSO
525-------- 557--------
526linkperf:perf[1] 558linkperf:perf[1]
diff --git a/tools/perf/Documentation/perf-trace.txt b/tools/perf/Documentation/perf-trace.txt
index e113450503d2..631e687be4eb 100644
--- a/tools/perf/Documentation/perf-trace.txt
+++ b/tools/perf/Documentation/perf-trace.txt
@@ -205,6 +205,12 @@ the thread executes on the designated CPUs. Default is to monitor all CPUs.
205 because the file may be huge. A time out is needed in such cases. 205 because the file may be huge. A time out is needed in such cases.
206 This option sets the time out limit. The default value is 500 ms. 206 This option sets the time out limit. The default value is 500 ms.
207 207
208--sort-events::
209 Do sorting on batches of events, use when noticing out of order events that
210 may happen, for instance, when a thread gets migrated to a different CPU
211 while processing a syscall.
212
213
208PAGEFAULTS 214PAGEFAULTS
209---------- 215----------
210 216
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index b66f97a04b12..07c1857c3d7a 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -294,6 +294,8 @@ ifndef NO_BIONIC
294 $(call feature_check,bionic) 294 $(call feature_check,bionic)
295 ifeq ($(feature-bionic), 1) 295 ifeq ($(feature-bionic), 1)
296 BIONIC := 1 296 BIONIC := 1
297 CFLAGS += -DLACKS_SIGQUEUE_PROTOTYPE
298 CFLAGS += -DLACKS_OPEN_MEMSTREAM_PROTOTYPE
297 EXTLIBS := $(filter-out -lrt,$(EXTLIBS)) 299 EXTLIBS := $(filter-out -lrt,$(EXTLIBS))
298 EXTLIBS := $(filter-out -lpthread,$(EXTLIBS)) 300 EXTLIBS := $(filter-out -lpthread,$(EXTLIBS))
299 endif 301 endif
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index bfdaefd500ab..bd23e3f30895 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -396,6 +396,7 @@ SHELL = $(SHELL_PATH)
396linux_uapi_dir := $(srctree)/tools/include/uapi/linux 396linux_uapi_dir := $(srctree)/tools/include/uapi/linux
397asm_generic_uapi_dir := $(srctree)/tools/include/uapi/asm-generic 397asm_generic_uapi_dir := $(srctree)/tools/include/uapi/asm-generic
398arch_asm_uapi_dir := $(srctree)/tools/arch/$(SRCARCH)/include/uapi/asm/ 398arch_asm_uapi_dir := $(srctree)/tools/arch/$(SRCARCH)/include/uapi/asm/
399x86_arch_asm_uapi_dir := $(srctree)/tools/arch/x86/include/uapi/asm/
399 400
400beauty_outdir := $(OUTPUT)trace/beauty/generated 401beauty_outdir := $(OUTPUT)trace/beauty/generated
401beauty_ioctl_outdir := $(beauty_outdir)/ioctl 402beauty_ioctl_outdir := $(beauty_outdir)/ioctl
@@ -409,6 +410,12 @@ _dummy := $(shell [ -d '$(beauty_ioctl_outdir)' ] || mkdir -p '$(beauty_ioctl_ou
409$(drm_ioctl_array): $(drm_hdr_dir)/drm.h $(drm_hdr_dir)/i915_drm.h $(drm_ioctl_tbl) 410$(drm_ioctl_array): $(drm_hdr_dir)/drm.h $(drm_hdr_dir)/i915_drm.h $(drm_ioctl_tbl)
410 $(Q)$(SHELL) '$(drm_ioctl_tbl)' $(drm_hdr_dir) > $@ 411 $(Q)$(SHELL) '$(drm_ioctl_tbl)' $(drm_hdr_dir) > $@
411 412
413fadvise_advice_array := $(beauty_outdir)/fadvise_advice_array.c
414fadvise_advice_tbl := $(srctree)/tools/perf/trace/beauty/fadvise.sh
415
416$(fadvise_advice_array): $(linux_uapi_dir)/in.h $(fadvise_advice_tbl)
417 $(Q)$(SHELL) '$(fadvise_advice_tbl)' $(linux_uapi_dir) > $@
418
412pkey_alloc_access_rights_array := $(beauty_outdir)/pkey_alloc_access_rights_array.c 419pkey_alloc_access_rights_array := $(beauty_outdir)/pkey_alloc_access_rights_array.c
413asm_generic_hdr_dir := $(srctree)/tools/include/uapi/asm-generic/ 420asm_generic_hdr_dir := $(srctree)/tools/include/uapi/asm-generic/
414pkey_alloc_access_rights_tbl := $(srctree)/tools/perf/trace/beauty/pkey_alloc_access_rights.sh 421pkey_alloc_access_rights_tbl := $(srctree)/tools/perf/trace/beauty/pkey_alloc_access_rights.sh
@@ -490,6 +497,18 @@ prctl_option_tbl := $(srctree)/tools/perf/trace/beauty/prctl_option.sh
490$(prctl_option_array): $(prctl_hdr_dir)/prctl.h $(prctl_option_tbl) 497$(prctl_option_array): $(prctl_hdr_dir)/prctl.h $(prctl_option_tbl)
491 $(Q)$(SHELL) '$(prctl_option_tbl)' $(prctl_hdr_dir) > $@ 498 $(Q)$(SHELL) '$(prctl_option_tbl)' $(prctl_hdr_dir) > $@
492 499
500x86_arch_prctl_code_array := $(beauty_outdir)/x86_arch_prctl_code_array.c
501x86_arch_prctl_code_tbl := $(srctree)/tools/perf/trace/beauty/x86_arch_prctl.sh
502
503$(x86_arch_prctl_code_array): $(x86_arch_asm_uapi_dir)/prctl.h $(x86_arch_prctl_code_tbl)
504 $(Q)$(SHELL) '$(x86_arch_prctl_code_tbl)' $(x86_arch_asm_uapi_dir) > $@
505
506rename_flags_array := $(beauty_outdir)/rename_flags_array.c
507rename_flags_tbl := $(srctree)/tools/perf/trace/beauty/rename_flags.sh
508
509$(rename_flags_array): $(linux_uapi_dir)/fs.h $(rename_flags_tbl)
510 $(Q)$(SHELL) '$(rename_flags_tbl)' $(linux_uapi_dir) > $@
511
493arch_errno_name_array := $(beauty_outdir)/arch_errno_name_array.c 512arch_errno_name_array := $(beauty_outdir)/arch_errno_name_array.c
494arch_errno_hdr_dir := $(srctree)/tools 513arch_errno_hdr_dir := $(srctree)/tools
495arch_errno_tbl := $(srctree)/tools/perf/trace/beauty/arch_errno_names.sh 514arch_errno_tbl := $(srctree)/tools/perf/trace/beauty/arch_errno_names.sh
@@ -592,6 +611,7 @@ __build-dir = $(subst $(OUTPUT),,$(dir $@))
592build-dir = $(if $(__build-dir),$(__build-dir),.) 611build-dir = $(if $(__build-dir),$(__build-dir),.)
593 612
594prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioctl_array) \ 613prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioctl_array) \
614 $(fadvise_advice_array) \
595 $(pkey_alloc_access_rights_array) \ 615 $(pkey_alloc_access_rights_array) \
596 $(sndrv_pcm_ioctl_array) \ 616 $(sndrv_pcm_ioctl_array) \
597 $(sndrv_ctl_ioctl_array) \ 617 $(sndrv_ctl_ioctl_array) \
@@ -604,6 +624,8 @@ prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioc
604 $(mount_flags_array) \ 624 $(mount_flags_array) \
605 $(perf_ioctl_array) \ 625 $(perf_ioctl_array) \
606 $(prctl_option_array) \ 626 $(prctl_option_array) \
627 $(x86_arch_prctl_code_array) \
628 $(rename_flags_array) \
607 $(arch_errno_name_array) 629 $(arch_errno_name_array)
608 630
609$(OUTPUT)%.o: %.c prepare FORCE 631$(OUTPUT)%.o: %.c prepare FORCE
@@ -647,7 +669,7 @@ $(LIBJVMTI_IN): FORCE
647 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=jvmti obj=jvmti 669 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=jvmti obj=jvmti
648 670
649$(OUTPUT)$(LIBJVMTI): $(LIBJVMTI_IN) 671$(OUTPUT)$(LIBJVMTI): $(LIBJVMTI_IN)
650 $(QUIET_LINK)$(CC) -shared -Wl,-soname -Wl,$(LIBJVMTI) -o $@ $< 672 $(QUIET_LINK)$(CC) $(LDFLAGS) -shared -Wl,-soname -Wl,$(LIBJVMTI) -o $@ $<
651endif 673endif
652 674
653$(patsubst perf-%,%.o,$(PROGRAMS)): $(wildcard */*.h) 675$(patsubst perf-%,%.o,$(PROGRAMS)): $(wildcard */*.h)
@@ -887,6 +909,7 @@ clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clea
887 $(OUTPUT)util/intel-pt-decoder/inat-tables.c \ 909 $(OUTPUT)util/intel-pt-decoder/inat-tables.c \
888 $(OUTPUT)tests/llvm-src-{base,kbuild,prologue,relocation}.c \ 910 $(OUTPUT)tests/llvm-src-{base,kbuild,prologue,relocation}.c \
889 $(OUTPUT)pmu-events/pmu-events.c \ 911 $(OUTPUT)pmu-events/pmu-events.c \
912 $(OUTPUT)$(fadvise_advice_array) \
890 $(OUTPUT)$(madvise_behavior_array) \ 913 $(OUTPUT)$(madvise_behavior_array) \
891 $(OUTPUT)$(mmap_flags_array) \ 914 $(OUTPUT)$(mmap_flags_array) \
892 $(OUTPUT)$(mount_flags_array) \ 915 $(OUTPUT)$(mount_flags_array) \
@@ -900,6 +923,8 @@ clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clea
900 $(OUTPUT)$(vhost_virtio_ioctl_array) \ 923 $(OUTPUT)$(vhost_virtio_ioctl_array) \
901 $(OUTPUT)$(perf_ioctl_array) \ 924 $(OUTPUT)$(perf_ioctl_array) \
902 $(OUTPUT)$(prctl_option_array) \ 925 $(OUTPUT)$(prctl_option_array) \
926 $(OUTPUT)$(x86_arch_prctl_code_array) \
927 $(OUTPUT)$(rename_flags_array) \
903 $(OUTPUT)$(arch_errno_name_array) 928 $(OUTPUT)$(arch_errno_name_array)
904 $(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) clean 929 $(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) clean
905 930
diff --git a/tools/perf/builtin-config.c b/tools/perf/builtin-config.c
index 514f70f95b57..d76f831f94c7 100644
--- a/tools/perf/builtin-config.c
+++ b/tools/perf/builtin-config.c
@@ -196,6 +196,7 @@ int cmd_config(int argc, const char **argv)
196 pr_err("Error: takes no arguments\n"); 196 pr_err("Error: takes no arguments\n");
197 parse_options_usage(config_usage, config_options, "l", 1); 197 parse_options_usage(config_usage, config_options, "l", 1);
198 } else { 198 } else {
199do_action_list:
199 if (show_config(set) < 0) { 200 if (show_config(set) < 0) {
200 pr_err("Nothing configured, " 201 pr_err("Nothing configured, "
201 "please check your %s \n", config_filename); 202 "please check your %s \n", config_filename);
@@ -204,10 +205,8 @@ int cmd_config(int argc, const char **argv)
204 } 205 }
205 break; 206 break;
206 default: 207 default:
207 if (!argc) { 208 if (!argc)
208 usage_with_options(config_usage, config_options); 209 goto do_action_list;
209 break;
210 }
211 210
212 for (i = 0; argv[i]; i++) { 211 for (i = 0; argv[i]; i++) {
213 char *var, *value; 212 char *var, *value;
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index a635abfa77b6..1410d66192f7 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -709,7 +709,7 @@ static int parse_metric_groups(const struct option *opt,
709 return metricgroup__parse_groups(opt, str, &stat_config.metric_events); 709 return metricgroup__parse_groups(opt, str, &stat_config.metric_events);
710} 710}
711 711
712static const struct option stat_options[] = { 712static struct option stat_options[] = {
713 OPT_BOOLEAN('T', "transaction", &transaction_run, 713 OPT_BOOLEAN('T', "transaction", &transaction_run,
714 "hardware transaction statistics"), 714 "hardware transaction statistics"),
715 OPT_CALLBACK('e', "event", &evsel_list, "event", 715 OPT_CALLBACK('e', "event", &evsel_list, "event",
@@ -1599,6 +1599,12 @@ int cmd_stat(int argc, const char **argv)
1599 return -ENOMEM; 1599 return -ENOMEM;
1600 1600
1601 parse_events__shrink_config_terms(); 1601 parse_events__shrink_config_terms();
1602
1603 /* String-parsing callback-based options would segfault when negated */
1604 set_option_flag(stat_options, 'e', "event", PARSE_OPT_NONEG);
1605 set_option_flag(stat_options, 'M', "metrics", PARSE_OPT_NONEG);
1606 set_option_flag(stat_options, 'G', "cgroup", PARSE_OPT_NONEG);
1607
1602 argc = parse_options_subcommand(argc, argv, stat_options, stat_subcommands, 1608 argc = parse_options_subcommand(argc, argv, stat_options, stat_subcommands,
1603 (const char **) stat_usage, 1609 (const char **) stat_usage,
1604 PARSE_OPT_STOP_AT_NON_OPTION); 1610 PARSE_OPT_STOP_AT_NON_OPTION);
diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c
index a827919c6263..775b99833e51 100644
--- a/tools/perf/builtin-timechart.c
+++ b/tools/perf/builtin-timechart.c
@@ -43,6 +43,10 @@
43#include "util/data.h" 43#include "util/data.h"
44#include "util/debug.h" 44#include "util/debug.h"
45 45
46#ifdef LACKS_OPEN_MEMSTREAM_PROTOTYPE
47FILE *open_memstream(char **ptr, size_t *sizeloc);
48#endif
49
46#define SUPPORT_OLD_POWER_EVENTS 1 50#define SUPPORT_OLD_POWER_EVENTS 1
47#define PWR_EVENT_EXIT -1 51#define PWR_EVENT_EXIT -1
48 52
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 366ec3c8f580..ebde59e61133 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -22,6 +22,7 @@
22#include "builtin.h" 22#include "builtin.h"
23#include "util/cgroup.h" 23#include "util/cgroup.h"
24#include "util/color.h" 24#include "util/color.h"
25#include "util/config.h"
25#include "util/debug.h" 26#include "util/debug.h"
26#include "util/env.h" 27#include "util/env.h"
27#include "util/event.h" 28#include "util/event.h"
@@ -76,6 +77,7 @@ struct trace {
76 struct { 77 struct {
77 int max; 78 int max;
78 struct syscall *table; 79 struct syscall *table;
80 struct bpf_map *map;
79 struct { 81 struct {
80 struct perf_evsel *sys_enter, 82 struct perf_evsel *sys_enter,
81 *sys_exit, 83 *sys_exit,
@@ -110,6 +112,7 @@ struct trace {
110 } stats; 112 } stats;
111 unsigned int max_stack; 113 unsigned int max_stack;
112 unsigned int min_stack; 114 unsigned int min_stack;
115 bool sort_events;
113 bool raw_augmented_syscalls; 116 bool raw_augmented_syscalls;
114 bool not_ev_qualifier; 117 bool not_ev_qualifier;
115 bool live; 118 bool live;
@@ -124,6 +127,12 @@ struct trace {
124 bool show_tool_stats; 127 bool show_tool_stats;
125 bool trace_syscalls; 128 bool trace_syscalls;
126 bool kernel_syscallchains; 129 bool kernel_syscallchains;
130 s16 args_alignment;
131 bool show_tstamp;
132 bool show_duration;
133 bool show_zeros;
134 bool show_arg_names;
135 bool show_string_prefix;
127 bool force; 136 bool force;
128 bool vfs_getname; 137 bool vfs_getname;
129 int trace_pgfaults; 138 int trace_pgfaults;
@@ -352,21 +361,25 @@ out_delete:
352 ({ struct syscall_tp *fields = evsel->priv; \ 361 ({ struct syscall_tp *fields = evsel->priv; \
353 fields->name.pointer(&fields->name, sample); }) 362 fields->name.pointer(&fields->name, sample); })
354 363
355size_t strarray__scnprintf(struct strarray *sa, char *bf, size_t size, const char *intfmt, int val) 364size_t strarray__scnprintf(struct strarray *sa, char *bf, size_t size, const char *intfmt, bool show_prefix, int val)
356{ 365{
357 int idx = val - sa->offset; 366 int idx = val - sa->offset;
358 367
359 if (idx < 0 || idx >= sa->nr_entries || sa->entries[idx] == NULL) 368 if (idx < 0 || idx >= sa->nr_entries || sa->entries[idx] == NULL) {
360 return scnprintf(bf, size, intfmt, val); 369 size_t printed = scnprintf(bf, size, intfmt, val);
370 if (show_prefix)
371 printed += scnprintf(bf + printed, size - printed, " /* %s??? */", sa->prefix);
372 return printed;
373 }
361 374
362 return scnprintf(bf, size, "%s", sa->entries[idx]); 375 return scnprintf(bf, size, "%s%s", show_prefix ? sa->prefix : "", sa->entries[idx]);
363} 376}
364 377
365static size_t __syscall_arg__scnprintf_strarray(char *bf, size_t size, 378static size_t __syscall_arg__scnprintf_strarray(char *bf, size_t size,
366 const char *intfmt, 379 const char *intfmt,
367 struct syscall_arg *arg) 380 struct syscall_arg *arg)
368{ 381{
369 return strarray__scnprintf(arg->parm, bf, size, intfmt, arg->val); 382 return strarray__scnprintf(arg->parm, bf, size, intfmt, arg->show_string_prefix, arg->val);
370} 383}
371 384
372static size_t syscall_arg__scnprintf_strarray(char *bf, size_t size, 385static size_t syscall_arg__scnprintf_strarray(char *bf, size_t size,
@@ -377,34 +390,32 @@ static size_t syscall_arg__scnprintf_strarray(char *bf, size_t size,
377 390
378#define SCA_STRARRAY syscall_arg__scnprintf_strarray 391#define SCA_STRARRAY syscall_arg__scnprintf_strarray
379 392
380struct strarrays { 393size_t strarrays__scnprintf(struct strarrays *sas, char *bf, size_t size, const char *intfmt, bool show_prefix, int val)
381 int nr_entries;
382 struct strarray **entries;
383};
384
385#define DEFINE_STRARRAYS(array) struct strarrays strarrays__##array = { \
386 .nr_entries = ARRAY_SIZE(array), \
387 .entries = array, \
388}
389
390size_t syscall_arg__scnprintf_strarrays(char *bf, size_t size,
391 struct syscall_arg *arg)
392{ 394{
393 struct strarrays *sas = arg->parm; 395 size_t printed;
394 int i; 396 int i;
395 397
396 for (i = 0; i < sas->nr_entries; ++i) { 398 for (i = 0; i < sas->nr_entries; ++i) {
397 struct strarray *sa = sas->entries[i]; 399 struct strarray *sa = sas->entries[i];
398 int idx = arg->val - sa->offset; 400 int idx = val - sa->offset;
399 401
400 if (idx >= 0 && idx < sa->nr_entries) { 402 if (idx >= 0 && idx < sa->nr_entries) {
401 if (sa->entries[idx] == NULL) 403 if (sa->entries[idx] == NULL)
402 break; 404 break;
403 return scnprintf(bf, size, "%s", sa->entries[idx]); 405 return scnprintf(bf, size, "%s%s", show_prefix ? sa->prefix : "", sa->entries[idx]);
404 } 406 }
405 } 407 }
406 408
407 return scnprintf(bf, size, "%d", arg->val); 409 printed = scnprintf(bf, size, intfmt, val);
410 if (show_prefix)
411 printed += scnprintf(bf + printed, size - printed, " /* %s??? */", sas->entries[0]->prefix);
412 return printed;
413}
414
415size_t syscall_arg__scnprintf_strarrays(char *bf, size_t size,
416 struct syscall_arg *arg)
417{
418 return strarrays__scnprintf(arg->parm, bf, size, "%d", arg->show_string_prefix, arg->val);
408} 419}
409 420
410#ifndef AT_FDCWD 421#ifndef AT_FDCWD
@@ -415,9 +426,10 @@ static size_t syscall_arg__scnprintf_fd_at(char *bf, size_t size,
415 struct syscall_arg *arg) 426 struct syscall_arg *arg)
416{ 427{
417 int fd = arg->val; 428 int fd = arg->val;
429 const char *prefix = "AT_FD";
418 430
419 if (fd == AT_FDCWD) 431 if (fd == AT_FDCWD)
420 return scnprintf(bf, size, "CWD"); 432 return scnprintf(bf, size, "%s%s", arg->show_string_prefix ? prefix : "", "CWD");
421 433
422 return syscall_arg__scnprintf_fd(bf, size, arg); 434 return syscall_arg__scnprintf_fd(bf, size, arg);
423} 435}
@@ -434,6 +446,13 @@ size_t syscall_arg__scnprintf_hex(char *bf, size_t size, struct syscall_arg *arg
434 return scnprintf(bf, size, "%#lx", arg->val); 446 return scnprintf(bf, size, "%#lx", arg->val);
435} 447}
436 448
449size_t syscall_arg__scnprintf_ptr(char *bf, size_t size, struct syscall_arg *arg)
450{
451 if (arg->val == 0)
452 return scnprintf(bf, size, "NULL");
453 return syscall_arg__scnprintf_hex(bf, size, arg);
454}
455
437size_t syscall_arg__scnprintf_int(char *bf, size_t size, struct syscall_arg *arg) 456size_t syscall_arg__scnprintf_int(char *bf, size_t size, struct syscall_arg *arg)
438{ 457{
439 return scnprintf(bf, size, "%d", arg->val); 458 return scnprintf(bf, size, "%d", arg->val);
@@ -448,13 +467,13 @@ static const char *bpf_cmd[] = {
448 "MAP_CREATE", "MAP_LOOKUP_ELEM", "MAP_UPDATE_ELEM", "MAP_DELETE_ELEM", 467 "MAP_CREATE", "MAP_LOOKUP_ELEM", "MAP_UPDATE_ELEM", "MAP_DELETE_ELEM",
449 "MAP_GET_NEXT_KEY", "PROG_LOAD", 468 "MAP_GET_NEXT_KEY", "PROG_LOAD",
450}; 469};
451static DEFINE_STRARRAY(bpf_cmd); 470static DEFINE_STRARRAY(bpf_cmd, "BPF_");
452 471
453static const char *epoll_ctl_ops[] = { "ADD", "DEL", "MOD", }; 472static const char *epoll_ctl_ops[] = { "ADD", "DEL", "MOD", };
454static DEFINE_STRARRAY_OFFSET(epoll_ctl_ops, 1); 473static DEFINE_STRARRAY_OFFSET(epoll_ctl_ops, "EPOLL_CTL_", 1);
455 474
456static const char *itimers[] = { "REAL", "VIRTUAL", "PROF", }; 475static const char *itimers[] = { "REAL", "VIRTUAL", "PROF", };
457static DEFINE_STRARRAY(itimers); 476static DEFINE_STRARRAY(itimers, "ITIMER_");
458 477
459static const char *keyctl_options[] = { 478static const char *keyctl_options[] = {
460 "GET_KEYRING_ID", "JOIN_SESSION_KEYRING", "UPDATE", "REVOKE", "CHOWN", 479 "GET_KEYRING_ID", "JOIN_SESSION_KEYRING", "UPDATE", "REVOKE", "CHOWN",
@@ -463,7 +482,7 @@ static const char *keyctl_options[] = {
463 "ASSUME_AUTHORITY", "GET_SECURITY", "SESSION_TO_PARENT", "REJECT", 482 "ASSUME_AUTHORITY", "GET_SECURITY", "SESSION_TO_PARENT", "REJECT",
464 "INSTANTIATE_IOV", "INVALIDATE", "GET_PERSISTENT", 483 "INSTANTIATE_IOV", "INVALIDATE", "GET_PERSISTENT",
465}; 484};
466static DEFINE_STRARRAY(keyctl_options); 485static DEFINE_STRARRAY(keyctl_options, "KEYCTL_");
467 486
468static const char *whences[] = { "SET", "CUR", "END", 487static const char *whences[] = { "SET", "CUR", "END",
469#ifdef SEEK_DATA 488#ifdef SEEK_DATA
@@ -473,7 +492,7 @@ static const char *whences[] = { "SET", "CUR", "END",
473"HOLE", 492"HOLE",
474#endif 493#endif
475}; 494};
476static DEFINE_STRARRAY(whences); 495static DEFINE_STRARRAY(whences, "SEEK_");
477 496
478static const char *fcntl_cmds[] = { 497static const char *fcntl_cmds[] = {
479 "DUPFD", "GETFD", "SETFD", "GETFL", "SETFL", "GETLK", "SETLK", 498 "DUPFD", "GETFD", "SETFD", "GETFL", "SETFL", "GETLK", "SETLK",
@@ -481,7 +500,7 @@ static const char *fcntl_cmds[] = {
481 "SETLK64", "SETLKW64", "SETOWN_EX", "GETOWN_EX", 500 "SETLK64", "SETLKW64", "SETOWN_EX", "GETOWN_EX",
482 "GETOWNER_UIDS", 501 "GETOWNER_UIDS",
483}; 502};
484static DEFINE_STRARRAY(fcntl_cmds); 503static DEFINE_STRARRAY(fcntl_cmds, "F_");
485 504
486static const char *fcntl_linux_specific_cmds[] = { 505static const char *fcntl_linux_specific_cmds[] = {
487 "SETLEASE", "GETLEASE", "NOTIFY", [5] = "CANCELLK", "DUPFD_CLOEXEC", 506 "SETLEASE", "GETLEASE", "NOTIFY", [5] = "CANCELLK", "DUPFD_CLOEXEC",
@@ -489,7 +508,7 @@ static const char *fcntl_linux_specific_cmds[] = {
489 "GET_RW_HINT", "SET_RW_HINT", "GET_FILE_RW_HINT", "SET_FILE_RW_HINT", 508 "GET_RW_HINT", "SET_RW_HINT", "GET_FILE_RW_HINT", "SET_FILE_RW_HINT",
490}; 509};
491 510
492static DEFINE_STRARRAY_OFFSET(fcntl_linux_specific_cmds, F_LINUX_SPECIFIC_BASE); 511static DEFINE_STRARRAY_OFFSET(fcntl_linux_specific_cmds, "F_", F_LINUX_SPECIFIC_BASE);
493 512
494static struct strarray *fcntl_cmds_arrays[] = { 513static struct strarray *fcntl_cmds_arrays[] = {
495 &strarray__fcntl_cmds, 514 &strarray__fcntl_cmds,
@@ -503,29 +522,31 @@ static const char *rlimit_resources[] = {
503 "MEMLOCK", "AS", "LOCKS", "SIGPENDING", "MSGQUEUE", "NICE", "RTPRIO", 522 "MEMLOCK", "AS", "LOCKS", "SIGPENDING", "MSGQUEUE", "NICE", "RTPRIO",
504 "RTTIME", 523 "RTTIME",
505}; 524};
506static DEFINE_STRARRAY(rlimit_resources); 525static DEFINE_STRARRAY(rlimit_resources, "RLIMIT_");
507 526
508static const char *sighow[] = { "BLOCK", "UNBLOCK", "SETMASK", }; 527static const char *sighow[] = { "BLOCK", "UNBLOCK", "SETMASK", };
509static DEFINE_STRARRAY(sighow); 528static DEFINE_STRARRAY(sighow, "SIG_");
510 529
511static const char *clockid[] = { 530static const char *clockid[] = {
512 "REALTIME", "MONOTONIC", "PROCESS_CPUTIME_ID", "THREAD_CPUTIME_ID", 531 "REALTIME", "MONOTONIC", "PROCESS_CPUTIME_ID", "THREAD_CPUTIME_ID",
513 "MONOTONIC_RAW", "REALTIME_COARSE", "MONOTONIC_COARSE", "BOOTTIME", 532 "MONOTONIC_RAW", "REALTIME_COARSE", "MONOTONIC_COARSE", "BOOTTIME",
514 "REALTIME_ALARM", "BOOTTIME_ALARM", "SGI_CYCLE", "TAI" 533 "REALTIME_ALARM", "BOOTTIME_ALARM", "SGI_CYCLE", "TAI"
515}; 534};
516static DEFINE_STRARRAY(clockid); 535static DEFINE_STRARRAY(clockid, "CLOCK_");
517 536
518static size_t syscall_arg__scnprintf_access_mode(char *bf, size_t size, 537static size_t syscall_arg__scnprintf_access_mode(char *bf, size_t size,
519 struct syscall_arg *arg) 538 struct syscall_arg *arg)
520{ 539{
540 bool show_prefix = arg->show_string_prefix;
541 const char *suffix = "_OK";
521 size_t printed = 0; 542 size_t printed = 0;
522 int mode = arg->val; 543 int mode = arg->val;
523 544
524 if (mode == F_OK) /* 0 */ 545 if (mode == F_OK) /* 0 */
525 return scnprintf(bf, size, "F"); 546 return scnprintf(bf, size, "F%s", show_prefix ? suffix : "");
526#define P_MODE(n) \ 547#define P_MODE(n) \
527 if (mode & n##_OK) { \ 548 if (mode & n##_OK) { \
528 printed += scnprintf(bf + printed, size - printed, "%s", #n); \ 549 printed += scnprintf(bf + printed, size - printed, "%s%s", #n, show_prefix ? suffix : ""); \
529 mode &= ~n##_OK; \ 550 mode &= ~n##_OK; \
530 } 551 }
531 552
@@ -550,11 +571,13 @@ static size_t syscall_arg__scnprintf_filename(char *bf, size_t size,
550static size_t syscall_arg__scnprintf_pipe_flags(char *bf, size_t size, 571static size_t syscall_arg__scnprintf_pipe_flags(char *bf, size_t size,
551 struct syscall_arg *arg) 572 struct syscall_arg *arg)
552{ 573{
574 bool show_prefix = arg->show_string_prefix;
575 const char *prefix = "O_";
553 int printed = 0, flags = arg->val; 576 int printed = 0, flags = arg->val;
554 577
555#define P_FLAG(n) \ 578#define P_FLAG(n) \
556 if (flags & O_##n) { \ 579 if (flags & O_##n) { \
557 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \ 580 printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
558 flags &= ~O_##n; \ 581 flags &= ~O_##n; \
559 } 582 }
560 583
@@ -580,11 +603,13 @@ static size_t syscall_arg__scnprintf_pipe_flags(char *bf, size_t size,
580static size_t syscall_arg__scnprintf_getrandom_flags(char *bf, size_t size, 603static size_t syscall_arg__scnprintf_getrandom_flags(char *bf, size_t size,
581 struct syscall_arg *arg) 604 struct syscall_arg *arg)
582{ 605{
606 bool show_prefix = arg->show_string_prefix;
607 const char *prefix = "GRND_";
583 int printed = 0, flags = arg->val; 608 int printed = 0, flags = arg->val;
584 609
585#define P_FLAG(n) \ 610#define P_FLAG(n) \
586 if (flags & GRND_##n) { \ 611 if (flags & GRND_##n) { \
587 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \ 612 printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
588 flags &= ~GRND_##n; \ 613 flags &= ~GRND_##n; \
589 } 614 }
590 615
@@ -639,12 +664,15 @@ static struct syscall_fmt {
639} syscall_fmts[] = { 664} syscall_fmts[] = {
640 { .name = "access", 665 { .name = "access",
641 .arg = { [1] = { .scnprintf = SCA_ACCMODE, /* mode */ }, }, }, 666 .arg = { [1] = { .scnprintf = SCA_ACCMODE, /* mode */ }, }, },
667 { .name = "arch_prctl",
668 .arg = { [0] = { .scnprintf = SCA_X86_ARCH_PRCTL_CODE, /* code */ },
669 [1] = { .scnprintf = SCA_PTR, /* arg2 */ }, }, },
642 { .name = "bind", 670 { .name = "bind",
643 .arg = { [1] = { .scnprintf = SCA_SOCKADDR, /* umyaddr */ }, }, }, 671 .arg = { [1] = { .scnprintf = SCA_SOCKADDR, /* umyaddr */ }, }, },
644 { .name = "bpf", 672 { .name = "bpf",
645 .arg = { [0] = STRARRAY(cmd, bpf_cmd), }, }, 673 .arg = { [0] = STRARRAY(cmd, bpf_cmd), }, },
646 { .name = "brk", .hexret = true, 674 { .name = "brk", .hexret = true,
647 .arg = { [0] = { .scnprintf = SCA_HEX, /* brk */ }, }, }, 675 .arg = { [0] = { .scnprintf = SCA_PTR, /* brk */ }, }, },
648 { .name = "clock_gettime", 676 { .name = "clock_gettime",
649 .arg = { [0] = STRARRAY(clk_id, clockid), }, }, 677 .arg = { [0] = STRARRAY(clk_id, clockid), }, },
650 { .name = "clone", .errpid = true, .nr_args = 5, 678 { .name = "clone", .errpid = true, .nr_args = 5,
@@ -722,18 +750,14 @@ static struct syscall_fmt {
722 .arg = { [0] = { .scnprintf = SCA_FDAT, /* fd */ }, }, }, 750 .arg = { [0] = { .scnprintf = SCA_FDAT, /* fd */ }, }, },
723 { .name = "mknodat", 751 { .name = "mknodat",
724 .arg = { [0] = { .scnprintf = SCA_FDAT, /* fd */ }, }, }, 752 .arg = { [0] = { .scnprintf = SCA_FDAT, /* fd */ }, }, },
725 { .name = "mlock",
726 .arg = { [0] = { .scnprintf = SCA_HEX, /* addr */ }, }, },
727 { .name = "mlockall",
728 .arg = { [0] = { .scnprintf = SCA_HEX, /* addr */ }, }, },
729 { .name = "mmap", .hexret = true, 753 { .name = "mmap", .hexret = true,
730/* The standard mmap maps to old_mmap on s390x */ 754/* The standard mmap maps to old_mmap on s390x */
731#if defined(__s390x__) 755#if defined(__s390x__)
732 .alias = "old_mmap", 756 .alias = "old_mmap",
733#endif 757#endif
734 .arg = { [0] = { .scnprintf = SCA_HEX, /* addr */ }, 758 .arg = { [2] = { .scnprintf = SCA_MMAP_PROT, /* prot */ },
735 [2] = { .scnprintf = SCA_MMAP_PROT, /* prot */ }, 759 [3] = { .scnprintf = SCA_MMAP_FLAGS, /* flags */ },
736 [3] = { .scnprintf = SCA_MMAP_FLAGS, /* flags */ }, }, }, 760 [5] = { .scnprintf = SCA_HEX, /* offset */ }, }, },
737 { .name = "mount", 761 { .name = "mount",
738 .arg = { [0] = { .scnprintf = SCA_FILENAME, /* dev_name */ }, 762 .arg = { [0] = { .scnprintf = SCA_FILENAME, /* dev_name */ },
739 [3] = { .scnprintf = SCA_MOUNT_FLAGS, /* flags */ 763 [3] = { .scnprintf = SCA_MOUNT_FLAGS, /* flags */
@@ -744,13 +768,7 @@ static struct syscall_fmt {
744 { .name = "mq_unlink", 768 { .name = "mq_unlink",
745 .arg = { [0] = { .scnprintf = SCA_FILENAME, /* u_name */ }, }, }, 769 .arg = { [0] = { .scnprintf = SCA_FILENAME, /* u_name */ }, }, },
746 { .name = "mremap", .hexret = true, 770 { .name = "mremap", .hexret = true,
747 .arg = { [0] = { .scnprintf = SCA_HEX, /* addr */ }, 771 .arg = { [3] = { .scnprintf = SCA_MREMAP_FLAGS, /* flags */ }, }, },
748 [3] = { .scnprintf = SCA_MREMAP_FLAGS, /* flags */ },
749 [4] = { .scnprintf = SCA_HEX, /* new_addr */ }, }, },
750 { .name = "munlock",
751 .arg = { [0] = { .scnprintf = SCA_HEX, /* addr */ }, }, },
752 { .name = "munmap",
753 .arg = { [0] = { .scnprintf = SCA_HEX, /* addr */ }, }, },
754 { .name = "name_to_handle_at", 772 { .name = "name_to_handle_at",
755 .arg = { [0] = { .scnprintf = SCA_FDAT, /* dfd */ }, }, }, 773 .arg = { [0] = { .scnprintf = SCA_FDAT, /* dfd */ }, }, },
756 { .name = "newfstatat", 774 { .name = "newfstatat",
@@ -779,7 +797,7 @@ static struct syscall_fmt {
779 [3] = { .scnprintf = SCA_INT, /* pkey */ }, }, }, 797 [3] = { .scnprintf = SCA_INT, /* pkey */ }, }, },
780 { .name = "poll", .timeout = true, }, 798 { .name = "poll", .timeout = true, },
781 { .name = "ppoll", .timeout = true, }, 799 { .name = "ppoll", .timeout = true, },
782 { .name = "prctl", .alias = "arch_prctl", 800 { .name = "prctl",
783 .arg = { [0] = { .scnprintf = SCA_PRCTL_OPTION, /* option */ }, 801 .arg = { [0] = { .scnprintf = SCA_PRCTL_OPTION, /* option */ },
784 [1] = { .scnprintf = SCA_PRCTL_ARG2, /* arg2 */ }, 802 [1] = { .scnprintf = SCA_PRCTL_ARG2, /* arg2 */ },
785 [2] = { .scnprintf = SCA_PRCTL_ARG3, /* arg3 */ }, }, }, 803 [2] = { .scnprintf = SCA_PRCTL_ARG3, /* arg3 */ }, }, },
@@ -797,7 +815,12 @@ static struct syscall_fmt {
797 { .name = "recvmsg", 815 { .name = "recvmsg",
798 .arg = { [2] = { .scnprintf = SCA_MSG_FLAGS, /* flags */ }, }, }, 816 .arg = { [2] = { .scnprintf = SCA_MSG_FLAGS, /* flags */ }, }, },
799 { .name = "renameat", 817 { .name = "renameat",
800 .arg = { [0] = { .scnprintf = SCA_FDAT, /* dfd */ }, }, }, 818 .arg = { [0] = { .scnprintf = SCA_FDAT, /* olddirfd */ },
819 [2] = { .scnprintf = SCA_FDAT, /* newdirfd */ }, }, },
820 { .name = "renameat2",
821 .arg = { [0] = { .scnprintf = SCA_FDAT, /* olddirfd */ },
822 [2] = { .scnprintf = SCA_FDAT, /* newdirfd */ },
823 [4] = { .scnprintf = SCA_RENAMEAT2_FLAGS, /* flags */ }, }, },
801 { .name = "rt_sigaction", 824 { .name = "rt_sigaction",
802 .arg = { [0] = { .scnprintf = SCA_SIGNUM, /* sig */ }, }, }, 825 .arg = { [0] = { .scnprintf = SCA_SIGNUM, /* sig */ }, }, },
803 { .name = "rt_sigprocmask", 826 { .name = "rt_sigprocmask",
@@ -901,6 +924,10 @@ struct syscall {
901 struct syscall_arg_fmt *arg_fmt; 924 struct syscall_arg_fmt *arg_fmt;
902}; 925};
903 926
927struct bpf_map_syscall_entry {
928 bool enabled;
929};
930
904/* 931/*
905 * We need to have this 'calculated' boolean because in some cases we really 932 * We need to have this 'calculated' boolean because in some cases we really
906 * don't know what is the duration of a syscall, for instance, when we start 933 * don't know what is the duration of a syscall, for instance, when we start
@@ -1132,7 +1159,7 @@ static size_t syscall_arg__scnprintf_augmented_string(struct syscall_arg *arg, c
1132{ 1159{
1133 struct augmented_arg *augmented_arg = arg->augmented.args; 1160 struct augmented_arg *augmented_arg = arg->augmented.args;
1134 1161
1135 return scnprintf(bf, size, "%.*s", augmented_arg->size, augmented_arg->value); 1162 return scnprintf(bf, size, "\"%.*s\"", augmented_arg->size, augmented_arg->value);
1136} 1163}
1137 1164
1138static size_t syscall_arg__scnprintf_filename(char *bf, size_t size, 1165static size_t syscall_arg__scnprintf_filename(char *bf, size_t size,
@@ -1201,8 +1228,12 @@ static size_t trace__fprintf_comm_tid(struct trace *trace, struct thread *thread
1201static size_t trace__fprintf_entry_head(struct trace *trace, struct thread *thread, 1228static size_t trace__fprintf_entry_head(struct trace *trace, struct thread *thread,
1202 u64 duration, bool duration_calculated, u64 tstamp, FILE *fp) 1229 u64 duration, bool duration_calculated, u64 tstamp, FILE *fp)
1203{ 1230{
1204 size_t printed = trace__fprintf_tstamp(trace, tstamp, fp); 1231 size_t printed = 0;
1205 printed += fprintf_duration(duration, duration_calculated, fp); 1232
1233 if (trace->show_tstamp)
1234 printed = trace__fprintf_tstamp(trace, tstamp, fp);
1235 if (trace->show_duration)
1236 printed += fprintf_duration(duration, duration_calculated, fp);
1206 return printed + trace__fprintf_comm_tid(trace, thread, fp); 1237 return printed + trace__fprintf_comm_tid(trace, thread, fp);
1207} 1238}
1208 1239
@@ -1321,8 +1352,8 @@ static int syscall__set_arg_fmts(struct syscall *sc)
1321 strcmp(field->name, "path") == 0 || 1352 strcmp(field->name, "path") == 0 ||
1322 strcmp(field->name, "pathname") == 0)) 1353 strcmp(field->name, "pathname") == 0))
1323 sc->arg_fmt[idx].scnprintf = SCA_FILENAME; 1354 sc->arg_fmt[idx].scnprintf = SCA_FILENAME;
1324 else if (field->flags & TEP_FIELD_IS_POINTER) 1355 else if ((field->flags & TEP_FIELD_IS_POINTER) || strstr(field->name, "addr"))
1325 sc->arg_fmt[idx].scnprintf = syscall_arg__scnprintf_hex; 1356 sc->arg_fmt[idx].scnprintf = SCA_PTR;
1326 else if (strcmp(field->type, "pid_t") == 0) 1357 else if (strcmp(field->type, "pid_t") == 0)
1327 sc->arg_fmt[idx].scnprintf = SCA_PID; 1358 sc->arg_fmt[idx].scnprintf = SCA_PID;
1328 else if (strcmp(field->type, "umode_t") == 0) 1359 else if (strcmp(field->type, "umode_t") == 0)
@@ -1555,6 +1586,7 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,
1555 .mask = 0, 1586 .mask = 0,
1556 .trace = trace, 1587 .trace = trace,
1557 .thread = thread, 1588 .thread = thread,
1589 .show_string_prefix = trace->show_string_prefix,
1558 }; 1590 };
1559 struct thread_trace *ttrace = thread__priv(thread); 1591 struct thread_trace *ttrace = thread__priv(thread);
1560 1592
@@ -1586,6 +1618,7 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,
1586 * strarray for it. 1618 * strarray for it.
1587 */ 1619 */
1588 if (val == 0 && 1620 if (val == 0 &&
1621 !trace->show_zeros &&
1589 !(sc->arg_fmt && 1622 !(sc->arg_fmt &&
1590 (sc->arg_fmt[arg.idx].show_zero || 1623 (sc->arg_fmt[arg.idx].show_zero ||
1591 sc->arg_fmt[arg.idx].scnprintf == SCA_STRARRAY || 1624 sc->arg_fmt[arg.idx].scnprintf == SCA_STRARRAY ||
@@ -1593,8 +1626,11 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,
1593 sc->arg_fmt[arg.idx].parm)) 1626 sc->arg_fmt[arg.idx].parm))
1594 continue; 1627 continue;
1595 1628
1596 printed += scnprintf(bf + printed, size - printed, 1629 printed += scnprintf(bf + printed, size - printed, "%s", printed ? ", " : "");
1597 "%s%s: ", printed ? ", " : "", field->name); 1630
1631 if (trace->show_arg_names)
1632 printed += scnprintf(bf + printed, size - printed, "%s: ", field->name);
1633
1598 printed += syscall__scnprintf_val(sc, bf + printed, size - printed, &arg, val); 1634 printed += syscall__scnprintf_val(sc, bf + printed, size - printed, &arg, val);
1599 } 1635 }
1600 } else if (IS_ERR(sc->tp_format)) { 1636 } else if (IS_ERR(sc->tp_format)) {
@@ -1707,7 +1743,7 @@ static int trace__printf_interrupted_entry(struct trace *trace)
1707 return 0; 1743 return 0;
1708 1744
1709 printed = trace__fprintf_entry_head(trace, trace->current, 0, false, ttrace->entry_time, trace->output); 1745 printed = trace__fprintf_entry_head(trace, trace->current, 0, false, ttrace->entry_time, trace->output);
1710 printed += fprintf(trace->output, "%-70s) ...\n", ttrace->entry_str); 1746 printed += fprintf(trace->output, ")%-*s ...\n", trace->args_alignment, ttrace->entry_str);
1711 ttrace->entry_pending = false; 1747 ttrace->entry_pending = false;
1712 1748
1713 ++trace->nr_events_printed; 1749 ++trace->nr_events_printed;
@@ -1764,7 +1800,7 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel,
1764{ 1800{
1765 char *msg; 1801 char *msg;
1766 void *args; 1802 void *args;
1767 size_t printed = 0; 1803 int printed = 0;
1768 struct thread *thread; 1804 struct thread *thread;
1769 int id = perf_evsel__sc_tp_uint(evsel, id, sample), err = -1; 1805 int id = perf_evsel__sc_tp_uint(evsel, id, sample), err = -1;
1770 int augmented_args_size = 0; 1806 int augmented_args_size = 0;
@@ -1813,8 +1849,13 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel,
1813 1849
1814 if (sc->is_exit) { 1850 if (sc->is_exit) {
1815 if (!(trace->duration_filter || trace->summary_only || trace->failure_only || trace->min_stack)) { 1851 if (!(trace->duration_filter || trace->summary_only || trace->failure_only || trace->min_stack)) {
1852 int alignment = 0;
1853
1816 trace__fprintf_entry_head(trace, thread, 0, false, ttrace->entry_time, trace->output); 1854 trace__fprintf_entry_head(trace, thread, 0, false, ttrace->entry_time, trace->output);
1817 fprintf(trace->output, "%-70s)\n", ttrace->entry_str); 1855 printed = fprintf(trace->output, "%s)", ttrace->entry_str);
1856 if (trace->args_alignment > printed)
1857 alignment = trace->args_alignment - printed;
1858 fprintf(trace->output, "%*s= ?\n", alignment, " ");
1818 } 1859 }
1819 } else { 1860 } else {
1820 ttrace->entry_pending = true; 1861 ttrace->entry_pending = true;
@@ -1909,7 +1950,8 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel,
1909 u64 duration = 0; 1950 u64 duration = 0;
1910 bool duration_calculated = false; 1951 bool duration_calculated = false;
1911 struct thread *thread; 1952 struct thread *thread;
1912 int id = perf_evsel__sc_tp_uint(evsel, id, sample), err = -1, callchain_ret = 0; 1953 int id = perf_evsel__sc_tp_uint(evsel, id, sample), err = -1, callchain_ret = 0, printed = 0;
1954 int alignment = trace->args_alignment;
1913 struct syscall *sc = trace__syscall_info(trace, evsel, id); 1955 struct syscall *sc = trace__syscall_info(trace, evsel, id);
1914 struct thread_trace *ttrace; 1956 struct thread_trace *ttrace;
1915 1957
@@ -1957,28 +1999,37 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel,
1957 trace__fprintf_entry_head(trace, thread, duration, duration_calculated, ttrace->entry_time, trace->output); 1999 trace__fprintf_entry_head(trace, thread, duration, duration_calculated, ttrace->entry_time, trace->output);
1958 2000
1959 if (ttrace->entry_pending) { 2001 if (ttrace->entry_pending) {
1960 fprintf(trace->output, "%-70s", ttrace->entry_str); 2002 printed = fprintf(trace->output, "%s", ttrace->entry_str);
1961 } else { 2003 } else {
1962 fprintf(trace->output, " ... ["); 2004 fprintf(trace->output, " ... [");
1963 color_fprintf(trace->output, PERF_COLOR_YELLOW, "continued"); 2005 color_fprintf(trace->output, PERF_COLOR_YELLOW, "continued");
1964 fprintf(trace->output, "]: %s()", sc->name); 2006 fprintf(trace->output, "]: %s()", sc->name);
1965 } 2007 }
1966 2008
2009 printed++; /* the closing ')' */
2010
2011 if (alignment > printed)
2012 alignment -= printed;
2013 else
2014 alignment = 0;
2015
2016 fprintf(trace->output, ")%*s= ", alignment, " ");
2017
1967 if (sc->fmt == NULL) { 2018 if (sc->fmt == NULL) {
1968 if (ret < 0) 2019 if (ret < 0)
1969 goto errno_print; 2020 goto errno_print;
1970signed_print: 2021signed_print:
1971 fprintf(trace->output, ") = %ld", ret); 2022 fprintf(trace->output, "%ld", ret);
1972 } else if (ret < 0) { 2023 } else if (ret < 0) {
1973errno_print: { 2024errno_print: {
1974 char bf[STRERR_BUFSIZE]; 2025 char bf[STRERR_BUFSIZE];
1975 const char *emsg = str_error_r(-ret, bf, sizeof(bf)), 2026 const char *emsg = str_error_r(-ret, bf, sizeof(bf)),
1976 *e = errno_to_name(evsel, -ret); 2027 *e = errno_to_name(evsel, -ret);
1977 2028
1978 fprintf(trace->output, ") = -1 %s %s", e, emsg); 2029 fprintf(trace->output, "-1 %s (%s)", e, emsg);
1979 } 2030 }
1980 } else if (ret == 0 && sc->fmt->timeout) 2031 } else if (ret == 0 && sc->fmt->timeout)
1981 fprintf(trace->output, ") = 0 Timeout"); 2032 fprintf(trace->output, "0 (Timeout)");
1982 else if (ttrace->ret_scnprintf) { 2033 else if (ttrace->ret_scnprintf) {
1983 char bf[1024]; 2034 char bf[1024];
1984 struct syscall_arg arg = { 2035 struct syscall_arg arg = {
@@ -1988,14 +2039,14 @@ errno_print: {
1988 }; 2039 };
1989 ttrace->ret_scnprintf(bf, sizeof(bf), &arg); 2040 ttrace->ret_scnprintf(bf, sizeof(bf), &arg);
1990 ttrace->ret_scnprintf = NULL; 2041 ttrace->ret_scnprintf = NULL;
1991 fprintf(trace->output, ") = %s", bf); 2042 fprintf(trace->output, "%s", bf);
1992 } else if (sc->fmt->hexret) 2043 } else if (sc->fmt->hexret)
1993 fprintf(trace->output, ") = %#lx", ret); 2044 fprintf(trace->output, "%#lx", ret);
1994 else if (sc->fmt->errpid) { 2045 else if (sc->fmt->errpid) {
1995 struct thread *child = machine__find_thread(trace->host, ret, ret); 2046 struct thread *child = machine__find_thread(trace->host, ret, ret);
1996 2047
1997 if (child != NULL) { 2048 if (child != NULL) {
1998 fprintf(trace->output, ") = %ld", ret); 2049 fprintf(trace->output, "%ld", ret);
1999 if (child->comm_set) 2050 if (child->comm_set)
2000 fprintf(trace->output, " (%s)", thread__comm_str(child)); 2051 fprintf(trace->output, " (%s)", thread__comm_str(child));
2001 thread__put(child); 2052 thread__put(child);
@@ -2176,7 +2227,7 @@ static int trace__event_handler(struct trace *trace, struct perf_evsel *evsel,
2176 trace__printf_interrupted_entry(trace); 2227 trace__printf_interrupted_entry(trace);
2177 trace__fprintf_tstamp(trace, sample->time, trace->output); 2228 trace__fprintf_tstamp(trace, sample->time, trace->output);
2178 2229
2179 if (trace->trace_syscalls) 2230 if (trace->trace_syscalls && trace->show_duration)
2180 fprintf(trace->output, "( ): "); 2231 fprintf(trace->output, "( ): ");
2181 2232
2182 if (thread) 2233 if (thread)
@@ -2547,7 +2598,7 @@ out_delete_sys_enter:
2547 goto out; 2598 goto out;
2548} 2599}
2549 2600
2550static int trace__set_ev_qualifier_filter(struct trace *trace) 2601static int trace__set_ev_qualifier_tp_filter(struct trace *trace)
2551{ 2602{
2552 int err = -1; 2603 int err = -1;
2553 struct perf_evsel *sys_exit; 2604 struct perf_evsel *sys_exit;
@@ -2572,6 +2623,72 @@ out_enomem:
2572 goto out; 2623 goto out;
2573} 2624}
2574 2625
2626#ifdef HAVE_LIBBPF_SUPPORT
2627static int trace__set_ev_qualifier_bpf_filter(struct trace *trace)
2628{
2629 int fd = bpf_map__fd(trace->syscalls.map);
2630 struct bpf_map_syscall_entry value = {
2631 .enabled = !trace->not_ev_qualifier,
2632 };
2633 int err = 0;
2634 size_t i;
2635
2636 for (i = 0; i < trace->ev_qualifier_ids.nr; ++i) {
2637 int key = trace->ev_qualifier_ids.entries[i];
2638
2639 err = bpf_map_update_elem(fd, &key, &value, BPF_EXIST);
2640 if (err)
2641 break;
2642 }
2643
2644 return err;
2645}
2646
2647static int __trace__init_syscalls_bpf_map(struct trace *trace, bool enabled)
2648{
2649 int fd = bpf_map__fd(trace->syscalls.map);
2650 struct bpf_map_syscall_entry value = {
2651 .enabled = enabled,
2652 };
2653 int err = 0, key;
2654
2655 for (key = 0; key < trace->sctbl->syscalls.nr_entries; ++key) {
2656 err = bpf_map_update_elem(fd, &key, &value, BPF_ANY);
2657 if (err)
2658 break;
2659 }
2660
2661 return err;
2662}
2663
2664static int trace__init_syscalls_bpf_map(struct trace *trace)
2665{
2666 bool enabled = true;
2667
2668 if (trace->ev_qualifier_ids.nr)
2669 enabled = trace->not_ev_qualifier;
2670
2671 return __trace__init_syscalls_bpf_map(trace, enabled);
2672}
2673#else
2674static int trace__set_ev_qualifier_bpf_filter(struct trace *trace __maybe_unused)
2675{
2676 return 0;
2677}
2678
2679static int trace__init_syscalls_bpf_map(struct trace *trace __maybe_unused)
2680{
2681 return 0;
2682}
2683#endif // HAVE_LIBBPF_SUPPORT
2684
2685static int trace__set_ev_qualifier_filter(struct trace *trace)
2686{
2687 if (trace->syscalls.map)
2688 return trace__set_ev_qualifier_bpf_filter(trace);
2689 return trace__set_ev_qualifier_tp_filter(trace);
2690}
2691
2575static int bpf_map__set_filter_pids(struct bpf_map *map __maybe_unused, 2692static int bpf_map__set_filter_pids(struct bpf_map *map __maybe_unused,
2576 size_t npids __maybe_unused, pid_t *pids __maybe_unused) 2693 size_t npids __maybe_unused, pid_t *pids __maybe_unused)
2577{ 2694{
@@ -2641,7 +2758,7 @@ static int trace__set_filter_pids(struct trace *trace)
2641 return err; 2758 return err;
2642} 2759}
2643 2760
2644static int trace__deliver_event(struct trace *trace, union perf_event *event) 2761static int __trace__deliver_event(struct trace *trace, union perf_event *event)
2645{ 2762{
2646 struct perf_evlist *evlist = trace->evlist; 2763 struct perf_evlist *evlist = trace->evlist;
2647 struct perf_sample sample; 2764 struct perf_sample sample;
@@ -2656,7 +2773,7 @@ static int trace__deliver_event(struct trace *trace, union perf_event *event)
2656 return 0; 2773 return 0;
2657} 2774}
2658 2775
2659static int trace__flush_ordered_events(struct trace *trace) 2776static int __trace__flush_events(struct trace *trace)
2660{ 2777{
2661 u64 first = ordered_events__first_time(&trace->oe.data); 2778 u64 first = ordered_events__first_time(&trace->oe.data);
2662 u64 flush = trace->oe.last - NSEC_PER_SEC; 2779 u64 flush = trace->oe.last - NSEC_PER_SEC;
@@ -2668,12 +2785,19 @@ static int trace__flush_ordered_events(struct trace *trace)
2668 return 0; 2785 return 0;
2669} 2786}
2670 2787
2671static int trace__deliver_ordered_event(struct trace *trace, union perf_event *event) 2788static int trace__flush_events(struct trace *trace)
2789{
2790 return !trace->sort_events ? 0 : __trace__flush_events(trace);
2791}
2792
2793static int trace__deliver_event(struct trace *trace, union perf_event *event)
2672{ 2794{
2673 struct perf_evlist *evlist = trace->evlist;
2674 int err; 2795 int err;
2675 2796
2676 err = perf_evlist__parse_sample_timestamp(evlist, event, &trace->oe.last); 2797 if (!trace->sort_events)
2798 return __trace__deliver_event(trace, event);
2799
2800 err = perf_evlist__parse_sample_timestamp(trace->evlist, event, &trace->oe.last);
2677 if (err && err != -1) 2801 if (err && err != -1)
2678 return err; 2802 return err;
2679 2803
@@ -2681,7 +2805,7 @@ static int trace__deliver_ordered_event(struct trace *trace, union perf_event *e
2681 if (err) 2805 if (err)
2682 return err; 2806 return err;
2683 2807
2684 return trace__flush_ordered_events(trace); 2808 return trace__flush_events(trace);
2685} 2809}
2686 2810
2687static int ordered_events__deliver_event(struct ordered_events *oe, 2811static int ordered_events__deliver_event(struct ordered_events *oe,
@@ -2689,7 +2813,7 @@ static int ordered_events__deliver_event(struct ordered_events *oe,
2689{ 2813{
2690 struct trace *trace = container_of(oe, struct trace, oe.data); 2814 struct trace *trace = container_of(oe, struct trace, oe.data);
2691 2815
2692 return trace__deliver_event(trace, event->event); 2816 return __trace__deliver_event(trace, event->event);
2693} 2817}
2694 2818
2695static int trace__run(struct trace *trace, int argc, const char **argv) 2819static int trace__run(struct trace *trace, int argc, const char **argv)
@@ -2703,11 +2827,13 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
2703 2827
2704 trace->live = true; 2828 trace->live = true;
2705 2829
2706 if (trace->trace_syscalls && trace__add_syscall_newtp(trace)) 2830 if (!trace->raw_augmented_syscalls) {
2707 goto out_error_raw_syscalls; 2831 if (trace->trace_syscalls && trace__add_syscall_newtp(trace))
2832 goto out_error_raw_syscalls;
2708 2833
2709 if (trace->trace_syscalls) 2834 if (trace->trace_syscalls)
2710 trace->vfs_getname = perf_evlist__add_vfs_getname(evlist); 2835 trace->vfs_getname = perf_evlist__add_vfs_getname(evlist);
2836 }
2711 2837
2712 if ((trace->trace_pgfaults & TRACE_PFMAJ)) { 2838 if ((trace->trace_pgfaults & TRACE_PFMAJ)) {
2713 pgfault_maj = perf_evsel__new_pgfault(PERF_COUNT_SW_PAGE_FAULTS_MAJ); 2839 pgfault_maj = perf_evsel__new_pgfault(PERF_COUNT_SW_PAGE_FAULTS_MAJ);
@@ -2802,13 +2928,18 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
2802 if (err < 0) 2928 if (err < 0)
2803 goto out_error_mem; 2929 goto out_error_mem;
2804 2930
2931 if (trace->syscalls.map)
2932 trace__init_syscalls_bpf_map(trace);
2933
2805 if (trace->ev_qualifier_ids.nr > 0) { 2934 if (trace->ev_qualifier_ids.nr > 0) {
2806 err = trace__set_ev_qualifier_filter(trace); 2935 err = trace__set_ev_qualifier_filter(trace);
2807 if (err < 0) 2936 if (err < 0)
2808 goto out_errno; 2937 goto out_errno;
2809 2938
2810 pr_debug("event qualifier tracepoint filter: %s\n", 2939 if (trace->syscalls.events.sys_exit) {
2811 trace->syscalls.events.sys_exit->filter); 2940 pr_debug("event qualifier tracepoint filter: %s\n",
2941 trace->syscalls.events.sys_exit->filter);
2942 }
2812 } 2943 }
2813 2944
2814 err = perf_evlist__apply_filters(evlist, &evsel); 2945 err = perf_evlist__apply_filters(evlist, &evsel);
@@ -2859,7 +2990,7 @@ again:
2859 while ((event = perf_mmap__read_event(md)) != NULL) { 2990 while ((event = perf_mmap__read_event(md)) != NULL) {
2860 ++trace->nr_events; 2991 ++trace->nr_events;
2861 2992
2862 err = trace__deliver_ordered_event(trace, event); 2993 err = trace__deliver_event(trace, event);
2863 if (err) 2994 if (err)
2864 goto out_disable; 2995 goto out_disable;
2865 2996
@@ -2885,7 +3016,7 @@ again:
2885 3016
2886 goto again; 3017 goto again;
2887 } else { 3018 } else {
2888 if (trace__flush_ordered_events(trace)) 3019 if (trace__flush_events(trace))
2889 goto out_disable; 3020 goto out_disable;
2890 } 3021 }
2891 } else { 3022 } else {
@@ -2897,7 +3028,8 @@ out_disable:
2897 3028
2898 perf_evlist__disable(evlist); 3029 perf_evlist__disable(evlist);
2899 3030
2900 ordered_events__flush(&trace->oe.data, OE_FLUSH__FINAL); 3031 if (trace->sort_events)
3032 ordered_events__flush(&trace->oe.data, OE_FLUSH__FINAL);
2901 3033
2902 if (!err) { 3034 if (!err) {
2903 if (trace->summary) 3035 if (trace->summary)
@@ -3426,6 +3558,49 @@ static void trace__set_bpf_map_filtered_pids(struct trace *trace)
3426 trace->filter_pids.map = bpf__find_map_by_name("pids_filtered"); 3558 trace->filter_pids.map = bpf__find_map_by_name("pids_filtered");
3427} 3559}
3428 3560
3561static void trace__set_bpf_map_syscalls(struct trace *trace)
3562{
3563 trace->syscalls.map = bpf__find_map_by_name("syscalls");
3564}
3565
3566static int trace__config(const char *var, const char *value, void *arg)
3567{
3568 struct trace *trace = arg;
3569 int err = 0;
3570
3571 if (!strcmp(var, "trace.add_events")) {
3572 struct option o = OPT_CALLBACK('e', "event", &trace->evlist, "event",
3573 "event selector. use 'perf list' to list available events",
3574 parse_events_option);
3575 err = parse_events_option(&o, value, 0);
3576 } else if (!strcmp(var, "trace.show_timestamp")) {
3577 trace->show_tstamp = perf_config_bool(var, value);
3578 } else if (!strcmp(var, "trace.show_duration")) {
3579 trace->show_duration = perf_config_bool(var, value);
3580 } else if (!strcmp(var, "trace.show_arg_names")) {
3581 trace->show_arg_names = perf_config_bool(var, value);
3582 if (!trace->show_arg_names)
3583 trace->show_zeros = true;
3584 } else if (!strcmp(var, "trace.show_zeros")) {
3585 bool new_show_zeros = perf_config_bool(var, value);
3586 if (!trace->show_arg_names && !new_show_zeros) {
3587 pr_warning("trace.show_zeros has to be set when trace.show_arg_names=no\n");
3588 goto out;
3589 }
3590 trace->show_zeros = new_show_zeros;
3591 } else if (!strcmp(var, "trace.show_prefix")) {
3592 trace->show_string_prefix = perf_config_bool(var, value);
3593 } else if (!strcmp(var, "trace.no_inherit")) {
3594 trace->opts.no_inherit = perf_config_bool(var, value);
3595 } else if (!strcmp(var, "trace.args_alignment")) {
3596 int args_alignment = 0;
3597 if (perf_config_int(&args_alignment, var, value) == 0)
3598 trace->args_alignment = args_alignment;
3599 }
3600out:
3601 return err;
3602}
3603
3429int cmd_trace(int argc, const char **argv) 3604int cmd_trace(int argc, const char **argv)
3430{ 3605{
3431 const char *trace_usage[] = { 3606 const char *trace_usage[] = {
@@ -3451,6 +3626,10 @@ int cmd_trace(int argc, const char **argv)
3451 }, 3626 },
3452 .output = stderr, 3627 .output = stderr,
3453 .show_comm = true, 3628 .show_comm = true,
3629 .show_tstamp = true,
3630 .show_duration = true,
3631 .show_arg_names = true,
3632 .args_alignment = 70,
3454 .trace_syscalls = false, 3633 .trace_syscalls = false,
3455 .kernel_syscallchains = false, 3634 .kernel_syscallchains = false,
3456 .max_stack = UINT_MAX, 3635 .max_stack = UINT_MAX,
@@ -3516,6 +3695,8 @@ int cmd_trace(int argc, const char **argv)
3516 "Set the maximum stack depth when parsing the callchain, " 3695 "Set the maximum stack depth when parsing the callchain, "
3517 "anything beyond the specified depth will be ignored. " 3696 "anything beyond the specified depth will be ignored. "
3518 "Default: kernel.perf_event_max_stack or " __stringify(PERF_MAX_STACK_DEPTH)), 3697 "Default: kernel.perf_event_max_stack or " __stringify(PERF_MAX_STACK_DEPTH)),
3698 OPT_BOOLEAN(0, "sort-events", &trace.sort_events,
3699 "Sort batch of events before processing, use if getting out of order events"),
3519 OPT_BOOLEAN(0, "print-sample", &trace.print_sample, 3700 OPT_BOOLEAN(0, "print-sample", &trace.print_sample,
3520 "print the PERF_RECORD_SAMPLE PERF_SAMPLE_ info, for debugging"), 3701 "print the PERF_RECORD_SAMPLE PERF_SAMPLE_ info, for debugging"),
3521 OPT_UINTEGER(0, "proc-map-timeout", &proc_map_timeout, 3702 OPT_UINTEGER(0, "proc-map-timeout", &proc_map_timeout,
@@ -3546,6 +3727,10 @@ int cmd_trace(int argc, const char **argv)
3546 goto out; 3727 goto out;
3547 } 3728 }
3548 3729
3730 err = perf_config(trace__config, &trace);
3731 if (err)
3732 goto out;
3733
3549 argc = parse_options_subcommand(argc, argv, trace_options, trace_subcommands, 3734 argc = parse_options_subcommand(argc, argv, trace_options, trace_subcommands,
3550 trace_usage, PARSE_OPT_STOP_AT_NON_OPTION); 3735 trace_usage, PARSE_OPT_STOP_AT_NON_OPTION);
3551 3736
@@ -3564,6 +3749,7 @@ int cmd_trace(int argc, const char **argv)
3564 if (evsel) { 3749 if (evsel) {
3565 trace.syscalls.events.augmented = evsel; 3750 trace.syscalls.events.augmented = evsel;
3566 trace__set_bpf_map_filtered_pids(&trace); 3751 trace__set_bpf_map_filtered_pids(&trace);
3752 trace__set_bpf_map_syscalls(&trace);
3567 } 3753 }
3568 3754
3569 err = bpf__setup_stdout(trace.evlist); 3755 err = bpf__setup_stdout(trace.evlist);
@@ -3609,8 +3795,10 @@ int cmd_trace(int argc, const char **argv)
3609 } 3795 }
3610 } 3796 }
3611 3797
3612 ordered_events__init(&trace.oe.data, ordered_events__deliver_event, &trace); 3798 if (trace.sort_events) {
3613 ordered_events__set_copy_on_queue(&trace.oe.data, true); 3799 ordered_events__init(&trace.oe.data, ordered_events__deliver_event, &trace);
3800 ordered_events__set_copy_on_queue(&trace.oe.data, true);
3801 }
3614 3802
3615 /* 3803 /*
3616 * If we are augmenting syscalls, then combine what we put in the 3804 * If we are augmenting syscalls, then combine what we put in the
diff --git a/tools/perf/check-headers.sh b/tools/perf/check-headers.sh
index 9531f7bd7d9b..8e811ea0cf85 100755
--- a/tools/perf/check-headers.sh
+++ b/tools/perf/check-headers.sh
@@ -4,6 +4,7 @@
4HEADERS=' 4HEADERS='
5include/uapi/drm/drm.h 5include/uapi/drm/drm.h
6include/uapi/drm/i915_drm.h 6include/uapi/drm/i915_drm.h
7include/uapi/linux/fadvise.h
7include/uapi/linux/fcntl.h 8include/uapi/linux/fcntl.h
8include/uapi/linux/fs.h 9include/uapi/linux/fs.h
9include/uapi/linux/kcmp.h 10include/uapi/linux/kcmp.h
@@ -21,6 +22,7 @@ include/uapi/linux/hw_breakpoint.h
21arch/x86/include/asm/disabled-features.h 22arch/x86/include/asm/disabled-features.h
22arch/x86/include/asm/required-features.h 23arch/x86/include/asm/required-features.h
23arch/x86/include/asm/cpufeatures.h 24arch/x86/include/asm/cpufeatures.h
25arch/x86/include/uapi/asm/prctl.h
24arch/arm/include/uapi/asm/perf_regs.h 26arch/arm/include/uapi/asm/perf_regs.h
25arch/arm64/include/uapi/asm/perf_regs.h 27arch/arm64/include/uapi/asm/perf_regs.h
26arch/powerpc/include/uapi/asm/perf_regs.h 28arch/powerpc/include/uapi/asm/perf_regs.h
diff --git a/tools/perf/examples/bpf/augmented_raw_syscalls.c b/tools/perf/examples/bpf/augmented_raw_syscalls.c
index 74ce7574073d..53c233370fae 100644
--- a/tools/perf/examples/bpf/augmented_raw_syscalls.c
+++ b/tools/perf/examples/bpf/augmented_raw_syscalls.c
@@ -14,7 +14,6 @@
14 * code that will combine entry/exit in a strace like way. 14 * code that will combine entry/exit in a strace like way.
15 */ 15 */
16 16
17#include <stdio.h>
18#include <unistd.h> 17#include <unistd.h>
19#include <pid_filter.h> 18#include <pid_filter.h>
20 19
@@ -26,6 +25,17 @@ struct bpf_map SEC("maps") __augmented_syscalls__ = {
26 .max_entries = __NR_CPUS__, 25 .max_entries = __NR_CPUS__,
27}; 26};
28 27
28struct syscall {
29 bool enabled;
30};
31
32struct bpf_map SEC("maps") syscalls = {
33 .type = BPF_MAP_TYPE_ARRAY,
34 .key_size = sizeof(int),
35 .value_size = sizeof(struct syscall),
36 .max_entries = 512,
37};
38
29struct syscall_enter_args { 39struct syscall_enter_args {
30 unsigned long long common_tp_fields; 40 unsigned long long common_tp_fields;
31 long syscall_nr; 41 long syscall_nr;
@@ -45,6 +55,7 @@ struct augmented_filename {
45}; 55};
46 56
47#define SYS_OPEN 2 57#define SYS_OPEN 2
58#define SYS_ACCESS 21
48#define SYS_OPENAT 257 59#define SYS_OPENAT 257
49 60
50pid_filter(pids_filtered); 61pid_filter(pids_filtered);
@@ -56,6 +67,7 @@ int sys_enter(struct syscall_enter_args *args)
56 struct syscall_enter_args args; 67 struct syscall_enter_args args;
57 struct augmented_filename filename; 68 struct augmented_filename filename;
58 } augmented_args; 69 } augmented_args;
70 struct syscall *syscall;
59 unsigned int len = sizeof(augmented_args); 71 unsigned int len = sizeof(augmented_args);
60 const void *filename_arg = NULL; 72 const void *filename_arg = NULL;
61 73
@@ -63,6 +75,10 @@ int sys_enter(struct syscall_enter_args *args)
63 return 0; 75 return 0;
64 76
65 probe_read(&augmented_args.args, sizeof(augmented_args.args), args); 77 probe_read(&augmented_args.args, sizeof(augmented_args.args), args);
78
79 syscall = bpf_map_lookup_elem(&syscalls, &augmented_args.args.syscall_nr);
80 if (syscall == NULL || !syscall->enabled)
81 return 0;
66 /* 82 /*
67 * Yonghong and Edward Cree sayz: 83 * Yonghong and Edward Cree sayz:
68 * 84 *
@@ -104,6 +120,7 @@ int sys_enter(struct syscall_enter_args *args)
104 * after the ctx memory access to prevent their down stream merging. 120 * after the ctx memory access to prevent their down stream merging.
105 */ 121 */
106 switch (augmented_args.args.syscall_nr) { 122 switch (augmented_args.args.syscall_nr) {
123 case SYS_ACCESS:
107 case SYS_OPEN: filename_arg = (const void *)args->args[0]; 124 case SYS_OPEN: filename_arg = (const void *)args->args[0];
108 __asm__ __volatile__("": : :"memory"); 125 __asm__ __volatile__("": : :"memory");
109 break; 126 break;
@@ -131,7 +148,19 @@ int sys_enter(struct syscall_enter_args *args)
131SEC("raw_syscalls:sys_exit") 148SEC("raw_syscalls:sys_exit")
132int sys_exit(struct syscall_exit_args *args) 149int sys_exit(struct syscall_exit_args *args)
133{ 150{
134 return !pid_filter__has(&pids_filtered, getpid()); 151 struct syscall_exit_args exit_args;
152 struct syscall *syscall;
153
154 if (pid_filter__has(&pids_filtered, getpid()))
155 return 0;
156
157 probe_read(&exit_args, sizeof(exit_args), args);
158
159 syscall = bpf_map_lookup_elem(&syscalls, &exit_args.syscall_nr);
160 if (syscall == NULL || !syscall->enabled)
161 return 0;
162
163 return 1;
135} 164}
136 165
137license(GPL); 166license(GPL);
diff --git a/tools/perf/include/bpf/bpf.h b/tools/perf/include/bpf/bpf.h
index bd5d7b4d7760..e667577207dc 100644
--- a/tools/perf/include/bpf/bpf.h
+++ b/tools/perf/include/bpf/bpf.h
@@ -55,4 +55,6 @@ int _version SEC("version") = LINUX_VERSION_CODE;
55static int (*probe_read)(void *dst, int size, const void *unsafe_addr) = (void *)BPF_FUNC_probe_read; 55static int (*probe_read)(void *dst, int size, const void *unsafe_addr) = (void *)BPF_FUNC_probe_read;
56static int (*probe_read_str)(void *dst, int size, const void *unsafe_addr) = (void *)BPF_FUNC_probe_read_str; 56static int (*probe_read_str)(void *dst, int size, const void *unsafe_addr) = (void *)BPF_FUNC_probe_read_str;
57 57
58static int (*perf_event_output)(void *, struct bpf_map *, int, void *, unsigned long) = (void *)BPF_FUNC_perf_event_output;
59
58#endif /* _PERF_BPF_H */ 60#endif /* _PERF_BPF_H */
diff --git a/tools/perf/include/bpf/stdio.h b/tools/perf/include/bpf/stdio.h
index 2899cb7bfed8..316af5b2ff35 100644
--- a/tools/perf/include/bpf/stdio.h
+++ b/tools/perf/include/bpf/stdio.h
@@ -9,9 +9,6 @@ struct bpf_map SEC("maps") __bpf_stdout__ = {
9 .max_entries = __NR_CPUS__, 9 .max_entries = __NR_CPUS__,
10}; 10};
11 11
12static int (*perf_event_output)(void *, struct bpf_map *, int, void *, unsigned long) =
13 (void *)BPF_FUNC_perf_event_output;
14
15#define puts(from) \ 12#define puts(from) \
16 ({ const int __len = sizeof(from); \ 13 ({ const int __len = sizeof(from); \
17 char __from[__len] = from; \ 14 char __from[__len] = from; \
diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index 12c09e0ece71..9852b5d624a5 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -424,6 +424,9 @@ static const char *shell_test__description(char *description, size_t size,
424 if (!fp) 424 if (!fp)
425 return NULL; 425 return NULL;
426 426
427 /* Skip shebang */
428 while (fgetc(fp) != '\n');
429
427 description = fgets(description, size, fp); 430 description = fgets(description, size, fp);
428 fclose(fp); 431 fclose(fp);
429 432
diff --git a/tools/perf/tests/shell/probe_vfs_getname.sh b/tools/perf/tests/shell/probe_vfs_getname.sh
index 9b7635184dc2..46e076e3c537 100755
--- a/tools/perf/tests/shell/probe_vfs_getname.sh
+++ b/tools/perf/tests/shell/probe_vfs_getname.sh
@@ -1,3 +1,4 @@
1#!/bin/sh
1# Add vfs_getname probe to get syscall args filenames 2# Add vfs_getname probe to get syscall args filenames
2# 3#
3# Arnaldo Carvalho de Melo <acme@kernel.org>, 2017 4# Arnaldo Carvalho de Melo <acme@kernel.org>, 2017
diff --git a/tools/perf/tests/shell/record+probe_libc_inet_pton.sh b/tools/perf/tests/shell/record+probe_libc_inet_pton.sh
index cab7b0aea6ea..61c9f8fc6fa1 100755
--- a/tools/perf/tests/shell/record+probe_libc_inet_pton.sh
+++ b/tools/perf/tests/shell/record+probe_libc_inet_pton.sh
@@ -1,3 +1,4 @@
1#!/bin/sh
1# probe libc's inet_pton & backtrace it with ping 2# probe libc's inet_pton & backtrace it with ping
2 3
3# Installs a probe on libc's inet_pton function, that will use uprobes, 4# Installs a probe on libc's inet_pton function, that will use uprobes,
diff --git a/tools/perf/tests/shell/record+script_probe_vfs_getname.sh b/tools/perf/tests/shell/record+script_probe_vfs_getname.sh
index ba29535b8580..9b073e7fa88c 100755
--- a/tools/perf/tests/shell/record+script_probe_vfs_getname.sh
+++ b/tools/perf/tests/shell/record+script_probe_vfs_getname.sh
@@ -1,3 +1,4 @@
1#!/bin/sh
1# Use vfs_getname probe to get syscall args filenames 2# Use vfs_getname probe to get syscall args filenames
2 3
3# Uses the 'perf test shell' library to add probe:vfs_getname to the system 4# Uses the 'perf test shell' library to add probe:vfs_getname to the system
diff --git a/tools/perf/tests/shell/trace+probe_vfs_getname.sh b/tools/perf/tests/shell/trace+probe_vfs_getname.sh
index 4ce276efe6b4..50109f27ca07 100755
--- a/tools/perf/tests/shell/trace+probe_vfs_getname.sh
+++ b/tools/perf/tests/shell/trace+probe_vfs_getname.sh
@@ -1,3 +1,4 @@
1#!/bin/sh
1# Check open filename arg using perf trace + vfs_getname 2# Check open filename arg using perf trace + vfs_getname
2 3
3# Uses the 'perf test shell' library to add probe:vfs_getname to the system 4# Uses the 'perf test shell' library to add probe:vfs_getname to the system
diff --git a/tools/perf/trace/beauty/Build b/tools/perf/trace/beauty/Build
index 304313073242..637365099b7d 100644
--- a/tools/perf/trace/beauty/Build
+++ b/tools/perf/trace/beauty/Build
@@ -7,7 +7,9 @@ endif
7libperf-y += kcmp.o 7libperf-y += kcmp.o
8libperf-y += mount_flags.o 8libperf-y += mount_flags.o
9libperf-y += pkey_alloc.o 9libperf-y += pkey_alloc.o
10libperf-y += arch_prctl.o
10libperf-y += prctl.o 11libperf-y += prctl.o
12libperf-y += renameat.o
11libperf-y += sockaddr.o 13libperf-y += sockaddr.o
12libperf-y += socket.o 14libperf-y += socket.o
13libperf-y += statx.o 15libperf-y += statx.o
diff --git a/tools/perf/trace/beauty/arch_prctl.c b/tools/perf/trace/beauty/arch_prctl.c
new file mode 100644
index 000000000000..fe022ca67e60
--- /dev/null
+++ b/tools/perf/trace/beauty/arch_prctl.c
@@ -0,0 +1,33 @@
1// SPDX-License-Identifier: LGPL-2.1
2/*
3 * trace/beauty/arch_prctl.c
4 *
5 * Copyright (C) 2018, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
6 */
7
8#include "trace/beauty/beauty.h"
9#include <linux/kernel.h>
10
11#include "trace/beauty/generated/x86_arch_prctl_code_array.c"
12
13static DEFINE_STRARRAY_OFFSET(x86_arch_prctl_codes_1, "ARCH_", x86_arch_prctl_codes_1_offset);
14static DEFINE_STRARRAY_OFFSET(x86_arch_prctl_codes_2, "ARCH_", x86_arch_prctl_codes_2_offset);
15
16static struct strarray *x86_arch_prctl_codes[] = {
17 &strarray__x86_arch_prctl_codes_1,
18 &strarray__x86_arch_prctl_codes_2,
19};
20
21static DEFINE_STRARRAYS(x86_arch_prctl_codes);
22
23static size_t x86_arch_prctl__scnprintf_code(int option, char *bf, size_t size, bool show_prefix)
24{
25 return strarrays__scnprintf(&strarrays__x86_arch_prctl_codes, bf, size, "%#x", show_prefix, option);
26}
27
28size_t syscall_arg__scnprintf_x86_arch_prctl_code(char *bf, size_t size, struct syscall_arg *arg)
29{
30 unsigned long code = arg->val;
31
32 return x86_arch_prctl__scnprintf_code(code, bf, size, arg->show_string_prefix);
33}
diff --git a/tools/perf/trace/beauty/beauty.h b/tools/perf/trace/beauty/beauty.h
index 039c29039b2c..83c5b202e00e 100644
--- a/tools/perf/trace/beauty/beauty.h
+++ b/tools/perf/trace/beauty/beauty.h
@@ -9,26 +9,41 @@
9struct strarray { 9struct strarray {
10 int offset; 10 int offset;
11 int nr_entries; 11 int nr_entries;
12 const char *prefix;
12 const char **entries; 13 const char **entries;
13}; 14};
14 15
15#define DEFINE_STRARRAY(array) struct strarray strarray__##array = { \ 16#define DEFINE_STRARRAY(array, _prefix) struct strarray strarray__##array = { \
16 .nr_entries = ARRAY_SIZE(array), \ 17 .nr_entries = ARRAY_SIZE(array), \
17 .entries = array, \ 18 .entries = array, \
19 .prefix = _prefix, \
18} 20}
19 21
20#define DEFINE_STRARRAY_OFFSET(array, off) struct strarray strarray__##array = { \ 22#define DEFINE_STRARRAY_OFFSET(array, _prefix, off) struct strarray strarray__##array = { \
21 .offset = off, \ 23 .offset = off, \
22 .nr_entries = ARRAY_SIZE(array), \ 24 .nr_entries = ARRAY_SIZE(array), \
23 .entries = array, \ 25 .entries = array, \
26 .prefix = _prefix, \
24} 27}
25 28
26size_t strarray__scnprintf(struct strarray *sa, char *bf, size_t size, const char *intfmt, int val); 29size_t strarray__scnprintf(struct strarray *sa, char *bf, size_t size, const char *intfmt, bool show_prefix, int val);
27size_t strarray__scnprintf_flags(struct strarray *sa, char *bf, size_t size, unsigned long flags); 30size_t strarray__scnprintf_flags(struct strarray *sa, char *bf, size_t size, bool show_prefix, unsigned long flags);
28 31
29struct trace; 32struct trace;
30struct thread; 33struct thread;
31 34
35struct strarrays {
36 int nr_entries;
37 struct strarray **entries;
38};
39
40#define DEFINE_STRARRAYS(array) struct strarrays strarrays__##array = { \
41 .nr_entries = ARRAY_SIZE(array), \
42 .entries = array, \
43}
44
45size_t strarrays__scnprintf(struct strarrays *sas, char *bf, size_t size, const char *intfmt, bool show_prefix, int val);
46
32size_t pid__scnprintf_fd(struct trace *trace, pid_t pid, int fd, char *bf, size_t size); 47size_t pid__scnprintf_fd(struct trace *trace, pid_t pid, int fd, char *bf, size_t size);
33 48
34extern struct strarray strarray__socket_families; 49extern struct strarray strarray__socket_families;
@@ -66,6 +81,7 @@ struct augmented_arg {
66 * @parm: private area, may be an strarray, for instance 81 * @parm: private area, may be an strarray, for instance
67 * @idx: syscall arg idx (is this the first?) 82 * @idx: syscall arg idx (is this the first?)
68 * @mask: a syscall arg may mask another arg, see syscall_arg__scnprintf_futex_op 83 * @mask: a syscall arg may mask another arg, see syscall_arg__scnprintf_futex_op
84 * @show_string_prefix: When there is a common prefix in a string table, show it or not
69 */ 85 */
70 86
71struct syscall_arg { 87struct syscall_arg {
@@ -80,6 +96,7 @@ struct syscall_arg {
80 void *parm; 96 void *parm;
81 u8 idx; 97 u8 idx;
82 u8 mask; 98 u8 mask;
99 bool show_string_prefix;
83}; 100};
84 101
85unsigned long syscall_arg__val(struct syscall_arg *arg, u8 idx); 102unsigned long syscall_arg__val(struct syscall_arg *arg, u8 idx);
@@ -93,6 +110,9 @@ size_t syscall_arg__scnprintf_fd(char *bf, size_t size, struct syscall_arg *arg)
93size_t syscall_arg__scnprintf_hex(char *bf, size_t size, struct syscall_arg *arg); 110size_t syscall_arg__scnprintf_hex(char *bf, size_t size, struct syscall_arg *arg);
94#define SCA_HEX syscall_arg__scnprintf_hex 111#define SCA_HEX syscall_arg__scnprintf_hex
95 112
113size_t syscall_arg__scnprintf_ptr(char *bf, size_t size, struct syscall_arg *arg);
114#define SCA_PTR syscall_arg__scnprintf_ptr
115
96size_t syscall_arg__scnprintf_int(char *bf, size_t size, struct syscall_arg *arg); 116size_t syscall_arg__scnprintf_int(char *bf, size_t size, struct syscall_arg *arg);
97#define SCA_INT syscall_arg__scnprintf_int 117#define SCA_INT syscall_arg__scnprintf_int
98 118
@@ -135,6 +155,9 @@ size_t syscall_arg__scnprintf_pkey_alloc_access_rights(char *bf, size_t size, st
135size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg); 155size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg);
136#define SCA_OPEN_FLAGS syscall_arg__scnprintf_open_flags 156#define SCA_OPEN_FLAGS syscall_arg__scnprintf_open_flags
137 157
158size_t syscall_arg__scnprintf_x86_arch_prctl_code(char *bf, size_t size, struct syscall_arg *arg);
159#define SCA_X86_ARCH_PRCTL_CODE syscall_arg__scnprintf_x86_arch_prctl_code
160
138size_t syscall_arg__scnprintf_prctl_option(char *bf, size_t size, struct syscall_arg *arg); 161size_t syscall_arg__scnprintf_prctl_option(char *bf, size_t size, struct syscall_arg *arg);
139#define SCA_PRCTL_OPTION syscall_arg__scnprintf_prctl_option 162#define SCA_PRCTL_OPTION syscall_arg__scnprintf_prctl_option
140 163
@@ -144,6 +167,9 @@ size_t syscall_arg__scnprintf_prctl_arg2(char *bf, size_t size, struct syscall_a
144size_t syscall_arg__scnprintf_prctl_arg3(char *bf, size_t size, struct syscall_arg *arg); 167size_t syscall_arg__scnprintf_prctl_arg3(char *bf, size_t size, struct syscall_arg *arg);
145#define SCA_PRCTL_ARG3 syscall_arg__scnprintf_prctl_arg3 168#define SCA_PRCTL_ARG3 syscall_arg__scnprintf_prctl_arg3
146 169
170size_t syscall_arg__scnprintf_renameat2_flags(char *bf, size_t size, struct syscall_arg *arg);
171#define SCA_RENAMEAT2_FLAGS syscall_arg__scnprintf_renameat2_flags
172
147size_t syscall_arg__scnprintf_sockaddr(char *bf, size_t size, struct syscall_arg *arg); 173size_t syscall_arg__scnprintf_sockaddr(char *bf, size_t size, struct syscall_arg *arg);
148#define SCA_SOCKADDR syscall_arg__scnprintf_sockaddr 174#define SCA_SOCKADDR syscall_arg__scnprintf_sockaddr
149 175
@@ -156,7 +182,7 @@ size_t syscall_arg__scnprintf_statx_flags(char *bf, size_t size, struct syscall_
156size_t syscall_arg__scnprintf_statx_mask(char *bf, size_t size, struct syscall_arg *arg); 182size_t syscall_arg__scnprintf_statx_mask(char *bf, size_t size, struct syscall_arg *arg);
157#define SCA_STATX_MASK syscall_arg__scnprintf_statx_mask 183#define SCA_STATX_MASK syscall_arg__scnprintf_statx_mask
158 184
159size_t open__scnprintf_flags(unsigned long flags, char *bf, size_t size); 185size_t open__scnprintf_flags(unsigned long flags, char *bf, size_t size, bool show_prefix);
160 186
161void syscall_arg__set_ret_scnprintf(struct syscall_arg *arg, 187void syscall_arg__set_ret_scnprintf(struct syscall_arg *arg,
162 size_t (*ret_scnprintf)(char *bf, size_t size, struct syscall_arg *arg)); 188 size_t (*ret_scnprintf)(char *bf, size_t size, struct syscall_arg *arg));
diff --git a/tools/perf/trace/beauty/clone.c b/tools/perf/trace/beauty/clone.c
index 010406500c30..6eb9a6636171 100644
--- a/tools/perf/trace/beauty/clone.c
+++ b/tools/perf/trace/beauty/clone.c
@@ -10,13 +10,14 @@
10#include <sys/types.h> 10#include <sys/types.h>
11#include <uapi/linux/sched.h> 11#include <uapi/linux/sched.h>
12 12
13static size_t clone__scnprintf_flags(unsigned long flags, char *bf, size_t size) 13static size_t clone__scnprintf_flags(unsigned long flags, char *bf, size_t size, bool show_prefix)
14{ 14{
15 const char *prefix = "CLONE_";
15 int printed = 0; 16 int printed = 0;
16 17
17#define P_FLAG(n) \ 18#define P_FLAG(n) \
18 if (flags & CLONE_##n) { \ 19 if (flags & CLONE_##n) { \
19 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \ 20 printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
20 flags &= ~CLONE_##n; \ 21 flags &= ~CLONE_##n; \
21 } 22 }
22 23
@@ -70,5 +71,5 @@ size_t syscall_arg__scnprintf_clone_flags(char *bf, size_t size, struct syscall_
70 if (!(flags & CLONE_SETTLS)) 71 if (!(flags & CLONE_SETTLS))
71 arg->mask |= SCC_TLS; 72 arg->mask |= SCC_TLS;
72 73
73 return clone__scnprintf_flags(flags, bf, size); 74 return clone__scnprintf_flags(flags, bf, size, arg->show_string_prefix);
74} 75}
diff --git a/tools/perf/trace/beauty/eventfd.c b/tools/perf/trace/beauty/eventfd.c
index db5b9b492113..4bab106213c6 100644
--- a/tools/perf/trace/beauty/eventfd.c
+++ b/tools/perf/trace/beauty/eventfd.c
@@ -13,13 +13,15 @@
13 13
14static size_t syscall_arg__scnprintf_eventfd_flags(char *bf, size_t size, struct syscall_arg *arg) 14static size_t syscall_arg__scnprintf_eventfd_flags(char *bf, size_t size, struct syscall_arg *arg)
15{ 15{
16 bool show_prefix = arg->show_string_prefix;
17 const char *prefix = "EFD_";
16 int printed = 0, flags = arg->val; 18 int printed = 0, flags = arg->val;
17 19
18 if (flags == 0) 20 if (flags == 0)
19 return scnprintf(bf, size, "NONE"); 21 return scnprintf(bf, size, "NONE");
20#define P_FLAG(n) \ 22#define P_FLAG(n) \
21 if (flags & EFD_##n) { \ 23 if (flags & EFD_##n) { \
22 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \ 24 printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
23 flags &= ~EFD_##n; \ 25 flags &= ~EFD_##n; \
24 } 26 }
25 27
diff --git a/tools/perf/trace/beauty/fadvise.sh b/tools/perf/trace/beauty/fadvise.sh
new file mode 100755
index 000000000000..b15ae3875167
--- /dev/null
+++ b/tools/perf/trace/beauty/fadvise.sh
@@ -0,0 +1,22 @@
1#!/bin/sh
2# SPDX-License-Identifier: LGPL-2.1
3
4[ $# -eq 1 ] && header_dir=$1 || header_dir=tools/include/uapi/linux/
5
6printf "static const char *fadvise_advices[] = {\n"
7regex='^[[:space:]]*#[[:space:]]*define[[:space:]]+POSIX_FADV_(\w+)[[:space:]]+([[:digit:]]+)[[:space:]]+.*'
8
9egrep $regex ${header_dir}/fadvise.h | \
10 sed -r "s/$regex/\2 \1/g" | \
11 sort | xargs printf "\t[%s] = \"%s\",\n" | \
12 grep -v "[6].*DONTNEED" | grep -v "[7].*NOREUSE"
13printf "};\n"
14
15# XXX Fix this properly:
16
17# The grep 6/7 DONTNEED/NOREUSE are a hack to filter out the s/390 oddity See
18# tools/include/uapi/linux/fadvise.h for details.
19
20# Probably fix this when generating the string tables per arch so that We can
21# reliably process on arch FOO a perf.data file collected by 'perf trace
22# record' on arch BAR, e.g. collect on s/390 and process on x86.
diff --git a/tools/perf/trace/beauty/fcntl.c b/tools/perf/trace/beauty/fcntl.c
index e6de31674e24..56ef83b3d130 100644
--- a/tools/perf/trace/beauty/fcntl.c
+++ b/tools/perf/trace/beauty/fcntl.c
@@ -9,27 +9,28 @@
9#include <linux/kernel.h> 9#include <linux/kernel.h>
10#include <uapi/linux/fcntl.h> 10#include <uapi/linux/fcntl.h>
11 11
12static size_t fcntl__scnprintf_getfd(unsigned long val, char *bf, size_t size) 12static size_t fcntl__scnprintf_getfd(unsigned long val, char *bf, size_t size, bool show_prefix)
13{ 13{
14 return scnprintf(bf, size, "%s", val ? "CLOEXEC" : "0"); 14 return val ? scnprintf(bf, size, "%s", "0") :
15 scnprintf(bf, size, "%s%s", show_prefix ? "FD_" : "", "CLOEXEC");
15} 16}
16 17
17static size_t syscall_arg__scnprintf_fcntl_getfd(char *bf, size_t size, struct syscall_arg *arg) 18static size_t syscall_arg__scnprintf_fcntl_getfd(char *bf, size_t size, struct syscall_arg *arg)
18{ 19{
19 return fcntl__scnprintf_getfd(arg->val, bf, size); 20 return fcntl__scnprintf_getfd(arg->val, bf, size, arg->show_string_prefix);
20} 21}
21 22
22static size_t fcntl__scnprintf_getlease(unsigned long val, char *bf, size_t size) 23static size_t fcntl__scnprintf_getlease(unsigned long val, char *bf, size_t size, bool show_prefix)
23{ 24{
24 static const char *fcntl_setlease[] = { "RDLCK", "WRLCK", "UNLCK", }; 25 static const char *fcntl_setlease[] = { "RDLCK", "WRLCK", "UNLCK", };
25 static DEFINE_STRARRAY(fcntl_setlease); 26 static DEFINE_STRARRAY(fcntl_setlease, "F_");
26 27
27 return strarray__scnprintf(&strarray__fcntl_setlease, bf, size, "%x", val); 28 return strarray__scnprintf(&strarray__fcntl_setlease, bf, size, "%x", show_prefix, val);
28} 29}
29 30
30static size_t syscall_arg__scnprintf_fcntl_getlease(char *bf, size_t size, struct syscall_arg *arg) 31static size_t syscall_arg__scnprintf_fcntl_getlease(char *bf, size_t size, struct syscall_arg *arg)
31{ 32{
32 return fcntl__scnprintf_getlease(arg->val, bf, size); 33 return fcntl__scnprintf_getlease(arg->val, bf, size, arg->show_string_prefix);
33} 34}
34 35
35size_t syscall_arg__scnprintf_fcntl_cmd(char *bf, size_t size, struct syscall_arg *arg) 36size_t syscall_arg__scnprintf_fcntl_cmd(char *bf, size_t size, struct syscall_arg *arg)
@@ -68,22 +69,23 @@ out:
68 69
69size_t syscall_arg__scnprintf_fcntl_arg(char *bf, size_t size, struct syscall_arg *arg) 70size_t syscall_arg__scnprintf_fcntl_arg(char *bf, size_t size, struct syscall_arg *arg)
70{ 71{
72 bool show_prefix = arg->show_string_prefix;
71 int cmd = syscall_arg__val(arg, 1); 73 int cmd = syscall_arg__val(arg, 1);
72 74
73 if (cmd == F_DUPFD) 75 if (cmd == F_DUPFD)
74 return syscall_arg__scnprintf_fd(bf, size, arg); 76 return syscall_arg__scnprintf_fd(bf, size, arg);
75 77
76 if (cmd == F_SETFD) 78 if (cmd == F_SETFD)
77 return fcntl__scnprintf_getfd(arg->val, bf, size); 79 return fcntl__scnprintf_getfd(arg->val, bf, size, show_prefix);
78 80
79 if (cmd == F_SETFL) 81 if (cmd == F_SETFL)
80 return open__scnprintf_flags(arg->val, bf, size); 82 return open__scnprintf_flags(arg->val, bf, size, show_prefix);
81 83
82 if (cmd == F_SETOWN) 84 if (cmd == F_SETOWN)
83 return syscall_arg__scnprintf_pid(bf, size, arg); 85 return syscall_arg__scnprintf_pid(bf, size, arg);
84 86
85 if (cmd == F_SETLEASE) 87 if (cmd == F_SETLEASE)
86 return fcntl__scnprintf_getlease(arg->val, bf, size); 88 return fcntl__scnprintf_getlease(arg->val, bf, size, show_prefix);
87 /* 89 /*
88 * We still don't grab the contents of pointers on entry or exit, 90 * We still don't grab the contents of pointers on entry or exit,
89 * so just print them as hex numbers 91 * so just print them as hex numbers
diff --git a/tools/perf/trace/beauty/flock.c b/tools/perf/trace/beauty/flock.c
index cf02ae5f0ba6..c14274edd6d9 100644
--- a/tools/perf/trace/beauty/flock.c
+++ b/tools/perf/trace/beauty/flock.c
@@ -22,13 +22,15 @@
22 22
23size_t syscall_arg__scnprintf_flock(char *bf, size_t size, struct syscall_arg *arg) 23size_t syscall_arg__scnprintf_flock(char *bf, size_t size, struct syscall_arg *arg)
24{ 24{
25 bool show_prefix = arg->show_string_prefix;
26 const char *prefix = "LOCK_";
25 int printed = 0, op = arg->val; 27 int printed = 0, op = arg->val;
26 28
27 if (op == 0) 29 if (op == 0)
28 return scnprintf(bf, size, "NONE"); 30 return scnprintf(bf, size, "NONE");
29#define P_CMD(cmd) \ 31#define P_CMD(cmd) \
30 if ((op & LOCK_##cmd) == LOCK_##cmd) { \ 32 if ((op & LOCK_##cmd) == LOCK_##cmd) { \
31 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #cmd); \ 33 printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #cmd); \
32 op &= ~LOCK_##cmd; \ 34 op &= ~LOCK_##cmd; \
33 } 35 }
34 36
diff --git a/tools/perf/trace/beauty/futex_op.c b/tools/perf/trace/beauty/futex_op.c
index 1136bde56406..00365156782b 100644
--- a/tools/perf/trace/beauty/futex_op.c
+++ b/tools/perf/trace/beauty/futex_op.c
@@ -19,6 +19,8 @@
19 19
20static size_t syscall_arg__scnprintf_futex_op(char *bf, size_t size, struct syscall_arg *arg) 20static size_t syscall_arg__scnprintf_futex_op(char *bf, size_t size, struct syscall_arg *arg)
21{ 21{
22 bool show_prefix = arg->show_string_prefix;
23 const char *prefix = "FUTEX_";
22 enum syscall_futex_args { 24 enum syscall_futex_args {
23 SCF_UADDR = (1 << 0), 25 SCF_UADDR = (1 << 0),
24 SCF_OP = (1 << 1), 26 SCF_OP = (1 << 1),
@@ -32,7 +34,7 @@ static size_t syscall_arg__scnprintf_futex_op(char *bf, size_t size, struct sysc
32 size_t printed = 0; 34 size_t printed = 0;
33 35
34 switch (cmd) { 36 switch (cmd) {
35#define P_FUTEX_OP(n) case FUTEX_##n: printed = scnprintf(bf, size, #n); 37#define P_FUTEX_OP(n) case FUTEX_##n: printed = scnprintf(bf, size, "%s%s", show_prefix ? prefix : "", #n);
36 P_FUTEX_OP(WAIT); arg->mask |= SCF_VAL3|SCF_UADDR2; break; 38 P_FUTEX_OP(WAIT); arg->mask |= SCF_VAL3|SCF_UADDR2; break;
37 P_FUTEX_OP(WAKE); arg->mask |= SCF_VAL3|SCF_UADDR2|SCF_TIMEOUT; break; 39 P_FUTEX_OP(WAKE); arg->mask |= SCF_VAL3|SCF_UADDR2|SCF_TIMEOUT; break;
38 P_FUTEX_OP(FD); arg->mask |= SCF_VAL3|SCF_UADDR2|SCF_TIMEOUT; break; 40 P_FUTEX_OP(FD); arg->mask |= SCF_VAL3|SCF_UADDR2|SCF_TIMEOUT; break;
@@ -50,10 +52,10 @@ static size_t syscall_arg__scnprintf_futex_op(char *bf, size_t size, struct sysc
50 } 52 }
51 53
52 if (op & FUTEX_PRIVATE_FLAG) 54 if (op & FUTEX_PRIVATE_FLAG)
53 printed += scnprintf(bf + printed, size - printed, "|PRIV"); 55 printed += scnprintf(bf + printed, size - printed, "|%s%s", show_prefix ? prefix : "", "PRIVATE_FLAG");
54 56
55 if (op & FUTEX_CLOCK_REALTIME) 57 if (op & FUTEX_CLOCK_REALTIME)
56 printed += scnprintf(bf + printed, size - printed, "|CLKRT"); 58 printed += scnprintf(bf + printed, size - printed, "|%s%s", show_prefix ? prefix : "", "CLOCK_REALTIME");
57 59
58 return printed; 60 return printed;
59} 61}
diff --git a/tools/perf/trace/beauty/futex_val3.c b/tools/perf/trace/beauty/futex_val3.c
index 138b7d588a70..9114f7620571 100644
--- a/tools/perf/trace/beauty/futex_val3.c
+++ b/tools/perf/trace/beauty/futex_val3.c
@@ -7,10 +7,11 @@
7 7
8static size_t syscall_arg__scnprintf_futex_val3(char *bf, size_t size, struct syscall_arg *arg) 8static size_t syscall_arg__scnprintf_futex_val3(char *bf, size_t size, struct syscall_arg *arg)
9{ 9{
10 const char *prefix = "FUTEX_BITSET_";
10 unsigned int bitset = arg->val; 11 unsigned int bitset = arg->val;
11 12
12 if (bitset == FUTEX_BITSET_MATCH_ANY) 13 if (bitset == FUTEX_BITSET_MATCH_ANY)
13 return scnprintf(bf, size, "MATCH_ANY"); 14 return scnprintf(bf, size, "%s%s", arg->show_string_prefix ? prefix : "", "MATCH_ANY");
14 15
15 return scnprintf(bf, size, "%#xd", bitset); 16 return scnprintf(bf, size, "%#xd", bitset);
16} 17}
diff --git a/tools/perf/trace/beauty/ioctl.c b/tools/perf/trace/beauty/ioctl.c
index eae59ad15ce3..9efeb6a936c2 100644
--- a/tools/perf/trace/beauty/ioctl.c
+++ b/tools/perf/trace/beauty/ioctl.c
@@ -36,7 +36,7 @@ static size_t ioctl__scnprintf_tty_cmd(int nr, int dir, char *bf, size_t size)
36 "TIOCSERGWILD", "TIOCSERSWILD", "TIOCGLCKTRMIOS", "TIOCSLCKTRMIOS", 36 "TIOCSERGWILD", "TIOCSERSWILD", "TIOCGLCKTRMIOS", "TIOCSLCKTRMIOS",
37 "TIOCSERGSTRUCT", "TIOCSERGETLSR", "TIOCSERGETMULTI", "TIOCSERSETMULTI", 37 "TIOCSERGSTRUCT", "TIOCSERGETLSR", "TIOCSERGETMULTI", "TIOCSERSETMULTI",
38 "TIOCMIWAIT", "TIOCGICOUNT", }; 38 "TIOCMIWAIT", "TIOCGICOUNT", };
39 static DEFINE_STRARRAY(ioctl_tty_cmd); 39 static DEFINE_STRARRAY(ioctl_tty_cmd, "");
40 40
41 if (nr < strarray__ioctl_tty_cmd.nr_entries && strarray__ioctl_tty_cmd.entries[nr] != NULL) 41 if (nr < strarray__ioctl_tty_cmd.nr_entries && strarray__ioctl_tty_cmd.entries[nr] != NULL)
42 return scnprintf(bf, size, "%s", strarray__ioctl_tty_cmd.entries[nr]); 42 return scnprintf(bf, size, "%s", strarray__ioctl_tty_cmd.entries[nr]);
@@ -47,7 +47,7 @@ static size_t ioctl__scnprintf_tty_cmd(int nr, int dir, char *bf, size_t size)
47static size_t ioctl__scnprintf_drm_cmd(int nr, int dir, char *bf, size_t size) 47static size_t ioctl__scnprintf_drm_cmd(int nr, int dir, char *bf, size_t size)
48{ 48{
49#include "trace/beauty/generated/ioctl/drm_ioctl_array.c" 49#include "trace/beauty/generated/ioctl/drm_ioctl_array.c"
50 static DEFINE_STRARRAY(drm_ioctl_cmds); 50 static DEFINE_STRARRAY(drm_ioctl_cmds, "");
51 51
52 if (nr < strarray__drm_ioctl_cmds.nr_entries && strarray__drm_ioctl_cmds.entries[nr] != NULL) 52 if (nr < strarray__drm_ioctl_cmds.nr_entries && strarray__drm_ioctl_cmds.entries[nr] != NULL)
53 return scnprintf(bf, size, "DRM_%s", strarray__drm_ioctl_cmds.entries[nr]); 53 return scnprintf(bf, size, "DRM_%s", strarray__drm_ioctl_cmds.entries[nr]);
@@ -58,7 +58,7 @@ static size_t ioctl__scnprintf_drm_cmd(int nr, int dir, char *bf, size_t size)
58static size_t ioctl__scnprintf_sndrv_pcm_cmd(int nr, int dir, char *bf, size_t size) 58static size_t ioctl__scnprintf_sndrv_pcm_cmd(int nr, int dir, char *bf, size_t size)
59{ 59{
60#include "trace/beauty/generated/ioctl/sndrv_pcm_ioctl_array.c" 60#include "trace/beauty/generated/ioctl/sndrv_pcm_ioctl_array.c"
61 static DEFINE_STRARRAY(sndrv_pcm_ioctl_cmds); 61 static DEFINE_STRARRAY(sndrv_pcm_ioctl_cmds, "");
62 62
63 if (nr < strarray__sndrv_pcm_ioctl_cmds.nr_entries && strarray__sndrv_pcm_ioctl_cmds.entries[nr] != NULL) 63 if (nr < strarray__sndrv_pcm_ioctl_cmds.nr_entries && strarray__sndrv_pcm_ioctl_cmds.entries[nr] != NULL)
64 return scnprintf(bf, size, "SNDRV_PCM_%s", strarray__sndrv_pcm_ioctl_cmds.entries[nr]); 64 return scnprintf(bf, size, "SNDRV_PCM_%s", strarray__sndrv_pcm_ioctl_cmds.entries[nr]);
@@ -69,7 +69,7 @@ static size_t ioctl__scnprintf_sndrv_pcm_cmd(int nr, int dir, char *bf, size_t s
69static size_t ioctl__scnprintf_sndrv_ctl_cmd(int nr, int dir, char *bf, size_t size) 69static size_t ioctl__scnprintf_sndrv_ctl_cmd(int nr, int dir, char *bf, size_t size)
70{ 70{
71#include "trace/beauty/generated/ioctl/sndrv_ctl_ioctl_array.c" 71#include "trace/beauty/generated/ioctl/sndrv_ctl_ioctl_array.c"
72 static DEFINE_STRARRAY(sndrv_ctl_ioctl_cmds); 72 static DEFINE_STRARRAY(sndrv_ctl_ioctl_cmds, "");
73 73
74 if (nr < strarray__sndrv_ctl_ioctl_cmds.nr_entries && strarray__sndrv_ctl_ioctl_cmds.entries[nr] != NULL) 74 if (nr < strarray__sndrv_ctl_ioctl_cmds.nr_entries && strarray__sndrv_ctl_ioctl_cmds.entries[nr] != NULL)
75 return scnprintf(bf, size, "SNDRV_CTL_%s", strarray__sndrv_ctl_ioctl_cmds.entries[nr]); 75 return scnprintf(bf, size, "SNDRV_CTL_%s", strarray__sndrv_ctl_ioctl_cmds.entries[nr]);
@@ -80,7 +80,7 @@ static size_t ioctl__scnprintf_sndrv_ctl_cmd(int nr, int dir, char *bf, size_t s
80static size_t ioctl__scnprintf_kvm_cmd(int nr, int dir, char *bf, size_t size) 80static size_t ioctl__scnprintf_kvm_cmd(int nr, int dir, char *bf, size_t size)
81{ 81{
82#include "trace/beauty/generated/ioctl/kvm_ioctl_array.c" 82#include "trace/beauty/generated/ioctl/kvm_ioctl_array.c"
83 static DEFINE_STRARRAY(kvm_ioctl_cmds); 83 static DEFINE_STRARRAY(kvm_ioctl_cmds, "");
84 84
85 if (nr < strarray__kvm_ioctl_cmds.nr_entries && strarray__kvm_ioctl_cmds.entries[nr] != NULL) 85 if (nr < strarray__kvm_ioctl_cmds.nr_entries && strarray__kvm_ioctl_cmds.entries[nr] != NULL)
86 return scnprintf(bf, size, "KVM_%s", strarray__kvm_ioctl_cmds.entries[nr]); 86 return scnprintf(bf, size, "KVM_%s", strarray__kvm_ioctl_cmds.entries[nr]);
@@ -91,8 +91,8 @@ static size_t ioctl__scnprintf_kvm_cmd(int nr, int dir, char *bf, size_t size)
91static size_t ioctl__scnprintf_vhost_virtio_cmd(int nr, int dir, char *bf, size_t size) 91static size_t ioctl__scnprintf_vhost_virtio_cmd(int nr, int dir, char *bf, size_t size)
92{ 92{
93#include "trace/beauty/generated/ioctl/vhost_virtio_ioctl_array.c" 93#include "trace/beauty/generated/ioctl/vhost_virtio_ioctl_array.c"
94 static DEFINE_STRARRAY(vhost_virtio_ioctl_cmds); 94 static DEFINE_STRARRAY(vhost_virtio_ioctl_cmds, "");
95 static DEFINE_STRARRAY(vhost_virtio_ioctl_read_cmds); 95 static DEFINE_STRARRAY(vhost_virtio_ioctl_read_cmds, "");
96 struct strarray *s = (dir & _IOC_READ) ? &strarray__vhost_virtio_ioctl_read_cmds : &strarray__vhost_virtio_ioctl_cmds; 96 struct strarray *s = (dir & _IOC_READ) ? &strarray__vhost_virtio_ioctl_read_cmds : &strarray__vhost_virtio_ioctl_cmds;
97 97
98 if (nr < s->nr_entries && s->entries[nr] != NULL) 98 if (nr < s->nr_entries && s->entries[nr] != NULL)
@@ -104,7 +104,7 @@ static size_t ioctl__scnprintf_vhost_virtio_cmd(int nr, int dir, char *bf, size_
104static size_t ioctl__scnprintf_perf_cmd(int nr, int dir, char *bf, size_t size) 104static size_t ioctl__scnprintf_perf_cmd(int nr, int dir, char *bf, size_t size)
105{ 105{
106#include "trace/beauty/generated/ioctl/perf_ioctl_array.c" 106#include "trace/beauty/generated/ioctl/perf_ioctl_array.c"
107 static DEFINE_STRARRAY(perf_ioctl_cmds); 107 static DEFINE_STRARRAY(perf_ioctl_cmds, "");
108 108
109 if (nr < strarray__perf_ioctl_cmds.nr_entries && strarray__perf_ioctl_cmds.entries[nr] != NULL) 109 if (nr < strarray__perf_ioctl_cmds.nr_entries && strarray__perf_ioctl_cmds.entries[nr] != NULL)
110 return scnprintf(bf, size, "PERF_%s", strarray__perf_ioctl_cmds.entries[nr]); 110 return scnprintf(bf, size, "PERF_%s", strarray__perf_ioctl_cmds.entries[nr]);
@@ -112,8 +112,9 @@ static size_t ioctl__scnprintf_perf_cmd(int nr, int dir, char *bf, size_t size)
112 return scnprintf(bf, size, "(%#x, %#x, %#x)", 0xAE, nr, dir); 112 return scnprintf(bf, size, "(%#x, %#x, %#x)", 0xAE, nr, dir);
113} 113}
114 114
115static size_t ioctl__scnprintf_cmd(unsigned long cmd, char *bf, size_t size) 115static size_t ioctl__scnprintf_cmd(unsigned long cmd, char *bf, size_t size, bool show_prefix)
116{ 116{
117 const char *prefix = "_IOC_";
117 int dir = _IOC_DIR(cmd), 118 int dir = _IOC_DIR(cmd),
118 type = _IOC_TYPE(cmd), 119 type = _IOC_TYPE(cmd),
119 nr = _IOC_NR(cmd), 120 nr = _IOC_NR(cmd),
@@ -143,12 +144,14 @@ static size_t ioctl__scnprintf_cmd(unsigned long cmd, char *bf, size_t size)
143 printed += scnprintf(bf + printed, size - printed, "%c", '('); 144 printed += scnprintf(bf + printed, size - printed, "%c", '(');
144 145
145 if (dir == _IOC_NONE) { 146 if (dir == _IOC_NONE) {
146 printed += scnprintf(bf + printed, size - printed, "%s", "NONE"); 147 printed += scnprintf(bf + printed, size - printed, "%s%s", show_prefix ? prefix : "", "NONE");
147 } else { 148 } else {
148 if (dir & _IOC_READ) 149 if (dir & _IOC_READ)
149 printed += scnprintf(bf + printed, size - printed, "%s", "READ"); 150 printed += scnprintf(bf + printed, size - printed, "%s%s", show_prefix ? prefix : "", "READ");
150 if (dir & _IOC_WRITE) 151 if (dir & _IOC_WRITE) {
151 printed += scnprintf(bf + printed, size - printed, "%s%s", dir & _IOC_READ ? "|" : "", "WRITE"); 152 printed += scnprintf(bf + printed, size - printed, "%s%s%s", dir & _IOC_READ ? "|" : "",
153 show_prefix ? prefix : "", "WRITE");
154 }
152 } 155 }
153 156
154 return printed + scnprintf(bf + printed, size - printed, ", %#x, %#x, %#x)", type, nr, sz); 157 return printed + scnprintf(bf + printed, size - printed, ", %#x, %#x, %#x)", type, nr, sz);
@@ -158,5 +161,5 @@ size_t syscall_arg__scnprintf_ioctl_cmd(char *bf, size_t size, struct syscall_ar
158{ 161{
159 unsigned long cmd = arg->val; 162 unsigned long cmd = arg->val;
160 163
161 return ioctl__scnprintf_cmd(cmd, bf, size); 164 return ioctl__scnprintf_cmd(cmd, bf, size, arg->show_string_prefix);
162} 165}
diff --git a/tools/perf/trace/beauty/kcmp.c b/tools/perf/trace/beauty/kcmp.c
index b276a274f203..9351f84390a1 100644
--- a/tools/perf/trace/beauty/kcmp.c
+++ b/tools/perf/trace/beauty/kcmp.c
@@ -26,10 +26,10 @@ size_t syscall_arg__scnprintf_kcmp_idx(char *bf, size_t size, struct syscall_arg
26 return pid__scnprintf_fd(arg->trace, pid, fd, bf, size); 26 return pid__scnprintf_fd(arg->trace, pid, fd, bf, size);
27} 27}
28 28
29static size_t kcmp__scnprintf_type(int type, char *bf, size_t size) 29static size_t kcmp__scnprintf_type(int type, char *bf, size_t size, bool show_prefix)
30{ 30{
31 static DEFINE_STRARRAY(kcmp_types); 31 static DEFINE_STRARRAY(kcmp_types, "KCMP_");
32 return strarray__scnprintf(&strarray__kcmp_types, bf, size, "%d", type); 32 return strarray__scnprintf(&strarray__kcmp_types, bf, size, "%d", show_prefix, type);
33} 33}
34 34
35size_t syscall_arg__scnprintf_kcmp_type(char *bf, size_t size, struct syscall_arg *arg) 35size_t syscall_arg__scnprintf_kcmp_type(char *bf, size_t size, struct syscall_arg *arg)
@@ -39,5 +39,5 @@ size_t syscall_arg__scnprintf_kcmp_type(char *bf, size_t size, struct syscall_ar
39 if (type != KCMP_FILE) 39 if (type != KCMP_FILE)
40 arg->mask |= (1 << 3) | (1 << 4); /* Ignore idx1 and idx2 */ 40 arg->mask |= (1 << 3) | (1 << 4); /* Ignore idx1 and idx2 */
41 41
42 return kcmp__scnprintf_type(type, bf, size); 42 return kcmp__scnprintf_type(type, bf, size, arg->show_string_prefix);
43} 43}
diff --git a/tools/perf/trace/beauty/mmap.c b/tools/perf/trace/beauty/mmap.c
index c534bd96ef5c..eb31089790e3 100644
--- a/tools/perf/trace/beauty/mmap.c
+++ b/tools/perf/trace/beauty/mmap.c
@@ -5,18 +5,20 @@
5static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size, 5static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size,
6 struct syscall_arg *arg) 6 struct syscall_arg *arg)
7{ 7{
8 const char *prot_prefix = "PROT_";
8 int printed = 0, prot = arg->val; 9 int printed = 0, prot = arg->val;
10 bool show_prefix = arg->show_string_prefix;
9 11
10 if (prot == PROT_NONE) 12 if (prot == PROT_NONE)
11 return scnprintf(bf, size, "NONE"); 13 return scnprintf(bf, size, "%sNONE", show_prefix ? prot_prefix : "");
12#define P_MMAP_PROT(n) \ 14#define P_MMAP_PROT(n) \
13 if (prot & PROT_##n) { \ 15 if (prot & PROT_##n) { \
14 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \ 16 printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prot_prefix :"", #n); \
15 prot &= ~PROT_##n; \ 17 prot &= ~PROT_##n; \
16 } 18 }
17 19
18 P_MMAP_PROT(EXEC);
19 P_MMAP_PROT(READ); 20 P_MMAP_PROT(READ);
21 P_MMAP_PROT(EXEC);
20 P_MMAP_PROT(WRITE); 22 P_MMAP_PROT(WRITE);
21 P_MMAP_PROT(SEM); 23 P_MMAP_PROT(SEM);
22 P_MMAP_PROT(GROWSDOWN); 24 P_MMAP_PROT(GROWSDOWN);
@@ -31,12 +33,12 @@ static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size,
31 33
32#define SCA_MMAP_PROT syscall_arg__scnprintf_mmap_prot 34#define SCA_MMAP_PROT syscall_arg__scnprintf_mmap_prot
33 35
34static size_t mmap__scnprintf_flags(unsigned long flags, char *bf, size_t size) 36static size_t mmap__scnprintf_flags(unsigned long flags, char *bf, size_t size, bool show_prefix)
35{ 37{
36#include "trace/beauty/generated/mmap_flags_array.c" 38#include "trace/beauty/generated/mmap_flags_array.c"
37 static DEFINE_STRARRAY(mmap_flags); 39 static DEFINE_STRARRAY(mmap_flags, "MAP_");
38 40
39 return strarray__scnprintf_flags(&strarray__mmap_flags, bf, size, flags); 41 return strarray__scnprintf_flags(&strarray__mmap_flags, bf, size, show_prefix, flags);
40} 42}
41 43
42static size_t syscall_arg__scnprintf_mmap_flags(char *bf, size_t size, 44static size_t syscall_arg__scnprintf_mmap_flags(char *bf, size_t size,
@@ -47,7 +49,7 @@ static size_t syscall_arg__scnprintf_mmap_flags(char *bf, size_t size,
47 if (flags & MAP_ANONYMOUS) 49 if (flags & MAP_ANONYMOUS)
48 arg->mask |= (1 << 4) | (1 << 5); /* Mask 4th ('fd') and 5th ('offset') args, ignored */ 50 arg->mask |= (1 << 4) | (1 << 5); /* Mask 4th ('fd') and 5th ('offset') args, ignored */
49 51
50 return mmap__scnprintf_flags(flags, bf, size); 52 return mmap__scnprintf_flags(flags, bf, size, arg->show_string_prefix);
51} 53}
52 54
53#define SCA_MMAP_FLAGS syscall_arg__scnprintf_mmap_flags 55#define SCA_MMAP_FLAGS syscall_arg__scnprintf_mmap_flags
@@ -55,11 +57,13 @@ static size_t syscall_arg__scnprintf_mmap_flags(char *bf, size_t size,
55static size_t syscall_arg__scnprintf_mremap_flags(char *bf, size_t size, 57static size_t syscall_arg__scnprintf_mremap_flags(char *bf, size_t size,
56 struct syscall_arg *arg) 58 struct syscall_arg *arg)
57{ 59{
60 const char *flags_prefix = "MREMAP_";
61 bool show_prefix = arg->show_string_prefix;
58 int printed = 0, flags = arg->val; 62 int printed = 0, flags = arg->val;
59 63
60#define P_MREMAP_FLAG(n) \ 64#define P_MREMAP_FLAG(n) \
61 if (flags & MREMAP_##n) { \ 65 if (flags & MREMAP_##n) { \
62 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \ 66 printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? flags_prefix : "", #n); \
63 flags &= ~MREMAP_##n; \ 67 flags &= ~MREMAP_##n; \
64 } 68 }
65 69
@@ -78,7 +82,7 @@ static size_t syscall_arg__scnprintf_mremap_flags(char *bf, size_t size,
78static size_t madvise__scnprintf_behavior(int behavior, char *bf, size_t size) 82static size_t madvise__scnprintf_behavior(int behavior, char *bf, size_t size)
79{ 83{
80#include "trace/beauty/generated/madvise_behavior_array.c" 84#include "trace/beauty/generated/madvise_behavior_array.c"
81 static DEFINE_STRARRAY(madvise_advices); 85 static DEFINE_STRARRAY(madvise_advices, "MADV_");
82 86
83 if (behavior < strarray__madvise_advices.nr_entries && strarray__madvise_advices.entries[behavior] != NULL) 87 if (behavior < strarray__madvise_advices.nr_entries && strarray__madvise_advices.entries[behavior] != NULL)
84 return scnprintf(bf, size, "MADV_%s", strarray__madvise_advices.entries[behavior]); 88 return scnprintf(bf, size, "MADV_%s", strarray__madvise_advices.entries[behavior]);
diff --git a/tools/perf/trace/beauty/mode_t.c b/tools/perf/trace/beauty/mode_t.c
index 6879d36d3004..29a8fadfb7f9 100644
--- a/tools/perf/trace/beauty/mode_t.c
+++ b/tools/perf/trace/beauty/mode_t.c
@@ -22,11 +22,13 @@
22 22
23static size_t syscall_arg__scnprintf_mode_t(char *bf, size_t size, struct syscall_arg *arg) 23static size_t syscall_arg__scnprintf_mode_t(char *bf, size_t size, struct syscall_arg *arg)
24{ 24{
25 bool show_prefix = arg->show_string_prefix;
26 const char *prefix = "S_";
25 int printed = 0, mode = arg->val; 27 int printed = 0, mode = arg->val;
26 28
27#define P_MODE(n) \ 29#define P_MODE(n) \
28 if ((mode & S_##n) == S_##n) { \ 30 if ((mode & S_##n) == S_##n) { \
29 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \ 31 printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
30 mode &= ~S_##n; \ 32 mode &= ~S_##n; \
31 } 33 }
32 34
diff --git a/tools/perf/trace/beauty/mount_flags.c b/tools/perf/trace/beauty/mount_flags.c
index 712935c6620a..10fb14cfaf8f 100644
--- a/tools/perf/trace/beauty/mount_flags.c
+++ b/tools/perf/trace/beauty/mount_flags.c
@@ -11,12 +11,12 @@
11#include <linux/log2.h> 11#include <linux/log2.h>
12#include <sys/mount.h> 12#include <sys/mount.h>
13 13
14static size_t mount__scnprintf_flags(unsigned long flags, char *bf, size_t size) 14static size_t mount__scnprintf_flags(unsigned long flags, char *bf, size_t size, bool show_prefix)
15{ 15{
16#include "trace/beauty/generated/mount_flags_array.c" 16#include "trace/beauty/generated/mount_flags_array.c"
17 static DEFINE_STRARRAY(mount_flags); 17 static DEFINE_STRARRAY(mount_flags, "MS_");
18 18
19 return strarray__scnprintf_flags(&strarray__mount_flags, bf, size, flags); 19 return strarray__scnprintf_flags(&strarray__mount_flags, bf, size, show_prefix, flags);
20} 20}
21 21
22unsigned long syscall_arg__mask_val_mount_flags(struct syscall_arg *arg __maybe_unused, unsigned long flags) 22unsigned long syscall_arg__mask_val_mount_flags(struct syscall_arg *arg __maybe_unused, unsigned long flags)
@@ -39,5 +39,5 @@ size_t syscall_arg__scnprintf_mount_flags(char *bf, size_t size, struct syscall_
39{ 39{
40 unsigned long flags = arg->val; 40 unsigned long flags = arg->val;
41 41
42 return mount__scnprintf_flags(flags, bf, size); 42 return mount__scnprintf_flags(flags, bf, size, arg->show_string_prefix);
43} 43}
diff --git a/tools/perf/trace/beauty/msg_flags.c b/tools/perf/trace/beauty/msg_flags.c
index 1b9d6306d274..d66c66315987 100644
--- a/tools/perf/trace/beauty/msg_flags.c
+++ b/tools/perf/trace/beauty/msg_flags.c
@@ -21,13 +21,15 @@
21static size_t syscall_arg__scnprintf_msg_flags(char *bf, size_t size, 21static size_t syscall_arg__scnprintf_msg_flags(char *bf, size_t size,
22 struct syscall_arg *arg) 22 struct syscall_arg *arg)
23{ 23{
24 bool show_prefix = arg->show_string_prefix;
25 const char *prefix = "MSG_";
24 int printed = 0, flags = arg->val; 26 int printed = 0, flags = arg->val;
25 27
26 if (flags == 0) 28 if (flags == 0)
27 return scnprintf(bf, size, "NONE"); 29 return scnprintf(bf, size, "NONE");
28#define P_MSG_FLAG(n) \ 30#define P_MSG_FLAG(n) \
29 if (flags & MSG_##n) { \ 31 if (flags & MSG_##n) { \
30 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \ 32 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
31 flags &= ~MSG_##n; \ 33 flags &= ~MSG_##n; \
32 } 34 }
33 35
diff --git a/tools/perf/trace/beauty/open_flags.c b/tools/perf/trace/beauty/open_flags.c
index cc673fec9184..78f6566ef110 100644
--- a/tools/perf/trace/beauty/open_flags.c
+++ b/tools/perf/trace/beauty/open_flags.c
@@ -22,15 +22,18 @@
22#undef O_LARGEFILE 22#undef O_LARGEFILE
23#define O_LARGEFILE 00100000 23#define O_LARGEFILE 00100000
24 24
25size_t open__scnprintf_flags(unsigned long flags, char *bf, size_t size) 25size_t open__scnprintf_flags(unsigned long flags, char *bf, size_t size, bool show_prefix)
26{ 26{
27 const char *prefix = "O_";
27 int printed = 0; 28 int printed = 0;
28 29
30 if ((flags & O_ACCMODE) == O_RDONLY)
31 printed = scnprintf(bf, size, "%s%s", show_prefix ? prefix : "", "RDONLY");
29 if (flags == 0) 32 if (flags == 0)
30 return scnprintf(bf, size, "RDONLY"); 33 return printed;
31#define P_FLAG(n) \ 34#define P_FLAG(n) \
32 if (flags & O_##n) { \ 35 if (flags & O_##n) { \
33 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \ 36 printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
34 flags &= ~O_##n; \ 37 flags &= ~O_##n; \
35 } 38 }
36 39
@@ -57,7 +60,7 @@ size_t open__scnprintf_flags(unsigned long flags, char *bf, size_t size)
57#endif 60#endif
58#ifdef O_DSYNC 61#ifdef O_DSYNC
59 if ((flags & O_SYNC) == O_SYNC) 62 if ((flags & O_SYNC) == O_SYNC)
60 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", "SYNC"); 63 printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", "SYNC");
61 else { 64 else {
62 P_FLAG(DSYNC); 65 P_FLAG(DSYNC);
63 } 66 }
@@ -81,5 +84,5 @@ size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_a
81 if (!(flags & O_CREAT)) 84 if (!(flags & O_CREAT))
82 arg->mask |= 1 << (arg->idx + 1); /* Mask the mode parm */ 85 arg->mask |= 1 << (arg->idx + 1); /* Mask the mode parm */
83 86
84 return open__scnprintf_flags(flags, bf, size); 87 return open__scnprintf_flags(flags, bf, size, arg->show_string_prefix);
85} 88}
diff --git a/tools/perf/trace/beauty/perf_event_open.c b/tools/perf/trace/beauty/perf_event_open.c
index 981185c1974b..11d47dbe63bd 100644
--- a/tools/perf/trace/beauty/perf_event_open.c
+++ b/tools/perf/trace/beauty/perf_event_open.c
@@ -18,6 +18,8 @@
18static size_t syscall_arg__scnprintf_perf_flags(char *bf, size_t size, 18static size_t syscall_arg__scnprintf_perf_flags(char *bf, size_t size,
19 struct syscall_arg *arg) 19 struct syscall_arg *arg)
20{ 20{
21 bool show_prefix = arg->show_string_prefix;
22 const char *prefix = "PERF_";
21 int printed = 0, flags = arg->val; 23 int printed = 0, flags = arg->val;
22 24
23 if (flags == 0) 25 if (flags == 0)
@@ -25,7 +27,7 @@ static size_t syscall_arg__scnprintf_perf_flags(char *bf, size_t size,
25 27
26#define P_FLAG(n) \ 28#define P_FLAG(n) \
27 if (flags & PERF_FLAG_##n) { \ 29 if (flags & PERF_FLAG_##n) { \
28 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \ 30 printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
29 flags &= ~PERF_FLAG_##n; \ 31 flags &= ~PERF_FLAG_##n; \
30 } 32 }
31 33
diff --git a/tools/perf/trace/beauty/pkey_alloc.c b/tools/perf/trace/beauty/pkey_alloc.c
index 1b8ed4cac815..f9596ed02cc4 100644
--- a/tools/perf/trace/beauty/pkey_alloc.c
+++ b/tools/perf/trace/beauty/pkey_alloc.c
@@ -9,14 +9,14 @@
9#include <linux/kernel.h> 9#include <linux/kernel.h>
10#include <linux/log2.h> 10#include <linux/log2.h>
11 11
12size_t strarray__scnprintf_flags(struct strarray *sa, char *bf, size_t size, unsigned long flags) 12size_t strarray__scnprintf_flags(struct strarray *sa, char *bf, size_t size, bool show_prefix, unsigned long flags)
13{ 13{
14 int i, printed = 0; 14 int i, printed = 0;
15 15
16 if (flags == 0) { 16 if (flags == 0) {
17 const char *s = sa->entries[0]; 17 const char *s = sa->entries[0];
18 if (s) 18 if (s)
19 return scnprintf(bf, size, "%s", s); 19 return scnprintf(bf, size, "%s%s", show_prefix ? sa->prefix : "", s);
20 return scnprintf(bf, size, "%d", 0); 20 return scnprintf(bf, size, "%d", 0);
21 } 21 }
22 22
@@ -30,7 +30,7 @@ size_t strarray__scnprintf_flags(struct strarray *sa, char *bf, size_t size, uns
30 printed += scnprintf(bf + printed, size - printed, "|"); 30 printed += scnprintf(bf + printed, size - printed, "|");
31 31
32 if (sa->entries[i] != NULL) 32 if (sa->entries[i] != NULL)
33 printed += scnprintf(bf + printed, size - printed, "%s", sa->entries[i]); 33 printed += scnprintf(bf + printed, size - printed, "%s%s", show_prefix ? sa->prefix : "", sa->entries[i]);
34 else 34 else
35 printed += scnprintf(bf + printed, size - printed, "0x%#", bit); 35 printed += scnprintf(bf + printed, size - printed, "0x%#", bit);
36 } 36 }
@@ -38,17 +38,17 @@ size_t strarray__scnprintf_flags(struct strarray *sa, char *bf, size_t size, uns
38 return printed; 38 return printed;
39} 39}
40 40
41static size_t pkey_alloc__scnprintf_access_rights(int access_rights, char *bf, size_t size) 41static size_t pkey_alloc__scnprintf_access_rights(int access_rights, char *bf, size_t size, bool show_prefix)
42{ 42{
43#include "trace/beauty/generated/pkey_alloc_access_rights_array.c" 43#include "trace/beauty/generated/pkey_alloc_access_rights_array.c"
44 static DEFINE_STRARRAY(pkey_alloc_access_rights); 44 static DEFINE_STRARRAY(pkey_alloc_access_rights, "PKEY_");
45 45
46 return strarray__scnprintf_flags(&strarray__pkey_alloc_access_rights, bf, size, access_rights); 46 return strarray__scnprintf_flags(&strarray__pkey_alloc_access_rights, bf, size, show_prefix, access_rights);
47} 47}
48 48
49size_t syscall_arg__scnprintf_pkey_alloc_access_rights(char *bf, size_t size, struct syscall_arg *arg) 49size_t syscall_arg__scnprintf_pkey_alloc_access_rights(char *bf, size_t size, struct syscall_arg *arg)
50{ 50{
51 unsigned long cmd = arg->val; 51 unsigned long cmd = arg->val;
52 52
53 return pkey_alloc__scnprintf_access_rights(cmd, bf, size); 53 return pkey_alloc__scnprintf_access_rights(cmd, bf, size, arg->show_string_prefix);
54} 54}
diff --git a/tools/perf/trace/beauty/prctl.c b/tools/perf/trace/beauty/prctl.c
index be7a5d395975..ba2179abed00 100644
--- a/tools/perf/trace/beauty/prctl.c
+++ b/tools/perf/trace/beauty/prctl.c
@@ -11,16 +11,16 @@
11 11
12#include "trace/beauty/generated/prctl_option_array.c" 12#include "trace/beauty/generated/prctl_option_array.c"
13 13
14static size_t prctl__scnprintf_option(int option, char *bf, size_t size) 14static size_t prctl__scnprintf_option(int option, char *bf, size_t size, bool show_prefix)
15{ 15{
16 static DEFINE_STRARRAY(prctl_options); 16 static DEFINE_STRARRAY(prctl_options, "PR_");
17 return strarray__scnprintf(&strarray__prctl_options, bf, size, "%d", option); 17 return strarray__scnprintf(&strarray__prctl_options, bf, size, "%d", show_prefix, option);
18} 18}
19 19
20static size_t prctl__scnprintf_set_mm(int option, char *bf, size_t size) 20static size_t prctl__scnprintf_set_mm(int option, char *bf, size_t size, bool show_prefix)
21{ 21{
22 static DEFINE_STRARRAY(prctl_set_mm_options); 22 static DEFINE_STRARRAY(prctl_set_mm_options, "PR_SET_MM_");
23 return strarray__scnprintf(&strarray__prctl_set_mm_options, bf, size, "%d", option); 23 return strarray__scnprintf(&strarray__prctl_set_mm_options, bf, size, "%d", show_prefix, option);
24} 24}
25 25
26size_t syscall_arg__scnprintf_prctl_arg2(char *bf, size_t size, struct syscall_arg *arg) 26size_t syscall_arg__scnprintf_prctl_arg2(char *bf, size_t size, struct syscall_arg *arg)
@@ -28,7 +28,7 @@ size_t syscall_arg__scnprintf_prctl_arg2(char *bf, size_t size, struct syscall_a
28 int option = syscall_arg__val(arg, 0); 28 int option = syscall_arg__val(arg, 0);
29 29
30 if (option == PR_SET_MM) 30 if (option == PR_SET_MM)
31 return prctl__scnprintf_set_mm(arg->val, bf, size); 31 return prctl__scnprintf_set_mm(arg->val, bf, size, arg->show_string_prefix);
32 /* 32 /*
33 * We still don't grab the contents of pointers on entry or exit, 33 * We still don't grab the contents of pointers on entry or exit,
34 * so just print them as hex numbers 34 * so just print them as hex numbers
@@ -77,5 +77,5 @@ size_t syscall_arg__scnprintf_prctl_option(char *bf, size_t size, struct syscall
77 if (option < ARRAY_SIZE(masks)) 77 if (option < ARRAY_SIZE(masks))
78 arg->mask |= masks[option]; 78 arg->mask |= masks[option];
79 79
80 return prctl__scnprintf_option(option, bf, size); 80 return prctl__scnprintf_option(option, bf, size, arg->show_string_prefix);
81} 81}
diff --git a/tools/perf/trace/beauty/rename_flags.sh b/tools/perf/trace/beauty/rename_flags.sh
new file mode 100755
index 000000000000..54c87c782ab2
--- /dev/null
+++ b/tools/perf/trace/beauty/rename_flags.sh
@@ -0,0 +1,15 @@
1#!/bin/sh
2# Copyright (C) 2018, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
3# SPDX-License-Identifier: LGPL-2.1
4
5[ $# -eq 1 ] && header_dir=$1 || header_dir=tools/include/uapi/linux/
6
7fs_header=${header_dir}/fs.h
8
9printf "static const char *rename_flags[] = {\n"
10regex='^[[:space:]]*#[[:space:]]*define[[:space:]]+RENAME_([[:alnum:]_]+)[[:space:]]+\(1[[:space:]]*<<[[:space:]]*([[:xdigit:]]+)[[:space:]]*\)[[:space:]]*.*'
11egrep -q $regex ${fs_header} && \
12(egrep $regex ${fs_header} | \
13 sed -r "s/$regex/\2 \1/g" | \
14 xargs printf "\t[%d + 1] = \"%s\",\n")
15printf "};\n"
diff --git a/tools/perf/trace/beauty/renameat.c b/tools/perf/trace/beauty/renameat.c
new file mode 100644
index 000000000000..6dab340cc506
--- /dev/null
+++ b/tools/perf/trace/beauty/renameat.c
@@ -0,0 +1,19 @@
1// SPDX-License-Identifier: LGPL-2.1
2// Copyright (C) 2018, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
3
4#include "trace/beauty/beauty.h"
5#include <uapi/linux/fs.h>
6
7static size_t renameat2__scnprintf_flags(unsigned long flags, char *bf, size_t size, bool show_prefix)
8{
9#include "trace/beauty/generated/rename_flags_array.c"
10 static DEFINE_STRARRAY(rename_flags, "RENAME_");
11
12 return strarray__scnprintf_flags(&strarray__rename_flags, bf, size, show_prefix, flags);
13}
14
15size_t syscall_arg__scnprintf_renameat2_flags(char *bf, size_t size, struct syscall_arg *arg)
16{
17 unsigned long flags = arg->val;
18 return renameat2__scnprintf_flags(flags, bf, size, arg->show_string_prefix);
19}
diff --git a/tools/perf/trace/beauty/sched_policy.c b/tools/perf/trace/beauty/sched_policy.c
index 48f2b5c9aa3e..68aa59eeed8d 100644
--- a/tools/perf/trace/beauty/sched_policy.c
+++ b/tools/perf/trace/beauty/sched_policy.c
@@ -17,6 +17,8 @@
17static size_t syscall_arg__scnprintf_sched_policy(char *bf, size_t size, 17static size_t syscall_arg__scnprintf_sched_policy(char *bf, size_t size,
18 struct syscall_arg *arg) 18 struct syscall_arg *arg)
19{ 19{
20 bool show_prefix = arg->show_string_prefix;
21 const char *prefix = "SCHED_";
20 const char *policies[] = { 22 const char *policies[] = {
21 "NORMAL", "FIFO", "RR", "BATCH", "ISO", "IDLE", "DEADLINE", 23 "NORMAL", "FIFO", "RR", "BATCH", "ISO", "IDLE", "DEADLINE",
22 }; 24 };
@@ -26,13 +28,13 @@ static size_t syscall_arg__scnprintf_sched_policy(char *bf, size_t size,
26 28
27 policy &= SCHED_POLICY_MASK; 29 policy &= SCHED_POLICY_MASK;
28 if (policy <= SCHED_DEADLINE) 30 if (policy <= SCHED_DEADLINE)
29 printed = scnprintf(bf, size, "%s", policies[policy]); 31 printed = scnprintf(bf, size, "%s%s", show_prefix ? prefix : "", policies[policy]);
30 else 32 else
31 printed = scnprintf(bf, size, "%#x", policy); 33 printed = scnprintf(bf, size, "%#x", policy);
32 34
33#define P_POLICY_FLAG(n) \ 35#define P_POLICY_FLAG(n) \
34 if (flags & SCHED_##n) { \ 36 if (flags & SCHED_##n) { \
35 printed += scnprintf(bf + printed, size - printed, "|%s", #n); \ 37 printed += scnprintf(bf + printed, size - printed, "|%s%s", show_prefix ? prefix : "", #n); \
36 flags &= ~SCHED_##n; \ 38 flags &= ~SCHED_##n; \
37 } 39 }
38 40
diff --git a/tools/perf/trace/beauty/seccomp.c b/tools/perf/trace/beauty/seccomp.c
index e36156b19c70..4600c28a3cfe 100644
--- a/tools/perf/trace/beauty/seccomp.c
+++ b/tools/perf/trace/beauty/seccomp.c
@@ -8,11 +8,13 @@
8 8
9static size_t syscall_arg__scnprintf_seccomp_op(char *bf, size_t size, struct syscall_arg *arg) 9static size_t syscall_arg__scnprintf_seccomp_op(char *bf, size_t size, struct syscall_arg *arg)
10{ 10{
11 bool show_prefix = arg->show_string_prefix;
12 const char *prefix = "SECOMP_SET_MODE_";
11 int op = arg->val; 13 int op = arg->val;
12 size_t printed = 0; 14 size_t printed = 0;
13 15
14 switch (op) { 16 switch (op) {
15#define P_SECCOMP_SET_MODE_OP(n) case SECCOMP_SET_MODE_##n: printed = scnprintf(bf, size, #n); break 17#define P_SECCOMP_SET_MODE_OP(n) case SECCOMP_SET_MODE_##n: printed = scnprintf(bf, size, "%s%s", show_prefix ? prefix : "", #n); break
16 P_SECCOMP_SET_MODE_OP(STRICT); 18 P_SECCOMP_SET_MODE_OP(STRICT);
17 P_SECCOMP_SET_MODE_OP(FILTER); 19 P_SECCOMP_SET_MODE_OP(FILTER);
18#undef P_SECCOMP_SET_MODE_OP 20#undef P_SECCOMP_SET_MODE_OP
@@ -31,11 +33,13 @@ static size_t syscall_arg__scnprintf_seccomp_op(char *bf, size_t size, struct sy
31static size_t syscall_arg__scnprintf_seccomp_flags(char *bf, size_t size, 33static size_t syscall_arg__scnprintf_seccomp_flags(char *bf, size_t size,
32 struct syscall_arg *arg) 34 struct syscall_arg *arg)
33{ 35{
36 bool show_prefix = arg->show_string_prefix;
37 const char *prefix = "SECOMP_FILTER_FLAG_";
34 int printed = 0, flags = arg->val; 38 int printed = 0, flags = arg->val;
35 39
36#define P_FLAG(n) \ 40#define P_FLAG(n) \
37 if (flags & SECCOMP_FILTER_FLAG_##n) { \ 41 if (flags & SECCOMP_FILTER_FLAG_##n) { \
38 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \ 42 printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
39 flags &= ~SECCOMP_FILTER_FLAG_##n; \ 43 flags &= ~SECCOMP_FILTER_FLAG_##n; \
40 } 44 }
41 45
diff --git a/tools/perf/trace/beauty/signum.c b/tools/perf/trace/beauty/signum.c
index 587fec545b8a..21220c56500a 100644
--- a/tools/perf/trace/beauty/signum.c
+++ b/tools/perf/trace/beauty/signum.c
@@ -3,10 +3,12 @@
3 3
4static size_t syscall_arg__scnprintf_signum(char *bf, size_t size, struct syscall_arg *arg) 4static size_t syscall_arg__scnprintf_signum(char *bf, size_t size, struct syscall_arg *arg)
5{ 5{
6 bool show_prefix = arg->show_string_prefix;
7 const char *prefix = "SIG";
6 int sig = arg->val; 8 int sig = arg->val;
7 9
8 switch (sig) { 10 switch (sig) {
9#define P_SIGNUM(n) case SIG##n: return scnprintf(bf, size, #n) 11#define P_SIGNUM(n) case SIG##n: return scnprintf(bf, size, "%s%s", show_prefix ? prefix : "", #n)
10 P_SIGNUM(HUP); 12 P_SIGNUM(HUP);
11 P_SIGNUM(INT); 13 P_SIGNUM(INT);
12 P_SIGNUM(QUIT); 14 P_SIGNUM(QUIT);
diff --git a/tools/perf/trace/beauty/sockaddr.c b/tools/perf/trace/beauty/sockaddr.c
index 9410ad230f10..173c8f760763 100644
--- a/tools/perf/trace/beauty/sockaddr.c
+++ b/tools/perf/trace/beauty/sockaddr.c
@@ -15,7 +15,7 @@ static const char *socket_families[] = {
15 "BLUETOOTH", "IUCV", "RXRPC", "ISDN", "PHONET", "IEEE802154", "CAIF", 15 "BLUETOOTH", "IUCV", "RXRPC", "ISDN", "PHONET", "IEEE802154", "CAIF",
16 "ALG", "NFC", "VSOCK", 16 "ALG", "NFC", "VSOCK",
17}; 17};
18DEFINE_STRARRAY(socket_families); 18DEFINE_STRARRAY(socket_families, "PF_");
19 19
20static size_t af_inet__scnprintf(struct sockaddr *sa, char *bf, size_t size) 20static size_t af_inet__scnprintf(struct sockaddr *sa, char *bf, size_t size)
21{ 21{
@@ -58,7 +58,7 @@ static size_t syscall_arg__scnprintf_augmented_sockaddr(struct syscall_arg *arg,
58 char family[32]; 58 char family[32];
59 size_t printed; 59 size_t printed;
60 60
61 strarray__scnprintf(&strarray__socket_families, family, sizeof(family), "%d", sa->sa_family); 61 strarray__scnprintf(&strarray__socket_families, family, sizeof(family), "%d", arg->show_string_prefix, sa->sa_family);
62 printed = scnprintf(bf, size, "{ .family: %s", family); 62 printed = scnprintf(bf, size, "{ .family: %s", family);
63 63
64 if (sa->sa_family < ARRAY_SIZE(af_scnprintfs) && af_scnprintfs[sa->sa_family]) 64 if (sa->sa_family < ARRAY_SIZE(af_scnprintfs) && af_scnprintfs[sa->sa_family])
diff --git a/tools/perf/trace/beauty/socket.c b/tools/perf/trace/beauty/socket.c
index d971a2596417..f23a3dda2902 100644
--- a/tools/perf/trace/beauty/socket.c
+++ b/tools/perf/trace/beauty/socket.c
@@ -9,12 +9,12 @@
9#include <sys/types.h> 9#include <sys/types.h>
10#include <sys/socket.h> 10#include <sys/socket.h>
11 11
12static size_t socket__scnprintf_ipproto(int protocol, char *bf, size_t size) 12static size_t socket__scnprintf_ipproto(int protocol, char *bf, size_t size, bool show_prefix)
13{ 13{
14#include "trace/beauty/generated/socket_ipproto_array.c" 14#include "trace/beauty/generated/socket_ipproto_array.c"
15 static DEFINE_STRARRAY(socket_ipproto); 15 static DEFINE_STRARRAY(socket_ipproto, "IPPROTO_");
16 16
17 return strarray__scnprintf(&strarray__socket_ipproto, bf, size, "%d", protocol); 17 return strarray__scnprintf(&strarray__socket_ipproto, bf, size, "%d", show_prefix, protocol);
18} 18}
19 19
20size_t syscall_arg__scnprintf_socket_protocol(char *bf, size_t size, struct syscall_arg *arg) 20size_t syscall_arg__scnprintf_socket_protocol(char *bf, size_t size, struct syscall_arg *arg)
@@ -22,7 +22,7 @@ size_t syscall_arg__scnprintf_socket_protocol(char *bf, size_t size, struct sysc
22 int domain = syscall_arg__val(arg, 0); 22 int domain = syscall_arg__val(arg, 0);
23 23
24 if (domain == AF_INET || domain == AF_INET6) 24 if (domain == AF_INET || domain == AF_INET6)
25 return socket__scnprintf_ipproto(arg->val, bf, size); 25 return socket__scnprintf_ipproto(arg->val, bf, size, arg->show_string_prefix);
26 26
27 return syscall_arg__scnprintf_int(bf, size, arg); 27 return syscall_arg__scnprintf_int(bf, size, arg);
28} 28}
diff --git a/tools/perf/trace/beauty/socket_type.c b/tools/perf/trace/beauty/socket_type.c
index a63a9a332aa0..bed8d5761ca8 100644
--- a/tools/perf/trace/beauty/socket_type.c
+++ b/tools/perf/trace/beauty/socket_type.c
@@ -20,6 +20,8 @@
20 20
21static size_t syscall_arg__scnprintf_socket_type(char *bf, size_t size, struct syscall_arg *arg) 21static size_t syscall_arg__scnprintf_socket_type(char *bf, size_t size, struct syscall_arg *arg)
22{ 22{
23 bool show_prefix = arg->show_string_prefix;
24 const char *prefix = "SOCK_";
23 size_t printed; 25 size_t printed;
24 int type = arg->val, 26 int type = arg->val,
25 flags = type & ~SOCK_TYPE_MASK; 27 flags = type & ~SOCK_TYPE_MASK;
@@ -29,7 +31,7 @@ static size_t syscall_arg__scnprintf_socket_type(char *bf, size_t size, struct s
29 * Can't use a strarray, MIPS may override for ABI reasons. 31 * Can't use a strarray, MIPS may override for ABI reasons.
30 */ 32 */
31 switch (type) { 33 switch (type) {
32#define P_SK_TYPE(n) case SOCK_##n: printed = scnprintf(bf, size, #n); break; 34#define P_SK_TYPE(n) case SOCK_##n: printed = scnprintf(bf, size, "%s%s", show_prefix ? prefix : "", #n); break;
33 P_SK_TYPE(STREAM); 35 P_SK_TYPE(STREAM);
34 P_SK_TYPE(DGRAM); 36 P_SK_TYPE(DGRAM);
35 P_SK_TYPE(RAW); 37 P_SK_TYPE(RAW);
diff --git a/tools/perf/trace/beauty/statx.c b/tools/perf/trace/beauty/statx.c
index 630f2760dd66..811cc0eeb2d5 100644
--- a/tools/perf/trace/beauty/statx.c
+++ b/tools/perf/trace/beauty/statx.c
@@ -13,13 +13,15 @@
13 13
14size_t syscall_arg__scnprintf_statx_flags(char *bf, size_t size, struct syscall_arg *arg) 14size_t syscall_arg__scnprintf_statx_flags(char *bf, size_t size, struct syscall_arg *arg)
15{ 15{
16 bool show_prefix = arg->show_string_prefix;
17 const char *prefix = "AT_";
16 int printed = 0, flags = arg->val; 18 int printed = 0, flags = arg->val;
17 19
18 if (flags == 0) 20 if (flags == 0)
19 return scnprintf(bf, size, "SYNC_AS_STAT"); 21 return scnprintf(bf, size, "%s%s", show_prefix ? "AT_STATX_" : "", "SYNC_AS_STAT");
20#define P_FLAG(n) \ 22#define P_FLAG(n) \
21 if (flags & AT_##n) { \ 23 if (flags & AT_##n) { \
22 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \ 24 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
23 flags &= ~AT_##n; \ 25 flags &= ~AT_##n; \
24 } 26 }
25 27
@@ -41,11 +43,13 @@ size_t syscall_arg__scnprintf_statx_flags(char *bf, size_t size, struct syscall_
41 43
42size_t syscall_arg__scnprintf_statx_mask(char *bf, size_t size, struct syscall_arg *arg) 44size_t syscall_arg__scnprintf_statx_mask(char *bf, size_t size, struct syscall_arg *arg)
43{ 45{
46 bool show_prefix = arg->show_string_prefix;
47 const char *prefix = "STATX_";
44 int printed = 0, flags = arg->val; 48 int printed = 0, flags = arg->val;
45 49
46#define P_FLAG(n) \ 50#define P_FLAG(n) \
47 if (flags & STATX_##n) { \ 51 if (flags & STATX_##n) { \
48 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \ 52 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
49 flags &= ~STATX_##n; \ 53 flags &= ~STATX_##n; \
50 } 54 }
51 55
diff --git a/tools/perf/trace/beauty/waitid_options.c b/tools/perf/trace/beauty/waitid_options.c
index 42ff58ad613b..6897fab40dcc 100644
--- a/tools/perf/trace/beauty/waitid_options.c
+++ b/tools/perf/trace/beauty/waitid_options.c
@@ -5,11 +5,13 @@
5static size_t syscall_arg__scnprintf_waitid_options(char *bf, size_t size, 5static size_t syscall_arg__scnprintf_waitid_options(char *bf, size_t size,
6 struct syscall_arg *arg) 6 struct syscall_arg *arg)
7{ 7{
8 bool show_prefix = arg->show_string_prefix;
9 const char *prefix = "W";
8 int printed = 0, options = arg->val; 10 int printed = 0, options = arg->val;
9 11
10#define P_OPTION(n) \ 12#define P_OPTION(n) \
11 if (options & W##n) { \ 13 if (options & W##n) { \
12 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \ 14 printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : #n); \
13 options &= ~W##n; \ 15 options &= ~W##n; \
14 } 16 }
15 17
diff --git a/tools/perf/trace/beauty/x86_arch_prctl.sh b/tools/perf/trace/beauty/x86_arch_prctl.sh
new file mode 100755
index 000000000000..7372d3cab959
--- /dev/null
+++ b/tools/perf/trace/beauty/x86_arch_prctl.sh
@@ -0,0 +1,26 @@
1#!/bin/sh
2# Copyright (C) 2018, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
3# SPDX-License-Identifier: LGPL-2.1
4
5[ $# -eq 1 ] && x86_header_dir=$1 || x86_header_dir=tools/arch/x86/include/uapi/asm/
6
7prctl_arch_header=${x86_header_dir}/prctl.h
8
9print_range () {
10 local idx=$1
11 local prefix=$2
12 local first_entry=$3
13
14 printf "#define x86_arch_prctl_codes_%d_offset %s\n" $idx $first_entry
15 printf "static const char *x86_arch_prctl_codes_%d[] = {\n" $idx
16 regex=`printf '^[[:space:]]*#[[:space:]]*define[[:space:]]+ARCH_([[:alnum:]_]+)[[:space:]]+(%s[[:xdigit:]]+).*' ${prefix}`
17 fmt="\t[%#x - ${first_entry}]= \"%s\",\n"
18 egrep -q $regex ${prctl_arch_header} && \
19 (egrep $regex ${prctl_arch_header} | \
20 sed -r "s/$regex/\2 \1/g" | \
21 xargs printf "$fmt")
22 printf "};\n\n"
23}
24
25print_range 1 0x1 0x1001
26print_range 2 0x2 0x2001
diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
index 72d5ba2479bf..f69961c4a4f3 100644
--- a/tools/perf/util/auxtrace.c
+++ b/tools/perf/util/auxtrace.c
@@ -1983,17 +1983,14 @@ static int find_dso_sym(struct dso *dso, const char *sym_name, u64 *start,
1983 1983
1984static int addr_filter__entire_dso(struct addr_filter *filt, struct dso *dso) 1984static int addr_filter__entire_dso(struct addr_filter *filt, struct dso *dso)
1985{ 1985{
1986 struct symbol *first_sym = dso__first_symbol(dso); 1986 if (dso__data_file_size(dso, NULL)) {
1987 struct symbol *last_sym = dso__last_symbol(dso); 1987 pr_err("Failed to determine filter for %s\nCannot determine file size.\n",
1988
1989 if (!first_sym || !last_sym) {
1990 pr_err("Failed to determine filter for %s\nNo symbols found.\n",
1991 filt->filename); 1988 filt->filename);
1992 return -EINVAL; 1989 return -EINVAL;
1993 } 1990 }
1994 1991
1995 filt->addr = first_sym->start; 1992 filt->addr = 0;
1996 filt->size = last_sym->end - first_sym->start; 1993 filt->size = dso->data.file_size;
1997 1994
1998 return 0; 1995 return 0;
1999} 1996}
diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
index 0b4c8629f578..8c155575c6c5 100644
--- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
+++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c
@@ -36,7 +36,6 @@
36struct cs_etm_decoder { 36struct cs_etm_decoder {
37 void *data; 37 void *data;
38 void (*packet_printer)(const char *msg); 38 void (*packet_printer)(const char *msg);
39 bool trace_on;
40 dcd_tree_handle_t dcd_tree; 39 dcd_tree_handle_t dcd_tree;
41 cs_etm_mem_cb_type mem_access; 40 cs_etm_mem_cb_type mem_access;
42 ocsd_datapath_resp_t prev_return; 41 ocsd_datapath_resp_t prev_return;
@@ -291,8 +290,6 @@ static void cs_etm_decoder__clear_buffer(struct cs_etm_decoder *decoder)
291 decoder->packet_buffer[i].instr_count = 0; 290 decoder->packet_buffer[i].instr_count = 0;
292 decoder->packet_buffer[i].last_instr_taken_branch = false; 291 decoder->packet_buffer[i].last_instr_taken_branch = false;
293 decoder->packet_buffer[i].last_instr_size = 0; 292 decoder->packet_buffer[i].last_instr_size = 0;
294 decoder->packet_buffer[i].exc = false;
295 decoder->packet_buffer[i].exc_ret = false;
296 decoder->packet_buffer[i].cpu = INT_MIN; 293 decoder->packet_buffer[i].cpu = INT_MIN;
297 } 294 }
298} 295}
@@ -320,8 +317,6 @@ cs_etm_decoder__buffer_packet(struct cs_etm_decoder *decoder,
320 317
321 decoder->packet_buffer[et].sample_type = sample_type; 318 decoder->packet_buffer[et].sample_type = sample_type;
322 decoder->packet_buffer[et].isa = CS_ETM_ISA_UNKNOWN; 319 decoder->packet_buffer[et].isa = CS_ETM_ISA_UNKNOWN;
323 decoder->packet_buffer[et].exc = false;
324 decoder->packet_buffer[et].exc_ret = false;
325 decoder->packet_buffer[et].cpu = *((int *)inode->priv); 320 decoder->packet_buffer[et].cpu = *((int *)inode->priv);
326 decoder->packet_buffer[et].start_addr = CS_ETM_INVAL_ADDR; 321 decoder->packet_buffer[et].start_addr = CS_ETM_INVAL_ADDR;
327 decoder->packet_buffer[et].end_addr = CS_ETM_INVAL_ADDR; 322 decoder->packet_buffer[et].end_addr = CS_ETM_INVAL_ADDR;
@@ -391,11 +386,27 @@ cs_etm_decoder__buffer_range(struct cs_etm_decoder *decoder,
391} 386}
392 387
393static ocsd_datapath_resp_t 388static ocsd_datapath_resp_t
394cs_etm_decoder__buffer_trace_on(struct cs_etm_decoder *decoder, 389cs_etm_decoder__buffer_discontinuity(struct cs_etm_decoder *decoder,
395 const uint8_t trace_chan_id) 390 const uint8_t trace_chan_id)
396{ 391{
397 return cs_etm_decoder__buffer_packet(decoder, trace_chan_id, 392 return cs_etm_decoder__buffer_packet(decoder, trace_chan_id,
398 CS_ETM_TRACE_ON); 393 CS_ETM_DISCONTINUITY);
394}
395
396static ocsd_datapath_resp_t
397cs_etm_decoder__buffer_exception(struct cs_etm_decoder *decoder,
398 const uint8_t trace_chan_id)
399{
400 return cs_etm_decoder__buffer_packet(decoder, trace_chan_id,
401 CS_ETM_EXCEPTION);
402}
403
404static ocsd_datapath_resp_t
405cs_etm_decoder__buffer_exception_ret(struct cs_etm_decoder *decoder,
406 const uint8_t trace_chan_id)
407{
408 return cs_etm_decoder__buffer_packet(decoder, trace_chan_id,
409 CS_ETM_EXCEPTION_RET);
399} 410}
400 411
401static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer( 412static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer(
@@ -410,26 +421,25 @@ static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer(
410 switch (elem->elem_type) { 421 switch (elem->elem_type) {
411 case OCSD_GEN_TRC_ELEM_UNKNOWN: 422 case OCSD_GEN_TRC_ELEM_UNKNOWN:
412 break; 423 break;
424 case OCSD_GEN_TRC_ELEM_EO_TRACE:
413 case OCSD_GEN_TRC_ELEM_NO_SYNC: 425 case OCSD_GEN_TRC_ELEM_NO_SYNC:
414 decoder->trace_on = false;
415 break;
416 case OCSD_GEN_TRC_ELEM_TRACE_ON: 426 case OCSD_GEN_TRC_ELEM_TRACE_ON:
417 resp = cs_etm_decoder__buffer_trace_on(decoder, 427 resp = cs_etm_decoder__buffer_discontinuity(decoder,
418 trace_chan_id); 428 trace_chan_id);
419 decoder->trace_on = true;
420 break; 429 break;
421 case OCSD_GEN_TRC_ELEM_INSTR_RANGE: 430 case OCSD_GEN_TRC_ELEM_INSTR_RANGE:
422 resp = cs_etm_decoder__buffer_range(decoder, elem, 431 resp = cs_etm_decoder__buffer_range(decoder, elem,
423 trace_chan_id); 432 trace_chan_id);
424 break; 433 break;
425 case OCSD_GEN_TRC_ELEM_EXCEPTION: 434 case OCSD_GEN_TRC_ELEM_EXCEPTION:
426 decoder->packet_buffer[decoder->tail].exc = true; 435 resp = cs_etm_decoder__buffer_exception(decoder,
436 trace_chan_id);
427 break; 437 break;
428 case OCSD_GEN_TRC_ELEM_EXCEPTION_RET: 438 case OCSD_GEN_TRC_ELEM_EXCEPTION_RET:
429 decoder->packet_buffer[decoder->tail].exc_ret = true; 439 resp = cs_etm_decoder__buffer_exception_ret(decoder,
440 trace_chan_id);
430 break; 441 break;
431 case OCSD_GEN_TRC_ELEM_PE_CONTEXT: 442 case OCSD_GEN_TRC_ELEM_PE_CONTEXT:
432 case OCSD_GEN_TRC_ELEM_EO_TRACE:
433 case OCSD_GEN_TRC_ELEM_ADDR_NACC: 443 case OCSD_GEN_TRC_ELEM_ADDR_NACC:
434 case OCSD_GEN_TRC_ELEM_TIMESTAMP: 444 case OCSD_GEN_TRC_ELEM_TIMESTAMP:
435 case OCSD_GEN_TRC_ELEM_CYCLE_COUNT: 445 case OCSD_GEN_TRC_ELEM_CYCLE_COUNT:
diff --git a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
index b295dd2b8292..a6407d41598f 100644
--- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
+++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
@@ -23,9 +23,11 @@ struct cs_etm_buffer {
23}; 23};
24 24
25enum cs_etm_sample_type { 25enum cs_etm_sample_type {
26 CS_ETM_EMPTY = 0, 26 CS_ETM_EMPTY,
27 CS_ETM_RANGE = 1 << 0, 27 CS_ETM_RANGE,
28 CS_ETM_TRACE_ON = 1 << 1, 28 CS_ETM_DISCONTINUITY,
29 CS_ETM_EXCEPTION,
30 CS_ETM_EXCEPTION_RET,
29}; 31};
30 32
31enum cs_etm_isa { 33enum cs_etm_isa {
@@ -43,8 +45,6 @@ struct cs_etm_packet {
43 u32 instr_count; 45 u32 instr_count;
44 u8 last_instr_taken_branch; 46 u8 last_instr_taken_branch;
45 u8 last_instr_size; 47 u8 last_instr_size;
46 u8 exc;
47 u8 exc_ret;
48 int cpu; 48 int cpu;
49}; 49};
50 50
diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
index 23159c33db2a..27a374ddf661 100644
--- a/tools/perf/util/cs-etm.c
+++ b/tools/perf/util/cs-etm.c
@@ -562,8 +562,8 @@ static inline int cs_etm__t32_instr_size(struct cs_etm_queue *etmq,
562 562
563static inline u64 cs_etm__first_executed_instr(struct cs_etm_packet *packet) 563static inline u64 cs_etm__first_executed_instr(struct cs_etm_packet *packet)
564{ 564{
565 /* Returns 0 for the CS_ETM_TRACE_ON packet */ 565 /* Returns 0 for the CS_ETM_DISCONTINUITY packet */
566 if (packet->sample_type == CS_ETM_TRACE_ON) 566 if (packet->sample_type == CS_ETM_DISCONTINUITY)
567 return 0; 567 return 0;
568 568
569 return packet->start_addr; 569 return packet->start_addr;
@@ -572,8 +572,8 @@ static inline u64 cs_etm__first_executed_instr(struct cs_etm_packet *packet)
572static inline 572static inline
573u64 cs_etm__last_executed_instr(const struct cs_etm_packet *packet) 573u64 cs_etm__last_executed_instr(const struct cs_etm_packet *packet)
574{ 574{
575 /* Returns 0 for the CS_ETM_TRACE_ON packet */ 575 /* Returns 0 for the CS_ETM_DISCONTINUITY packet */
576 if (packet->sample_type == CS_ETM_TRACE_ON) 576 if (packet->sample_type == CS_ETM_DISCONTINUITY)
577 return 0; 577 return 0;
578 578
579 return packet->end_addr - packet->last_instr_size; 579 return packet->end_addr - packet->last_instr_size;
@@ -972,7 +972,7 @@ static int cs_etm__sample(struct cs_etm_queue *etmq)
972 bool generate_sample = false; 972 bool generate_sample = false;
973 973
974 /* Generate sample for tracing on packet */ 974 /* Generate sample for tracing on packet */
975 if (etmq->prev_packet->sample_type == CS_ETM_TRACE_ON) 975 if (etmq->prev_packet->sample_type == CS_ETM_DISCONTINUITY)
976 generate_sample = true; 976 generate_sample = true;
977 977
978 /* Generate sample for branch taken packet */ 978 /* Generate sample for branch taken packet */
@@ -1000,6 +1000,25 @@ static int cs_etm__sample(struct cs_etm_queue *etmq)
1000 return 0; 1000 return 0;
1001} 1001}
1002 1002
1003static int cs_etm__exception(struct cs_etm_queue *etmq)
1004{
1005 /*
1006 * When the exception packet is inserted, whether the last instruction
1007 * in previous range packet is taken branch or not, we need to force
1008 * to set 'prev_packet->last_instr_taken_branch' to true. This ensures
1009 * to generate branch sample for the instruction range before the
1010 * exception is trapped to kernel or before the exception returning.
1011 *
1012 * The exception packet includes the dummy address values, so don't
1013 * swap PACKET with PREV_PACKET. This keeps PREV_PACKET to be useful
1014 * for generating instruction and branch samples.
1015 */
1016 if (etmq->prev_packet->sample_type == CS_ETM_RANGE)
1017 etmq->prev_packet->last_instr_taken_branch = true;
1018
1019 return 0;
1020}
1021
1003static int cs_etm__flush(struct cs_etm_queue *etmq) 1022static int cs_etm__flush(struct cs_etm_queue *etmq)
1004{ 1023{
1005 int err = 0; 1024 int err = 0;
@@ -1042,7 +1061,7 @@ static int cs_etm__flush(struct cs_etm_queue *etmq)
1042 } 1061 }
1043 1062
1044swap_packet: 1063swap_packet:
1045 if (etmq->etm->synth_opts.last_branch) { 1064 if (etm->sample_branches || etm->synth_opts.last_branch) {
1046 /* 1065 /*
1047 * Swap PACKET with PREV_PACKET: PACKET becomes PREV_PACKET for 1066 * Swap PACKET with PREV_PACKET: PACKET becomes PREV_PACKET for
1048 * the next incoming packet. 1067 * the next incoming packet.
@@ -1055,6 +1074,39 @@ swap_packet:
1055 return err; 1074 return err;
1056} 1075}
1057 1076
1077static int cs_etm__end_block(struct cs_etm_queue *etmq)
1078{
1079 int err;
1080
1081 /*
1082 * It has no new packet coming and 'etmq->packet' contains the stale
1083 * packet which was set at the previous time with packets swapping;
1084 * so skip to generate branch sample to avoid stale packet.
1085 *
1086 * For this case only flush branch stack and generate a last branch
1087 * event for the branches left in the circular buffer at the end of
1088 * the trace.
1089 */
1090 if (etmq->etm->synth_opts.last_branch &&
1091 etmq->prev_packet->sample_type == CS_ETM_RANGE) {
1092 /*
1093 * Use the address of the end of the last reported execution
1094 * range.
1095 */
1096 u64 addr = cs_etm__last_executed_instr(etmq->prev_packet);
1097
1098 err = cs_etm__synth_instruction_sample(
1099 etmq, addr,
1100 etmq->period_instructions);
1101 if (err)
1102 return err;
1103
1104 etmq->period_instructions = 0;
1105 }
1106
1107 return 0;
1108}
1109
1058static int cs_etm__run_decoder(struct cs_etm_queue *etmq) 1110static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
1059{ 1111{
1060 struct cs_etm_auxtrace *etm = etmq->etm; 1112 struct cs_etm_auxtrace *etm = etmq->etm;
@@ -1115,7 +1167,16 @@ static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
1115 */ 1167 */
1116 cs_etm__sample(etmq); 1168 cs_etm__sample(etmq);
1117 break; 1169 break;
1118 case CS_ETM_TRACE_ON: 1170 case CS_ETM_EXCEPTION:
1171 case CS_ETM_EXCEPTION_RET:
1172 /*
1173 * If the exception packet is coming,
1174 * make sure the previous instruction
1175 * range packet to be handled properly.
1176 */
1177 cs_etm__exception(etmq);
1178 break;
1179 case CS_ETM_DISCONTINUITY:
1119 /* 1180 /*
1120 * Discontinuity in trace, flush 1181 * Discontinuity in trace, flush
1121 * previous branch stack 1182 * previous branch stack
@@ -1137,7 +1198,7 @@ static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
1137 1198
1138 if (err == 0) 1199 if (err == 0)
1139 /* Flush any remaining branch stack entries */ 1200 /* Flush any remaining branch stack entries */
1140 err = cs_etm__flush(etmq); 1201 err = cs_etm__end_block(etmq);
1141 } 1202 }
1142 1203
1143 return err; 1204 return err;
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
index cee717a3794f..62c8cf622607 100644
--- a/tools/perf/util/dso.c
+++ b/tools/perf/util/dso.c
@@ -894,7 +894,7 @@ static ssize_t cached_read(struct dso *dso, struct machine *machine,
894 return r; 894 return r;
895} 895}
896 896
897static int data_file_size(struct dso *dso, struct machine *machine) 897int dso__data_file_size(struct dso *dso, struct machine *machine)
898{ 898{
899 int ret = 0; 899 int ret = 0;
900 struct stat st; 900 struct stat st;
@@ -943,7 +943,7 @@ out:
943 */ 943 */
944off_t dso__data_size(struct dso *dso, struct machine *machine) 944off_t dso__data_size(struct dso *dso, struct machine *machine)
945{ 945{
946 if (data_file_size(dso, machine)) 946 if (dso__data_file_size(dso, machine))
947 return -1; 947 return -1;
948 948
949 /* For now just estimate dso data size is close to file size */ 949 /* For now just estimate dso data size is close to file size */
@@ -953,7 +953,7 @@ off_t dso__data_size(struct dso *dso, struct machine *machine)
953static ssize_t data_read_offset(struct dso *dso, struct machine *machine, 953static ssize_t data_read_offset(struct dso *dso, struct machine *machine,
954 u64 offset, u8 *data, ssize_t size) 954 u64 offset, u8 *data, ssize_t size)
955{ 955{
956 if (data_file_size(dso, machine)) 956 if (dso__data_file_size(dso, machine))
957 return -1; 957 return -1;
958 958
959 /* Check the offset sanity. */ 959 /* Check the offset sanity. */
diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h
index c5380500bed4..8c8a7abe809d 100644
--- a/tools/perf/util/dso.h
+++ b/tools/perf/util/dso.h
@@ -322,6 +322,7 @@ int dso__data_get_fd(struct dso *dso, struct machine *machine);
322void dso__data_put_fd(struct dso *dso); 322void dso__data_put_fd(struct dso *dso);
323void dso__data_close(struct dso *dso); 323void dso__data_close(struct dso *dso);
324 324
325int dso__data_file_size(struct dso *dso, struct machine *machine);
325off_t dso__data_size(struct dso *dso, struct machine *machine); 326off_t dso__data_size(struct dso *dso, struct machine *machine);
326ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine, 327ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
327 u64 offset, u8 *data, ssize_t size); 328 u64 offset, u8 *data, ssize_t size);
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index e90575192209..8c902276d4b4 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -34,6 +34,10 @@
34#include <linux/log2.h> 34#include <linux/log2.h>
35#include <linux/err.h> 35#include <linux/err.h>
36 36
37#ifdef LACKS_SIGQUEUE_PROTOTYPE
38int sigqueue(pid_t pid, int sig, const union sigval value);
39#endif
40
37#define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) 41#define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y))
38#define SID(e, x, y) xyarray__entry(e->sample_id, x, y) 42#define SID(e, x, y) xyarray__entry(e->sample_id, x, y)
39 43
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 1171d8400bf4..dec6d218c31c 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -2698,6 +2698,7 @@ int perf_header__fprintf_info(struct perf_session *session, FILE *fp, bool full)
2698 struct perf_header *header = &session->header; 2698 struct perf_header *header = &session->header;
2699 int fd = perf_data__fd(session->data); 2699 int fd = perf_data__fd(session->data);
2700 struct stat st; 2700 struct stat st;
2701 time_t stctime;
2701 int ret, bit; 2702 int ret, bit;
2702 2703
2703 hd.fp = fp; 2704 hd.fp = fp;
@@ -2707,7 +2708,8 @@ int perf_header__fprintf_info(struct perf_session *session, FILE *fp, bool full)
2707 if (ret == -1) 2708 if (ret == -1)
2708 return -1; 2709 return -1;
2709 2710
2710 fprintf(fp, "# captured on : %s", ctime(&st.st_ctime)); 2711 stctime = st.st_ctime;
2712 fprintf(fp, "# captured on : %s", ctime(&stctime));
2711 2713
2712 fprintf(fp, "# header version : %u\n", header->version); 2714 fprintf(fp, "# header version : %u\n", header->version);
2713 fprintf(fp, "# data offset : %" PRIu64 "\n", header->data_offset); 2715 fprintf(fp, "# data offset : %" PRIu64 "\n", header->data_offset);
diff --git a/tools/perf/util/s390-cpumsf.c b/tools/perf/util/s390-cpumsf.c
index a2eeebbfb25f..68b2570304ec 100644
--- a/tools/perf/util/s390-cpumsf.c
+++ b/tools/perf/util/s390-cpumsf.c
@@ -506,7 +506,7 @@ static int s390_cpumsf_samples(struct s390_cpumsf_queue *sfq, u64 *ts)
506 aux_ts = get_trailer_time(buf); 506 aux_ts = get_trailer_time(buf);
507 if (!aux_ts) { 507 if (!aux_ts) {
508 pr_err("[%#08" PRIx64 "] Invalid AUX trailer entry TOD clock base\n", 508 pr_err("[%#08" PRIx64 "] Invalid AUX trailer entry TOD clock base\n",
509 sfq->buffer->data_offset); 509 (s64)sfq->buffer->data_offset);
510 aux_ts = ~0ULL; 510 aux_ts = ~0ULL;
511 goto out; 511 goto out;
512 } 512 }
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index dcce74bae6de..01f2c7385e38 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -1537,17 +1537,6 @@ int dso__load(struct dso *dso, struct map *map)
1537 dso->adjust_symbols = 0; 1537 dso->adjust_symbols = 0;
1538 1538
1539 if (perfmap) { 1539 if (perfmap) {
1540 struct stat st;
1541
1542 if (lstat(map_path, &st) < 0)
1543 goto out;
1544
1545 if (!symbol_conf.force && st.st_uid && (st.st_uid != geteuid())) {
1546 pr_warning("File %s not owned by current user or root, "
1547 "ignoring it (use -f to override).\n", map_path);
1548 goto out;
1549 }
1550
1551 ret = dso__load_perf_map(map_path, dso); 1540 ret = dso__load_perf_map(map_path, dso);
1552 dso->symtab_type = ret > 0 ? DSO_BINARY_TYPE__JAVA_JIT : 1541 dso->symtab_type = ret > 0 ? DSO_BINARY_TYPE__JAVA_JIT :
1553 DSO_BINARY_TYPE__NOT_FOUND; 1542 DSO_BINARY_TYPE__NOT_FOUND;