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_ciset -e
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ciusage() {
1862306a36Sopenharmony_ci	echo >&2 "usage: $0 [--abis ABIS] [--prefix PREFIX] INFILE OUTFILE" >&2
1962306a36Sopenharmony_ci	echo >&2
2062306a36Sopenharmony_ci	echo >&2 "  INFILE    input syscall table"
2162306a36Sopenharmony_ci	echo >&2 "  OUTFILE   output header file"
2262306a36Sopenharmony_ci	echo >&2
2362306a36Sopenharmony_ci	echo >&2 "options:"
2462306a36Sopenharmony_ci	echo >&2 "  --abis ABIS        ABI(s) to handle (By default, all lines are handled)"
2562306a36Sopenharmony_ci	echo >&2 "  --prefix PREFIX    The prefix to the macro like __NR_<PREFIX><NAME>"
2662306a36Sopenharmony_ci	exit 1
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci# default unless specified by options
3062306a36Sopenharmony_ciabis=
3162306a36Sopenharmony_ciprefix=
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ciwhile [ $# -gt 0 ]
3462306a36Sopenharmony_cido
3562306a36Sopenharmony_ci	case $1 in
3662306a36Sopenharmony_ci	--abis)
3762306a36Sopenharmony_ci		abis=$(echo "($2)" | tr ',' '|')
3862306a36Sopenharmony_ci		shift 2;;
3962306a36Sopenharmony_ci	--prefix)
4062306a36Sopenharmony_ci		prefix=$2
4162306a36Sopenharmony_ci		shift 2;;
4262306a36Sopenharmony_ci	-*)
4362306a36Sopenharmony_ci		echo "$1: unknown option" >&2
4462306a36Sopenharmony_ci		usage;;
4562306a36Sopenharmony_ci	*)
4662306a36Sopenharmony_ci		break;;
4762306a36Sopenharmony_ci	esac
4862306a36Sopenharmony_cidone
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ciif [ $# -ne 2 ]; then
5162306a36Sopenharmony_ci	usage
5262306a36Sopenharmony_cifi
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ciinfile="$1"
5562306a36Sopenharmony_cioutfile="$2"
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ciguard=_ASM_$(basename "$outfile" |
5862306a36Sopenharmony_ci	sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
5962306a36Sopenharmony_ci	-e 's/[^A-Z0-9_]/_/g' -e 's/__/_/g')
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cigrep -E "^[0-9A-Fa-fXx]+[[:space:]]+$abis" "$infile" | sort -n | {
6262306a36Sopenharmony_ci	echo "#ifndef $guard"
6362306a36Sopenharmony_ci	echo "#define $guard"
6462306a36Sopenharmony_ci	echo
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	max=0
6762306a36Sopenharmony_ci	while read nr abi name native compat ; do
6862306a36Sopenharmony_ci		max=$nr
6962306a36Sopenharmony_ci	done
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	echo "#define __NR_${prefix}syscalls $(($max + 1))"
7262306a36Sopenharmony_ci	echo
7362306a36Sopenharmony_ci	echo "#endif /* $guard */"
7462306a36Sopenharmony_ci} > "$outfile"
75