Re: [PATCH 1/2] scripts: add generic syscalltbl.sh

From: Masahiro Yamada
Date: Sun Feb 21 2021 - 12:20:21 EST


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