On Tue, Feb 16, 2021 at 11:04 AM Masahiro Yamada <masahiroy@xxxxxxxxxx> wrote: > > Most of architectures generate syscall headers at the compile time > in a similar way. > > The syscall table has the same format for all architectures. Each line > has up to 5 fields; syscall number, ABI, syscall name, native entry > point, and compat entry point. The syscall table is processed by > syscalltbl.sh script into header files. > > Despite the same pattern, scripts are maintained per architecture, > which results in code duplication and bad maintainability. > > As of v5.11-rc1, 12 architectures duplicate similar shell scripts: > > $ find arch -name syscalltbl.sh | sort > arch/alpha/kernel/syscalls/syscalltbl.sh > arch/arm/tools/syscalltbl.sh > arch/ia64/kernel/syscalls/syscalltbl.sh > arch/m68k/kernel/syscalls/syscalltbl.sh > arch/microblaze/kernel/syscalls/syscalltbl.sh > arch/mips/kernel/syscalls/syscalltbl.sh > arch/parisc/kernel/syscalls/syscalltbl.sh > arch/powerpc/kernel/syscalls/syscalltbl.sh > arch/sh/kernel/syscalls/syscalltbl.sh > arch/sparc/kernel/syscalls/syscalltbl.sh > arch/x86/entry/syscalls/syscalltbl.sh > arch/xtensa/kernel/syscalls/syscalltbl.sh > > My goal is to unify them into scripts/syscalltbl.sh. > > __SYSCALL_WITH_COMPAT should be defined as follows: > > 32-bit kernel: > #define __SYSCALL_WITH_COMPAT(nr, native, compat) __SYSCALL(nr, native) > > 64-bit kernel: > > #define __SYSCALL_WITH_COMPAT(nr, native, compat) __SYSCALL(nr, compat) > > Signed-off-by: Masahiro Yamada <masahiroy@xxxxxxxxxx> > --- > Both applied to linux-kbuild. > scripts/syscalltbl.sh | 73 +++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 73 insertions(+) > create mode 100755 scripts/syscalltbl.sh > > diff --git a/scripts/syscalltbl.sh b/scripts/syscalltbl.sh > new file mode 100755 > index 000000000000..aa6ab156301c > --- /dev/null > +++ b/scripts/syscalltbl.sh > @@ -0,0 +1,73 @@ > +#!/bin/sh > +# SPDX-License-Identifier: GPL-2.0-only > +# > +# Generate a syscall table header. > +# > +# Each line of the syscall table should have the following format: > +# > +# NR ABI NAME [NATIVE] [COMPAT] > +# > +# NR syscall number > +# ABI ABI name > +# NAME syscall name > +# NATIVE native entry point (optional) > +# COMPAT compat entry point (optional) > + > +set -e > + > +usage() { > + echo >&2 "usage: $0 [--abis ABIS] INFILE OUTFILE" >&2 > + echo >&2 > + echo >&2 " INFILE input syscall table" > + echo >&2 " OUTFILE output header file" > + echo >&2 > + echo >&2 "options:" > + echo >&2 " --abis ABIS ABI(s) to handle (By default, all lines are handled)" > + exit 1 > +} > + > +# default unless specified by options > +abis= > + > +while [ $# -gt 0 ] > +do > + case $1 in > + --abis) > + abis=$(echo "($2)" | tr ',' '|') > + shift 2;; > + -*) > + echo "$1: unknown option" >&2 > + usage;; > + *) > + break;; > + esac > +done > + > +if [ $# -ne 2 ]; then > + usage > +fi > + > +infile="$1" > +outfile="$2" > + > +nxt=0 > + > +grep -E "^[0-9]+[[:space:]]+$abis" "$infile" | sort -n | { > + > + while read nr abi name native compat ; do > + > + while [ $nxt -lt $nr ]; do > + echo "__SYSCALL($nxt, sys_ni_syscall)" > + nxt=$((nxt + 1)) > + done > + > + if [ -n "$compat" ]; then > + echo "__SYSCALL_WITH_COMPAT($nr, $native, $compat)" > + elif [ -n "$native" ]; then > + echo "__SYSCALL($nr, $native)" > + else > + echo "__SYSCALL($nr, sys_ni_syscall)" > + fi > + nxt=$((nr + 1)) > + done > +} > "$outfile" > -- > 2.27.0 > -- Best Regards Masahiro Yamada