2021-02-16 05:04:12 +03:00
#!/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' )
2021-07-05 09:06:54 +03:00
grep -E " ^[0-9A-Fa-fXx]+[[:space:]]+ $abis " " $infile " | {
2021-02-16 05:04:12 +03:00
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 "