Commit 1b700c99 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo
Browse files

perf tools: Build syscall table .c header from kernel's syscall_64.tbl

We used libaudit to map ids to syscall names and vice-versa, but that
imposes a delay in supporting new syscalls, having to wait for libaudit
to get those new syscalls on its tables.

To remove that delay, for x86_64 initially, grab a copy of
arch/x86/entry/syscalls/syscall_64.tbl and use it to generate those
tables.

Syscalls currently not available in audit-libs:

  # trace -e copy_file_range,membarrier,mlock2,pread64,pwrite64,timerfd_create,userfaultfd
  Error:	Invalid syscall copy_file_range, membarrier, mlock2, pread64, pwrite64, timerfd_create, userfaultfd
  Hint:	try 'perf list syscalls:sys_enter_*'
  Hint:	and: 'man syscalls'
  #

With this patch:

  # trace -e copy_file_range,membarrier,mlock2,pread64,pwrite64,timerfd_create,userfaultfd
    8505.733 ( 0.010 ms): gnome-shell/2519 timerfd_create(flags: 524288) = 36
    8506.688 ( 0.005 ms): gnome-shell/2519 timerfd_create(flags: 524288) = 40
   30023.097 ( 0.025 ms): qemu-system-x8/24629 pwrite64(fd: 18, buf: 0x7f63ae382000, count: 4096, pos: 529592320) = 4096
   31268.712 ( 0.028 ms): qemu-system-x8/24629 pwrite64(fd: 18, buf: 0x7f63afd8b000, count: 4096, pos: 2314133504) = 4096
   31268.854 ( 0.016 ms): qemu-system-x8/24629 pwrite64(fd: 18, buf: 0x7f63afda2000, count: 4096, pos: 2314137600) = 4096

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/n/tip-51xfjbxevdsucmnbc4ka5r88@git.kernel.org


[ Added make dep for 'prepare' in 'LIBPERF_IN', fix by Wang Nan to fix parallell build ]
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 5af56fab
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -183,6 +183,11 @@ endif
include config/Makefile
endif

ifeq ($(config),0)
include $(srctree)/tools/scripts/Makefile.arch
-include arch/$(ARCH)/Makefile
endif

# The FEATURE_DUMP_EXPORT holds location of the actual
# FEATURE_DUMP file to be used to bypass feature detection
# (for bpf or any other subproject)
@@ -388,7 +393,7 @@ endif
__build-dir = $(subst $(OUTPUT),,$(dir $@))
build-dir   = $(if $(__build-dir),$(__build-dir),.)

prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h fixdep
prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h fixdep archheaders

$(OUTPUT)%.o: %.c prepare FORCE
	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
@@ -428,7 +433,7 @@ $(patsubst perf-%,%.o,$(PROGRAMS)): $(wildcard */*.h)

LIBPERF_IN := $(OUTPUT)libperf-in.o

$(LIBPERF_IN): fixdep FORCE
$(LIBPERF_IN): prepare fixdep FORCE
	$(Q)$(MAKE) $(build)=libperf

$(LIB_FILE): $(LIBPERF_IN)
@@ -623,7 +628,7 @@ config-clean:
	$(call QUIET_CLEAN, config)
	$(Q)$(MAKE) -C $(srctree)/tools/build/feature/ $(if $(OUTPUT),OUTPUT=$(OUTPUT)feature/,) clean >/dev/null

clean: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean config-clean
clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean config-clean
	$(call QUIET_CLEAN, core-objs)  $(RM) $(LIB_FILE) $(OUTPUT)perf-archive $(OUTPUT)perf-with-kcore $(LANG_BINDINGS)
	$(Q)find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
	$(Q)$(RM) $(OUTPUT).config-detected
@@ -660,5 +665,5 @@ FORCE:
.PHONY: all install clean config-clean strip install-gtk
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
.PHONY: $(GIT-HEAD-PHONY) TAGS tags cscope FORCE prepare
.PHONY: libtraceevent_plugins
.PHONY: libtraceevent_plugins archheaders
+23 −0
Original line number Diff line number Diff line
@@ -4,3 +4,26 @@ endif
HAVE_KVM_STAT_SUPPORT := 1
PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1
PERF_HAVE_JITDUMP := 1

###
# Syscall table generation
#

out    := $(OUTPUT)arch/x86/include/generated/asm
header := $(out)/syscalls_64.c
sys    := $(srctree)/tools/perf/arch/x86/entry/syscalls
systbl := $(sys)/syscalltbl.sh

# Create output directory if not already present
_dummy := $(shell [ -d '$(out)' ] || mkdir -p '$(out)')

$(header): $(sys)/syscall_64.tbl $(systbl)
	@(test -d ../../kernel -a -d ../../tools -a -d ../perf && ( \
        (diff -B arch/x86/entry/syscalls/syscall_64.tbl ../../arch/x86/entry/syscalls/syscall_64.tbl >/dev/null) \
        || echo "Warning: x86_64's syscall_64.tbl differs from kernel" >&2 )) || true
	$(Q)$(SHELL) '$(systbl)' $(sys)/syscall_64.tbl 'x86_64' > $@

clean::
	rm -f $(header)

archheaders: $(header)
+374 −0
Original line number Diff line number Diff line
#
# 64-bit system call numbers and entry vectors
#
# The format is:
# <number> <abi> <name> <entry point>
#
# The abi is "common", "64" or "x32" for this file.
#
0	common	read			sys_read
1	common	write			sys_write
2	common	open			sys_open
3	common	close			sys_close
4	common	stat			sys_newstat
5	common	fstat			sys_newfstat
6	common	lstat			sys_newlstat
7	common	poll			sys_poll
8	common	lseek			sys_lseek
9	common	mmap			sys_mmap
10	common	mprotect		sys_mprotect
11	common	munmap			sys_munmap
12	common	brk			sys_brk
13	64	rt_sigaction		sys_rt_sigaction
14	common	rt_sigprocmask		sys_rt_sigprocmask
15	64	rt_sigreturn		sys_rt_sigreturn/ptregs
16	64	ioctl			sys_ioctl
17	common	pread64			sys_pread64
18	common	pwrite64		sys_pwrite64
19	64	readv			sys_readv
20	64	writev			sys_writev
21	common	access			sys_access
22	common	pipe			sys_pipe
23	common	select			sys_select
24	common	sched_yield		sys_sched_yield
25	common	mremap			sys_mremap
26	common	msync			sys_msync
27	common	mincore			sys_mincore
28	common	madvise			sys_madvise
29	common	shmget			sys_shmget
30	common	shmat			sys_shmat
31	common	shmctl			sys_shmctl
32	common	dup			sys_dup
33	common	dup2			sys_dup2
34	common	pause			sys_pause
35	common	nanosleep		sys_nanosleep
36	common	getitimer		sys_getitimer
37	common	alarm			sys_alarm
38	common	setitimer		sys_setitimer
39	common	getpid			sys_getpid
40	common	sendfile		sys_sendfile64
41	common	socket			sys_socket
42	common	connect			sys_connect
43	common	accept			sys_accept
44	common	sendto			sys_sendto
45	64	recvfrom		sys_recvfrom
46	64	sendmsg			sys_sendmsg
47	64	recvmsg			sys_recvmsg
48	common	shutdown		sys_shutdown
49	common	bind			sys_bind
50	common	listen			sys_listen
51	common	getsockname		sys_getsockname
52	common	getpeername		sys_getpeername
53	common	socketpair		sys_socketpair
54	64	setsockopt		sys_setsockopt
55	64	getsockopt		sys_getsockopt
56	common	clone			sys_clone/ptregs
57	common	fork			sys_fork/ptregs
58	common	vfork			sys_vfork/ptregs
59	64	execve			sys_execve/ptregs
60	common	exit			sys_exit
61	common	wait4			sys_wait4
62	common	kill			sys_kill
63	common	uname			sys_newuname
64	common	semget			sys_semget
65	common	semop			sys_semop
66	common	semctl			sys_semctl
67	common	shmdt			sys_shmdt
68	common	msgget			sys_msgget
69	common	msgsnd			sys_msgsnd
70	common	msgrcv			sys_msgrcv
71	common	msgctl			sys_msgctl
72	common	fcntl			sys_fcntl
73	common	flock			sys_flock
74	common	fsync			sys_fsync
75	common	fdatasync		sys_fdatasync
76	common	truncate		sys_truncate
77	common	ftruncate		sys_ftruncate
78	common	getdents		sys_getdents
79	common	getcwd			sys_getcwd
80	common	chdir			sys_chdir
81	common	fchdir			sys_fchdir
82	common	rename			sys_rename
83	common	mkdir			sys_mkdir
84	common	rmdir			sys_rmdir
85	common	creat			sys_creat
86	common	link			sys_link
87	common	unlink			sys_unlink
88	common	symlink			sys_symlink
89	common	readlink		sys_readlink
90	common	chmod			sys_chmod
91	common	fchmod			sys_fchmod
92	common	chown			sys_chown
93	common	fchown			sys_fchown
94	common	lchown			sys_lchown
95	common	umask			sys_umask
96	common	gettimeofday		sys_gettimeofday
97	common	getrlimit		sys_getrlimit
98	common	getrusage		sys_getrusage
99	common	sysinfo			sys_sysinfo
100	common	times			sys_times
101	64	ptrace			sys_ptrace
102	common	getuid			sys_getuid
103	common	syslog			sys_syslog
104	common	getgid			sys_getgid
105	common	setuid			sys_setuid
106	common	setgid			sys_setgid
107	common	geteuid			sys_geteuid
108	common	getegid			sys_getegid
109	common	setpgid			sys_setpgid
110	common	getppid			sys_getppid
111	common	getpgrp			sys_getpgrp
112	common	setsid			sys_setsid
113	common	setreuid		sys_setreuid
114	common	setregid		sys_setregid
115	common	getgroups		sys_getgroups
116	common	setgroups		sys_setgroups
117	common	setresuid		sys_setresuid
118	common	getresuid		sys_getresuid
119	common	setresgid		sys_setresgid
120	common	getresgid		sys_getresgid
121	common	getpgid			sys_getpgid
122	common	setfsuid		sys_setfsuid
123	common	setfsgid		sys_setfsgid
124	common	getsid			sys_getsid
125	common	capget			sys_capget
126	common	capset			sys_capset
127	64	rt_sigpending		sys_rt_sigpending
128	64	rt_sigtimedwait		sys_rt_sigtimedwait
129	64	rt_sigqueueinfo		sys_rt_sigqueueinfo
130	common	rt_sigsuspend		sys_rt_sigsuspend
131	64	sigaltstack		sys_sigaltstack
132	common	utime			sys_utime
133	common	mknod			sys_mknod
134	64	uselib
135	common	personality		sys_personality
136	common	ustat			sys_ustat
137	common	statfs			sys_statfs
138	common	fstatfs			sys_fstatfs
139	common	sysfs			sys_sysfs
140	common	getpriority		sys_getpriority
141	common	setpriority		sys_setpriority
142	common	sched_setparam		sys_sched_setparam
143	common	sched_getparam		sys_sched_getparam
144	common	sched_setscheduler	sys_sched_setscheduler
145	common	sched_getscheduler	sys_sched_getscheduler
146	common	sched_get_priority_max	sys_sched_get_priority_max
147	common	sched_get_priority_min	sys_sched_get_priority_min
148	common	sched_rr_get_interval	sys_sched_rr_get_interval
149	common	mlock			sys_mlock
150	common	munlock			sys_munlock
151	common	mlockall		sys_mlockall
152	common	munlockall		sys_munlockall
153	common	vhangup			sys_vhangup
154	common	modify_ldt		sys_modify_ldt
155	common	pivot_root		sys_pivot_root
156	64	_sysctl			sys_sysctl
157	common	prctl			sys_prctl
158	common	arch_prctl		sys_arch_prctl
159	common	adjtimex		sys_adjtimex
160	common	setrlimit		sys_setrlimit
161	common	chroot			sys_chroot
162	common	sync			sys_sync
163	common	acct			sys_acct
164	common	settimeofday		sys_settimeofday
165	common	mount			sys_mount
166	common	umount2			sys_umount
167	common	swapon			sys_swapon
168	common	swapoff			sys_swapoff
169	common	reboot			sys_reboot
170	common	sethostname		sys_sethostname
171	common	setdomainname		sys_setdomainname
172	common	iopl			sys_iopl/ptregs
173	common	ioperm			sys_ioperm
174	64	create_module
175	common	init_module		sys_init_module
176	common	delete_module		sys_delete_module
177	64	get_kernel_syms
178	64	query_module
179	common	quotactl		sys_quotactl
180	64	nfsservctl
181	common	getpmsg
182	common	putpmsg
183	common	afs_syscall
184	common	tuxcall
185	common	security
186	common	gettid			sys_gettid
187	common	readahead		sys_readahead
188	common	setxattr		sys_setxattr
189	common	lsetxattr		sys_lsetxattr
190	common	fsetxattr		sys_fsetxattr
191	common	getxattr		sys_getxattr
192	common	lgetxattr		sys_lgetxattr
193	common	fgetxattr		sys_fgetxattr
194	common	listxattr		sys_listxattr
195	common	llistxattr		sys_llistxattr
196	common	flistxattr		sys_flistxattr
197	common	removexattr		sys_removexattr
198	common	lremovexattr		sys_lremovexattr
199	common	fremovexattr		sys_fremovexattr
200	common	tkill			sys_tkill
201	common	time			sys_time
202	common	futex			sys_futex
203	common	sched_setaffinity	sys_sched_setaffinity
204	common	sched_getaffinity	sys_sched_getaffinity
205	64	set_thread_area
206	64	io_setup		sys_io_setup
207	common	io_destroy		sys_io_destroy
208	common	io_getevents		sys_io_getevents
209	64	io_submit		sys_io_submit
210	common	io_cancel		sys_io_cancel
211	64	get_thread_area
212	common	lookup_dcookie		sys_lookup_dcookie
213	common	epoll_create		sys_epoll_create
214	64	epoll_ctl_old
215	64	epoll_wait_old
216	common	remap_file_pages	sys_remap_file_pages
217	common	getdents64		sys_getdents64
218	common	set_tid_address		sys_set_tid_address
219	common	restart_syscall		sys_restart_syscall
220	common	semtimedop		sys_semtimedop
221	common	fadvise64		sys_fadvise64
222	64	timer_create		sys_timer_create
223	common	timer_settime		sys_timer_settime
224	common	timer_gettime		sys_timer_gettime
225	common	timer_getoverrun	sys_timer_getoverrun
226	common	timer_delete		sys_timer_delete
227	common	clock_settime		sys_clock_settime
228	common	clock_gettime		sys_clock_gettime
229	common	clock_getres		sys_clock_getres
230	common	clock_nanosleep		sys_clock_nanosleep
231	common	exit_group		sys_exit_group
232	common	epoll_wait		sys_epoll_wait
233	common	epoll_ctl		sys_epoll_ctl
234	common	tgkill			sys_tgkill
235	common	utimes			sys_utimes
236	64	vserver
237	common	mbind			sys_mbind
238	common	set_mempolicy		sys_set_mempolicy
239	common	get_mempolicy		sys_get_mempolicy
240	common	mq_open			sys_mq_open
241	common	mq_unlink		sys_mq_unlink
242	common	mq_timedsend		sys_mq_timedsend
243	common	mq_timedreceive		sys_mq_timedreceive
244	64	mq_notify		sys_mq_notify
245	common	mq_getsetattr		sys_mq_getsetattr
246	64	kexec_load		sys_kexec_load
247	64	waitid			sys_waitid
248	common	add_key			sys_add_key
249	common	request_key		sys_request_key
250	common	keyctl			sys_keyctl
251	common	ioprio_set		sys_ioprio_set
252	common	ioprio_get		sys_ioprio_get
253	common	inotify_init		sys_inotify_init
254	common	inotify_add_watch	sys_inotify_add_watch
255	common	inotify_rm_watch	sys_inotify_rm_watch
256	common	migrate_pages		sys_migrate_pages
257	common	openat			sys_openat
258	common	mkdirat			sys_mkdirat
259	common	mknodat			sys_mknodat
260	common	fchownat		sys_fchownat
261	common	futimesat		sys_futimesat
262	common	newfstatat		sys_newfstatat
263	common	unlinkat		sys_unlinkat
264	common	renameat		sys_renameat
265	common	linkat			sys_linkat
266	common	symlinkat		sys_symlinkat
267	common	readlinkat		sys_readlinkat
268	common	fchmodat		sys_fchmodat
269	common	faccessat		sys_faccessat
270	common	pselect6		sys_pselect6
271	common	ppoll			sys_ppoll
272	common	unshare			sys_unshare
273	64	set_robust_list		sys_set_robust_list
274	64	get_robust_list		sys_get_robust_list
275	common	splice			sys_splice
276	common	tee			sys_tee
277	common	sync_file_range		sys_sync_file_range
278	64	vmsplice		sys_vmsplice
279	64	move_pages		sys_move_pages
280	common	utimensat		sys_utimensat
281	common	epoll_pwait		sys_epoll_pwait
282	common	signalfd		sys_signalfd
283	common	timerfd_create		sys_timerfd_create
284	common	eventfd			sys_eventfd
285	common	fallocate		sys_fallocate
286	common	timerfd_settime		sys_timerfd_settime
287	common	timerfd_gettime		sys_timerfd_gettime
288	common	accept4			sys_accept4
289	common	signalfd4		sys_signalfd4
290	common	eventfd2		sys_eventfd2
291	common	epoll_create1		sys_epoll_create1
292	common	dup3			sys_dup3
293	common	pipe2			sys_pipe2
294	common	inotify_init1		sys_inotify_init1
295	64	preadv			sys_preadv
296	64	pwritev			sys_pwritev
297	64	rt_tgsigqueueinfo	sys_rt_tgsigqueueinfo
298	common	perf_event_open		sys_perf_event_open
299	64	recvmmsg		sys_recvmmsg
300	common	fanotify_init		sys_fanotify_init
301	common	fanotify_mark		sys_fanotify_mark
302	common	prlimit64		sys_prlimit64
303	common	name_to_handle_at	sys_name_to_handle_at
304	common	open_by_handle_at	sys_open_by_handle_at
305	common	clock_adjtime		sys_clock_adjtime
306	common	syncfs			sys_syncfs
307	64	sendmmsg		sys_sendmmsg
308	common	setns			sys_setns
309	common	getcpu			sys_getcpu
310	64	process_vm_readv	sys_process_vm_readv
311	64	process_vm_writev	sys_process_vm_writev
312	common	kcmp			sys_kcmp
313	common	finit_module		sys_finit_module
314	common	sched_setattr		sys_sched_setattr
315	common	sched_getattr		sys_sched_getattr
316	common	renameat2		sys_renameat2
317	common	seccomp			sys_seccomp
318	common	getrandom		sys_getrandom
319	common	memfd_create		sys_memfd_create
320	common	kexec_file_load		sys_kexec_file_load
321	common	bpf			sys_bpf
322	64	execveat		sys_execveat/ptregs
323	common	userfaultfd		sys_userfaultfd
324	common	membarrier		sys_membarrier
325	common	mlock2			sys_mlock2
326	common	copy_file_range		sys_copy_file_range

#
# x32-specific system call numbers start at 512 to avoid cache impact
# for native 64-bit operation.
#
512	x32	rt_sigaction		compat_sys_rt_sigaction
513	x32	rt_sigreturn		sys32_x32_rt_sigreturn
514	x32	ioctl			compat_sys_ioctl
515	x32	readv			compat_sys_readv
516	x32	writev			compat_sys_writev
517	x32	recvfrom		compat_sys_recvfrom
518	x32	sendmsg			compat_sys_sendmsg
519	x32	recvmsg			compat_sys_recvmsg
520	x32	execve			compat_sys_execve/ptregs
521	x32	ptrace			compat_sys_ptrace
522	x32	rt_sigpending		compat_sys_rt_sigpending
523	x32	rt_sigtimedwait		compat_sys_rt_sigtimedwait
524	x32	rt_sigqueueinfo		compat_sys_rt_sigqueueinfo
525	x32	sigaltstack		compat_sys_sigaltstack
526	x32	timer_create		compat_sys_timer_create
527	x32	mq_notify		compat_sys_mq_notify
528	x32	kexec_load		compat_sys_kexec_load
529	x32	waitid			compat_sys_waitid
530	x32	set_robust_list		compat_sys_set_robust_list
531	x32	get_robust_list		compat_sys_get_robust_list
532	x32	vmsplice		compat_sys_vmsplice
533	x32	move_pages		compat_sys_move_pages
534	x32	preadv			compat_sys_preadv64
535	x32	pwritev			compat_sys_pwritev64
536	x32	rt_tgsigqueueinfo	compat_sys_rt_tgsigqueueinfo
537	x32	recvmmsg		compat_sys_recvmmsg
538	x32	sendmmsg		compat_sys_sendmmsg
539	x32	process_vm_readv	compat_sys_process_vm_readv
540	x32	process_vm_writev	compat_sys_process_vm_writev
541	x32	setsockopt		compat_sys_setsockopt
542	x32	getsockopt		compat_sys_getsockopt
543	x32	io_setup		compat_sys_io_setup
544	x32	io_submit		compat_sys_io_submit
545	x32	execveat		compat_sys_execveat/ptregs
+39 −0
Original line number Diff line number Diff line
#!/bin/sh

in="$1"
arch="$2"

syscall_macro() {
    nr="$1"
    name="$2"

    echo "	[$nr] = \"$name\","
}

emit() {
    nr="$1"
    entry="$2"

    syscall_macro "$nr" "$entry"
}

echo "static const char *syscalltbl_${arch}[] = {"

sorted_table=$(mktemp /tmp/syscalltbl.XXXXXX)
grep '^[0-9]' "$in" | sort -n > $sorted_table

max_nr=0
while read nr abi name entry compat; do
    if [ $nr -ge 512 ] ; then # discard compat sycalls
        break
    fi

    emit "$nr" "$name"
    max_nr=$nr
done < $sorted_table

rm -f $sorted_table

echo "};"

echo "#define SYSCALLTBL_${arch}_MAX_ID ${max_nr}"
+1 −1
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ NO_PERF_REGS := 1
ifeq ($(ARCH),x86)
  $(call detected,CONFIG_X86)
  ifeq (${IS_64_BIT}, 1)
    CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT
    CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT -DHAVE_SYSCALL_TABLE -I$(OUTPUT)arch/x86/include/generated
    ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S
    LIBUNWIND_LIBS = -lunwind -lunwind-x86_64
    $(call detected,CONFIG_X86_64)
Loading