diff options
author | Masahiro Yamada <masahiroy@kernel.org> | 2021-02-16 11:04:12 +0900 |
---|---|---|
committer | Masahiro Yamada <masahiroy@kernel.org> | 2021-02-22 08:22:04 +0900 |
commit | b9da928abf45c8a9373a6f74765c8d9261dee8c1 (patch) | |
tree | 253475edfedcc7fd15b041305989270bf4d72725 /scripts | |
parent | 9df526b03c01ad98ed64e46c5e15b65fe89e25f6 (diff) |
scripts: add generic syscallhdr.sh
Most of architectures generate syscall headers at the compile time
in a similar way.
As of v5.11-rc1, 12 architectures duplicate similar shell scripts:
$ find arch -name syscallhdr.sh | sort
arch/alpha/kernel/syscalls/syscallhdr.sh
arch/arm/tools/syscallhdr.sh
arch/ia64/kernel/syscalls/syscallhdr.sh
arch/m68k/kernel/syscalls/syscallhdr.sh
arch/microblaze/kernel/syscalls/syscallhdr.sh
arch/mips/kernel/syscalls/syscallhdr.sh
arch/parisc/kernel/syscalls/syscallhdr.sh
arch/powerpc/kernel/syscalls/syscallhdr.sh
arch/sh/kernel/syscalls/syscallhdr.sh
arch/sparc/kernel/syscalls/syscallhdr.sh
arch/x86/entry/syscalls/syscallhdr.sh
arch/xtensa/kernel/syscalls/syscallhdr.sh
My goal is to unify them into scripts/syscallhdr.sh.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/syscallhdr.sh | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/scripts/syscallhdr.sh b/scripts/syscallhdr.sh new file mode 100755 index 000000000000..848ac2735115 --- /dev/null +++ b/scripts/syscallhdr.sh @@ -0,0 +1,98 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-only +# +# Generate a syscall number 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] [--emit-nr] [--offset OFFSET] [--prefix PREFIX] 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)" + echo >&2 " --emit-nr Emit the macro of the number of syscalls (__NR_syscalls)" + echo >&2 " --offset OFFSET The offset of syscall numbers" + echo >&2 " --prefix PREFIX The prefix to the macro like __NR_<PREFIX><NAME>" + exit 1 +} + +# default unless specified by options +abis= +emit_nr= +offset= +prefix= + +while [ $# -gt 0 ] +do + case $1 in + --abis) + abis=$(echo "($2)" | tr ',' '|') + shift 2;; + --emit-nr) + emit_nr=1 + shift 1;; + --offset) + offset=$2 + shift 2;; + --prefix) + prefix=$2 + shift 2;; + -*) + echo "$1: unknown option" >&2 + usage;; + *) + break;; + esac +done + +if [ $# -ne 2 ]; then + usage +fi + +infile="$1" +outfile="$2" + +guard=_UAPI_ASM_$(basename "$outfile" | + sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ + -e 's/[^A-Z0-9_]/_/g' -e 's/__/_/g') + +grep -E "^[0-9A-Fa-fXx]+[[:space:]]+$abis" "$infile" | sort -n | { + echo "#ifndef $guard" + echo "#define $guard" + echo + + max=0 + while read nr abi name native compat ; do + + max=$nr + + if [ -n "$offset" ]; then + nr="($offset + $nr)" + fi + + echo "#define __NR_$prefix$name $nr" + done + + if [ -n "$emit_nr" ]; then + echo + echo "#ifdef __KERNEL__" + echo "#define __NR_${prefix}syscalls $(($max + 1))" + echo "#endif" + fi + + echo + echo "#endif /* $guard */" +} > "$outfile" |