162306a36Sopenharmony_ci#!/bin/sh
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-only
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# Generate a syscall number header.
562306a36Sopenharmony_ci#
662306a36Sopenharmony_ci# Each line of the syscall table should have the following format:
762306a36Sopenharmony_ci#
862306a36Sopenharmony_ci# NR ABI NAME [NATIVE] [COMPAT]
962306a36Sopenharmony_ci#
1062306a36Sopenharmony_ci# NR       syscall number
1162306a36Sopenharmony_ci# ABI      ABI name
1262306a36Sopenharmony_ci# NAME     syscall name
1362306a36Sopenharmony_ci# NATIVE   native entry point (optional)
1462306a36Sopenharmony_ci# COMPAT   compat entry point (optional)
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ciset -e
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ciusage() {
1962306a36Sopenharmony_ci	echo >&2 "usage: $0 [--abis ABIS] [--emit-nr] [--offset OFFSET] [--prefix PREFIX] INFILE OUTFILE" >&2
2062306a36Sopenharmony_ci	echo >&2
2162306a36Sopenharmony_ci	echo >&2 "  INFILE    input syscall table"
2262306a36Sopenharmony_ci	echo >&2 "  OUTFILE   output header file"
2362306a36Sopenharmony_ci	echo >&2
2462306a36Sopenharmony_ci	echo >&2 "options:"
2562306a36Sopenharmony_ci	echo >&2 "  --abis ABIS        ABI(s) to handle (By default, all lines are handled)"
2662306a36Sopenharmony_ci	echo >&2 "  --emit-nr          Emit the macro of the number of syscalls (__NR_syscalls)"
2762306a36Sopenharmony_ci	echo >&2 "  --offset OFFSET    The offset of syscall numbers"
2862306a36Sopenharmony_ci	echo >&2 "  --prefix PREFIX    The prefix to the macro like __NR_<PREFIX><NAME>"
2962306a36Sopenharmony_ci	exit 1
3062306a36Sopenharmony_ci}
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci# default unless specified by options
3362306a36Sopenharmony_ciabis=
3462306a36Sopenharmony_ciemit_nr=
3562306a36Sopenharmony_cioffset=
3662306a36Sopenharmony_ciprefix=
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciwhile [ $# -gt 0 ]
3962306a36Sopenharmony_cido
4062306a36Sopenharmony_ci	case $1 in
4162306a36Sopenharmony_ci	--abis)
4262306a36Sopenharmony_ci		abis=$(echo "($2)" | tr ',' '|')
4362306a36Sopenharmony_ci		shift 2;;
4462306a36Sopenharmony_ci	--emit-nr)
4562306a36Sopenharmony_ci		emit_nr=1
4662306a36Sopenharmony_ci		shift 1;;
4762306a36Sopenharmony_ci	--offset)
4862306a36Sopenharmony_ci		offset=$2
4962306a36Sopenharmony_ci		shift 2;;
5062306a36Sopenharmony_ci	--prefix)
5162306a36Sopenharmony_ci		prefix=$2
5262306a36Sopenharmony_ci		shift 2;;
5362306a36Sopenharmony_ci	-*)
5462306a36Sopenharmony_ci		echo "$1: unknown option" >&2
5562306a36Sopenharmony_ci		usage;;
5662306a36Sopenharmony_ci	*)
5762306a36Sopenharmony_ci		break;;
5862306a36Sopenharmony_ci	esac
5962306a36Sopenharmony_cidone
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ciif [ $# -ne 2 ]; then
6262306a36Sopenharmony_ci	usage
6362306a36Sopenharmony_cifi
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ciinfile="$1"
6662306a36Sopenharmony_cioutfile="$2"
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ciguard=_UAPI_ASM_$(basename "$outfile" |
6962306a36Sopenharmony_ci	sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
7062306a36Sopenharmony_ci	-e 's/[^A-Z0-9_]/_/g' -e 's/__/_/g')
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cigrep -E "^[0-9A-Fa-fXx]+[[:space:]]+$abis" "$infile" | {
7362306a36Sopenharmony_ci	echo "#ifndef $guard"
7462306a36Sopenharmony_ci	echo "#define $guard"
7562306a36Sopenharmony_ci	echo
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	max=0
7862306a36Sopenharmony_ci	while read nr abi name native compat ; do
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci		max=$nr
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci		if [ -n "$offset" ]; then
8362306a36Sopenharmony_ci			nr="($offset + $nr)"
8462306a36Sopenharmony_ci		fi
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci		echo "#define __NR_$prefix$name $nr"
8762306a36Sopenharmony_ci	done
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	if [ -n "$emit_nr" ]; then
9062306a36Sopenharmony_ci		echo
9162306a36Sopenharmony_ci		echo "#ifdef __KERNEL__"
9262306a36Sopenharmony_ci		echo "#define __NR_${prefix}syscalls $(($max + 1))"
9362306a36Sopenharmony_ci		echo "#endif"
9462306a36Sopenharmony_ci	fi
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci	echo
9762306a36Sopenharmony_ci	echo "#endif /* $guard */"
9862306a36Sopenharmony_ci} > "$outfile"
99