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# checksyscalls.sh gcc gcc-options 10# 11 12ignore_list() { 13cat << EOF 14#include <asm/types.h> 15#include <asm/unistd.h> 16 17/* *at */ 18#define __IGNORE_open /* openat */ 19#define __IGNORE_link /* linkat */ 20#define __IGNORE_unlink /* unlinkat */ 21#define __IGNORE_mknod /* mknodat */ 22#define __IGNORE_chmod /* fchmodat */ 23#define __IGNORE_chown /* fchownat */ 24#define __IGNORE_mkdir /* mkdirat */ 25#define __IGNORE_rmdir /* unlinkat */ 26#define __IGNORE_lchown /* fchownat */ 27#define __IGNORE_access /* faccessat */ 28#define __IGNORE_rename /* renameat2 */ 29#define __IGNORE_readlink /* readlinkat */ 30#define __IGNORE_symlink /* symlinkat */ 31#define __IGNORE_utimes /* futimesat */ 32#if BITS_PER_LONG == 64 33#define __IGNORE_stat /* fstatat */ 34#define __IGNORE_lstat /* fstatat */ 35#else 36#define __IGNORE_stat64 /* fstatat64 */ 37#define __IGNORE_lstat64 /* fstatat64 */ 38#endif 39 40/* Missing flags argument */ 41#define __IGNORE_renameat /* renameat2 */ 42 43/* CLOEXEC flag */ 44#define __IGNORE_pipe /* pipe2 */ 45#define __IGNORE_dup2 /* dup3 */ 46#define __IGNORE_epoll_create /* epoll_create1 */ 47#define __IGNORE_inotify_init /* inotify_init1 */ 48#define __IGNORE_eventfd /* eventfd2 */ 49#define __IGNORE_signalfd /* signalfd4 */ 50 51/* MMU */ 52#ifndef CONFIG_MMU 53#define __IGNORE_madvise 54#define __IGNORE_mbind 55#define __IGNORE_mincore 56#define __IGNORE_mlock 57#define __IGNORE_mlockall 58#define __IGNORE_munlock 59#define __IGNORE_munlockall 60#define __IGNORE_mprotect 61#define __IGNORE_msync 62#define __IGNORE_migrate_pages 63#define __IGNORE_move_pages 64#define __IGNORE_remap_file_pages 65#define __IGNORE_get_mempolicy 66#define __IGNORE_set_mempolicy 67#define __IGNORE_swapoff 68#define __IGNORE_swapon 69#endif 70 71/* System calls for 32-bit kernels only */ 72#if BITS_PER_LONG == 64 73#define __IGNORE_sendfile64 74#define __IGNORE_ftruncate64 75#define __IGNORE_truncate64 76#define __IGNORE_stat64 77#define __IGNORE_lstat64 78#define __IGNORE_fstat64 79#define __IGNORE_fcntl64 80#define __IGNORE_fadvise64_64 81#define __IGNORE_fstatat64 82#define __IGNORE_fstatfs64 83#define __IGNORE_statfs64 84#define __IGNORE_llseek 85#define __IGNORE_mmap2 86#else 87#define __IGNORE_sendfile 88#define __IGNORE_ftruncate 89#define __IGNORE_truncate 90#define __IGNORE_stat 91#define __IGNORE_lstat 92#define __IGNORE_fstat 93#define __IGNORE_fcntl 94#define __IGNORE_fadvise64 95#define __IGNORE_newfstatat 96#define __IGNORE_fstatfs 97#define __IGNORE_statfs 98#define __IGNORE_lseek 99#define __IGNORE_mmap 100#endif 101 102/* i386-specific or historical system calls */ 103#define __IGNORE_break 104#define __IGNORE_stty 105#define __IGNORE_gtty 106#define __IGNORE_ftime 107#define __IGNORE_prof 108#define __IGNORE_lock 109#define __IGNORE_mpx 110#define __IGNORE_ulimit 111#define __IGNORE_profil 112#define __IGNORE_ioperm 113#define __IGNORE_iopl 114#define __IGNORE_idle 115#define __IGNORE_modify_ldt 116#define __IGNORE_ugetrlimit 117#define __IGNORE_vm86 118#define __IGNORE_vm86old 119#define __IGNORE_set_thread_area 120#define __IGNORE_get_thread_area 121#define __IGNORE_madvise1 122#define __IGNORE_oldstat 123#define __IGNORE_oldfstat 124#define __IGNORE_oldlstat 125#define __IGNORE_oldolduname 126#define __IGNORE_olduname 127#define __IGNORE_umount 128#define __IGNORE_waitpid 129#define __IGNORE_stime 130#define __IGNORE_nice 131#define __IGNORE_signal 132#define __IGNORE_sigaction 133#define __IGNORE_sgetmask 134#define __IGNORE_sigsuspend 135#define __IGNORE_sigpending 136#define __IGNORE_ssetmask 137#define __IGNORE_readdir 138#define __IGNORE_socketcall 139#define __IGNORE_ipc 140#define __IGNORE_sigreturn 141#define __IGNORE_sigprocmask 142#define __IGNORE_bdflush 143#define __IGNORE__llseek 144#define __IGNORE__newselect 145#define __IGNORE_create_module 146#define __IGNORE_query_module 147#define __IGNORE_get_kernel_syms 148#define __IGNORE_sysfs 149#define __IGNORE_uselib 150#define __IGNORE__sysctl 151#define __IGNORE_arch_prctl 152 153/* ... including the "new" 32-bit uid syscalls */ 154#define __IGNORE_lchown32 155#define __IGNORE_getuid32 156#define __IGNORE_getgid32 157#define __IGNORE_geteuid32 158#define __IGNORE_getegid32 159#define __IGNORE_setreuid32 160#define __IGNORE_setregid32 161#define __IGNORE_getgroups32 162#define __IGNORE_setgroups32 163#define __IGNORE_fchown32 164#define __IGNORE_setresuid32 165#define __IGNORE_getresuid32 166#define __IGNORE_setresgid32 167#define __IGNORE_getresgid32 168#define __IGNORE_chown32 169#define __IGNORE_setuid32 170#define __IGNORE_setgid32 171#define __IGNORE_setfsuid32 172#define __IGNORE_setfsgid32 173 174/* these can be expressed using other calls */ 175#define __IGNORE_alarm /* setitimer */ 176#define __IGNORE_creat /* open */ 177#define __IGNORE_fork /* clone */ 178#define __IGNORE_futimesat /* utimensat */ 179#define __IGNORE_getpgrp /* getpgid */ 180#define __IGNORE_getdents /* getdents64 */ 181#define __IGNORE_pause /* sigsuspend */ 182#define __IGNORE_poll /* ppoll */ 183#define __IGNORE_select /* pselect6 */ 184#define __IGNORE_epoll_wait /* epoll_pwait */ 185#define __IGNORE_time /* gettimeofday */ 186#define __IGNORE_uname /* newuname */ 187#define __IGNORE_ustat /* statfs */ 188#define __IGNORE_utime /* utimes */ 189#define __IGNORE_vfork /* clone */ 190 191/* sync_file_range had a stupid ABI. Allow sync_file_range2 instead */ 192#ifdef __NR_sync_file_range2 193#define __IGNORE_sync_file_range 194#endif 195 196/* Unmerged syscalls for AFS, STREAMS, etc. */ 197#define __IGNORE_afs_syscall 198#define __IGNORE_getpmsg 199#define __IGNORE_putpmsg 200#define __IGNORE_vserver 201EOF 202} 203 204syscall_list() { 205 grep '^[0-9]' "$1" | sort -n | 206 while read nr abi name entry ; do 207 echo "#if !defined(__NR_${name}) && !defined(__IGNORE_${name})" 208 echo "#warning syscall ${name} not implemented" 209 echo "#endif" 210 done 211} 212 213(ignore_list && syscall_list $(dirname $0)/../arch/x86/entry/syscalls/syscall_32.tbl) | \ 214$* -E -x c - > /dev/null 215