Commit c53aeca059c4d2108335810fba6ba89ab6a944dd
1 parent
ded2e1640f
Exists in
master
and in
7 other branches
kbuild: complain about missing system calls
Most system calls seems to get added to i386 first. This patch automatically generates a warning for any new system call which is implemented on i386 but not the architecture currently being compiled. On PowerPC at the moment, for example, it results in these warnings: init/missing_syscalls.h:935:3: warning: #warning syscall sync_file_range not implemented init/missing_syscalls.h:947:3: warning: #warning syscall getcpu not implemented init/missing_syscalls.h:950:3: warning: #warning syscall epoll_pwait not implemented The file scripts/checksyscalls.sh list a number of legacy system calls that are ignored because they only makes sense on i386 systems. Other contributors to this patch are Russell King <rmk+lkml@arm.linux.org.uk> and Stéphane Jourdois <kwisatz@rubis.org> Signed-off-by: David Woodhouse <dwmw2@infradead.org> Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Showing 3 changed files with 130 additions and 0 deletions Side-by-side Diff
Kbuild
... | ... | @@ -2,6 +2,7 @@ |
2 | 2 | # Kbuild for top-level directory of the kernel |
3 | 3 | # This file takes care of the following: |
4 | 4 | # 1) Generate asm-offsets.h |
5 | +# 2) Check for missing system calls | |
5 | 6 | |
6 | 7 | ##### |
7 | 8 | # 1) Generate asm-offsets.h |
... | ... | @@ -45,4 +46,15 @@ |
45 | 46 | $(obj)/$(offsets-file): arch/$(ARCH)/kernel/asm-offsets.s Kbuild |
46 | 47 | $(Q)mkdir -p $(dir $@) |
47 | 48 | $(call cmd,offsets) |
49 | + | |
50 | +##### | |
51 | +# 2) Check for missing system calls | |
52 | +# | |
53 | + | |
54 | +quiet_cmd_syscalls = CALL $< | |
55 | + cmd_syscalls = $(CONFIG_SHELL) $< $(CC) $(c_flags) | |
56 | + | |
57 | +PHONY += missing-syscalls | |
58 | +missing-syscalls: scripts/checksyscalls.sh FORCE | |
59 | + $(call cmd,syscalls) |
Makefile
scripts/checksyscalls.sh
1 | +#!/bin/sh | |
2 | +# | |
3 | +# Check if current architecture are missing any function calls compared | |
4 | +# to i386. | |
5 | +# i386 define a number of legacy system calls that are i386 specific | |
6 | +# and listed below so they are ignored. | |
7 | +# | |
8 | +# Usage: | |
9 | +# syscallchk gcc gcc-options | |
10 | +# | |
11 | + | |
12 | +ignore_list() { | |
13 | +cat << EOF | |
14 | +#include <asm/types.h> | |
15 | +#include <asm/unistd.h> | |
16 | + | |
17 | +/* System calls for 32-bit kernels only */ | |
18 | +#if BITS_PER_LONG == 64 | |
19 | +#define __IGNORE_sendfile64 | |
20 | +#define __IGNORE_ftruncate64 | |
21 | +#define __IGNORE_truncate64 | |
22 | +#define __IGNORE_stat64 | |
23 | +#define __IGNORE_lstat64 | |
24 | +#define __IGNORE_fstat64 | |
25 | +#define __IGNORE_fcntl64 | |
26 | +#define __IGNORE_fadvise64_64 | |
27 | +#define __IGNORE_fstatat64 | |
28 | +#define __IGNORE_fstatfs64 | |
29 | +#define __IGNORE_statfs64 | |
30 | +#endif | |
31 | + | |
32 | +/* i386-specific or historical system calls */ | |
33 | +#define __IGNORE_break | |
34 | +#define __IGNORE_stty | |
35 | +#define __IGNORE_gtty | |
36 | +#define __IGNORE_ftime | |
37 | +#define __IGNORE_prof | |
38 | +#define __IGNORE_lock | |
39 | +#define __IGNORE_mpx | |
40 | +#define __IGNORE_ulimit | |
41 | +#define __IGNORE_profil | |
42 | +#define __IGNORE_ioperm | |
43 | +#define __IGNORE_iopl | |
44 | +#define __IGNORE_idle | |
45 | +#define __IGNORE_modify_ldt | |
46 | +#define __IGNORE_ugetrlimit | |
47 | +#define __IGNORE_mmap2 | |
48 | +#define __IGNORE_vm86 | |
49 | +#define __IGNORE_vm86old | |
50 | +#define __IGNORE_set_thread_area | |
51 | +#define __IGNORE_get_thread_area | |
52 | +#define __IGNORE_madvise1 | |
53 | +#define __IGNORE_oldstat | |
54 | +#define __IGNORE_oldfstat | |
55 | +#define __IGNORE_oldlstat | |
56 | +#define __IGNORE_oldolduname | |
57 | +#define __IGNORE_olduname | |
58 | +#define __IGNORE_umount2 | |
59 | +#define __IGNORE_umount | |
60 | +#define __IGNORE_waitpid | |
61 | +#define __IGNORE_stime | |
62 | +#define __IGNORE_nice | |
63 | +#define __IGNORE_signal | |
64 | +#define __IGNORE_sigaction | |
65 | +#define __IGNORE_sgetmask | |
66 | +#define __IGNORE_sigsuspend | |
67 | +#define __IGNORE_sigpending | |
68 | +#define __IGNORE_ssetmask | |
69 | +#define __IGNORE_readdir | |
70 | +#define __IGNORE_socketcall | |
71 | +#define __IGNORE_ipc | |
72 | +#define __IGNORE_sigreturn | |
73 | +#define __IGNORE_sigprocmask | |
74 | +#define __IGNORE_bdflush | |
75 | +#define __IGNORE__llseek | |
76 | +#define __IGNORE__newselect | |
77 | +#define __IGNORE_create_module | |
78 | +#define __IGNORE_delete_module | |
79 | +#define __IGNORE_query_module | |
80 | +#define __IGNORE_get_kernel_syms | |
81 | +/* ... including the "new" 32-bit uid syscalls */ | |
82 | +#define __IGNORE_lchown32 | |
83 | +#define __IGNORE_getuid32 | |
84 | +#define __IGNORE_getgid32 | |
85 | +#define __IGNORE_geteuid32 | |
86 | +#define __IGNORE_getegid32 | |
87 | +#define __IGNORE_setreuid32 | |
88 | +#define __IGNORE_setregid32 | |
89 | +#define __IGNORE_getgroups32 | |
90 | +#define __IGNORE_setgroups32 | |
91 | +#define __IGNORE_fchown32 | |
92 | +#define __IGNORE_setresuid32 | |
93 | +#define __IGNORE_getresuid32 | |
94 | +#define __IGNORE_setresgid32 | |
95 | +#define __IGNORE_getresgid32 | |
96 | +#define __IGNORE_chown32 | |
97 | +#define __IGNORE_setuid32 | |
98 | +#define __IGNORE_setgid32 | |
99 | +#define __IGNORE_setfsuid32 | |
100 | +#define __IGNORE_setfsgid32 | |
101 | + | |
102 | +/* Unmerged syscalls for AFS, STREAMS, etc. */ | |
103 | +#define __IGNORE_afs_syscall | |
104 | +#define __IGNORE_getpmsg | |
105 | +#define __IGNORE_putpmsg | |
106 | +#define __IGNORE_vserver | |
107 | +EOF | |
108 | +} | |
109 | + | |
110 | +syscall_list() { | |
111 | +sed -n -e '/^\#define/ { s/[^_]*__NR_\([^[:space:]]*\).*/\ | |
112 | +\#if !defined \(__NR_\1\) \&\& !defined \(__IGNORE_\1\)\ | |
113 | +\#warning syscall \1 not implemented\ | |
114 | +\#endif/p }' $1 | |
115 | +} | |
116 | + | |
117 | +(ignore_list && syscall_list ${srctree}/include/asm-i386/unistd.h) | \ | |
118 | +$* -E -x c - > /dev/null |