1#!/bin/sh
2# SPDX-License-Identifier: GPL-2.0-only
3#
4# Generate a syscall number header.
5#
6# Each line of the syscall table should have the following format:
7#
8# NR ABI NAME [NATIVE] [COMPAT]
9#
10# NR       syscall number
11# ABI      ABI name
12# NAME     syscall name
13# NATIVE   native entry point (optional)
14# COMPAT   compat entry point (optional)
15
16set -e
17
18usage() {
19	echo >&2 "usage: $0 [--abis ABIS] [--emit-nr] [--offset OFFSET] [--prefix PREFIX] INFILE OUTFILE" >&2
20	echo >&2
21	echo >&2 "  INFILE    input syscall table"
22	echo >&2 "  OUTFILE   output header file"
23	echo >&2
24	echo >&2 "options:"
25	echo >&2 "  --abis ABIS        ABI(s) to handle (By default, all lines are handled)"
26	echo >&2 "  --emit-nr          Emit the macro of the number of syscalls (__NR_syscalls)"
27	echo >&2 "  --offset OFFSET    The offset of syscall numbers"
28	echo >&2 "  --prefix PREFIX    The prefix to the macro like __NR_<PREFIX><NAME>"
29	exit 1
30}
31
32# default unless specified by options
33abis=
34emit_nr=
35offset=
36prefix=
37
38while [ $# -gt 0 ]
39do
40	case $1 in
41	--abis)
42		abis=$(echo "($2)" | tr ',' '|')
43		shift 2;;
44	--emit-nr)
45		emit_nr=1
46		shift 1;;
47	--offset)
48		offset=$2
49		shift 2;;
50	--prefix)
51		prefix=$2
52		shift 2;;
53	-*)
54		echo "$1: unknown option" >&2
55		usage;;
56	*)
57		break;;
58	esac
59done
60
61if [ $# -ne 2 ]; then
62	usage
63fi
64
65infile="$1"
66outfile="$2"
67
68guard=_UAPI_ASM_$(basename "$outfile" |
69	sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
70	-e 's/[^A-Z0-9_]/_/g' -e 's/__/_/g')
71
72grep -E "^[0-9A-Fa-fXx]+[[:space:]]+$abis" "$infile" | {
73	echo "#ifndef $guard"
74	echo "#define $guard"
75	echo
76
77	max=0
78	while read nr abi name native compat ; do
79
80		max=$nr
81
82		if [ -n "$offset" ]; then
83			nr="($offset + $nr)"
84		fi
85
86		echo "#define __NR_$prefix$name $nr"
87	done
88
89	if [ -n "$emit_nr" ]; then
90		echo
91		echo "#ifdef __KERNEL__"
92		echo "#define __NR_${prefix}syscalls $(($max + 1))"
93		echo "#endif"
94	fi
95
96	echo
97	echo "#endif /* $guard */"
98} > "$outfile"
99