162306a36Sopenharmony_ci#!/bin/sh
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-only
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# Generate a syscall table 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] 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	exit 1
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci# default unless specified by options
3062306a36Sopenharmony_ciabis=
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ciwhile [ $# -gt 0 ]
3362306a36Sopenharmony_cido
3462306a36Sopenharmony_ci	case $1 in
3562306a36Sopenharmony_ci	--abis)
3662306a36Sopenharmony_ci		abis=$(echo "($2)" | tr ',' '|')
3762306a36Sopenharmony_ci		shift 2;;
3862306a36Sopenharmony_ci	-*)
3962306a36Sopenharmony_ci		echo "$1: unknown option" >&2
4062306a36Sopenharmony_ci		usage;;
4162306a36Sopenharmony_ci	*)
4262306a36Sopenharmony_ci		break;;
4362306a36Sopenharmony_ci	esac
4462306a36Sopenharmony_cidone
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ciif [ $# -ne 2 ]; then
4762306a36Sopenharmony_ci	usage
4862306a36Sopenharmony_cifi
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ciinfile="$1"
5162306a36Sopenharmony_cioutfile="$2"
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cinxt=0
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cigrep -E "^[0-9]+[[:space:]]+$abis" "$infile" | {
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	while read nr abi name native compat ; do
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci		if [ $nxt -gt $nr ]; then
6062306a36Sopenharmony_ci			echo "error: $infile: syscall table is not sorted or duplicates the same syscall number" >&2
6162306a36Sopenharmony_ci			exit 1
6262306a36Sopenharmony_ci		fi
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci		while [ $nxt -lt $nr ]; do
6562306a36Sopenharmony_ci			echo "__SYSCALL($nxt, sys_ni_syscall)"
6662306a36Sopenharmony_ci			nxt=$((nxt + 1))
6762306a36Sopenharmony_ci		done
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci		if [ -n "$compat" ]; then
7062306a36Sopenharmony_ci			echo "__SYSCALL_WITH_COMPAT($nr, $native, $compat)"
7162306a36Sopenharmony_ci		elif [ -n "$native" ]; then
7262306a36Sopenharmony_ci			echo "__SYSCALL($nr, $native)"
7362306a36Sopenharmony_ci		else
7462306a36Sopenharmony_ci			echo "__SYSCALL($nr, sys_ni_syscall)"
7562306a36Sopenharmony_ci		fi
7662306a36Sopenharmony_ci		nxt=$((nr + 1))
7762306a36Sopenharmony_ci	done
7862306a36Sopenharmony_ci} > "$outfile"
79