xref: /linux/scripts/syscallnr.sh (revision 762f99f4f3cb41a775b5157dd761217beba65873)
1*27932b6aSMasahiro Yamada#!/bin/sh
2*27932b6aSMasahiro Yamada# SPDX-License-Identifier: GPL-2.0-only
3*27932b6aSMasahiro Yamada#
4*27932b6aSMasahiro Yamada# Generate a syscall number header.
5*27932b6aSMasahiro Yamada#
6*27932b6aSMasahiro Yamada# Each line of the syscall table should have the following format:
7*27932b6aSMasahiro Yamada#
8*27932b6aSMasahiro Yamada# NR ABI NAME [NATIVE] [COMPAT]
9*27932b6aSMasahiro Yamada#
10*27932b6aSMasahiro Yamada# NR       syscall number
11*27932b6aSMasahiro Yamada# ABI      ABI name
12*27932b6aSMasahiro Yamada# NAME     syscall name
13*27932b6aSMasahiro Yamada# NATIVE   native entry point (optional)
14*27932b6aSMasahiro Yamada# COMPAT   compat entry point (optional)
15*27932b6aSMasahiro Yamadaset -e
16*27932b6aSMasahiro Yamada
17*27932b6aSMasahiro Yamadausage() {
18*27932b6aSMasahiro Yamada	echo >&2 "usage: $0 [--abis ABIS] [--prefix PREFIX] INFILE OUTFILE" >&2
19*27932b6aSMasahiro Yamada	echo >&2
20*27932b6aSMasahiro Yamada	echo >&2 "  INFILE    input syscall table"
21*27932b6aSMasahiro Yamada	echo >&2 "  OUTFILE   output header file"
22*27932b6aSMasahiro Yamada	echo >&2
23*27932b6aSMasahiro Yamada	echo >&2 "options:"
24*27932b6aSMasahiro Yamada	echo >&2 "  --abis ABIS        ABI(s) to handle (By default, all lines are handled)"
25*27932b6aSMasahiro Yamada	echo >&2 "  --prefix PREFIX    The prefix to the macro like __NR_<PREFIX><NAME>"
26*27932b6aSMasahiro Yamada	exit 1
27*27932b6aSMasahiro Yamada}
28*27932b6aSMasahiro Yamada
29*27932b6aSMasahiro Yamada# default unless specified by options
30*27932b6aSMasahiro Yamadaabis=
31*27932b6aSMasahiro Yamadaprefix=
32*27932b6aSMasahiro Yamada
33*27932b6aSMasahiro Yamadawhile [ $# -gt 0 ]
34*27932b6aSMasahiro Yamadado
35*27932b6aSMasahiro Yamada	case $1 in
36*27932b6aSMasahiro Yamada	--abis)
37*27932b6aSMasahiro Yamada		abis=$(echo "($2)" | tr ',' '|')
38*27932b6aSMasahiro Yamada		shift 2;;
39*27932b6aSMasahiro Yamada	--prefix)
40*27932b6aSMasahiro Yamada		prefix=$2
41*27932b6aSMasahiro Yamada		shift 2;;
42*27932b6aSMasahiro Yamada	-*)
43*27932b6aSMasahiro Yamada		echo "$1: unknown option" >&2
44*27932b6aSMasahiro Yamada		usage;;
45*27932b6aSMasahiro Yamada	*)
46*27932b6aSMasahiro Yamada		break;;
47*27932b6aSMasahiro Yamada	esac
48*27932b6aSMasahiro Yamadadone
49*27932b6aSMasahiro Yamada
50*27932b6aSMasahiro Yamadaif [ $# -ne 2 ]; then
51*27932b6aSMasahiro Yamada	usage
52*27932b6aSMasahiro Yamadafi
53*27932b6aSMasahiro Yamada
54*27932b6aSMasahiro Yamadainfile="$1"
55*27932b6aSMasahiro Yamadaoutfile="$2"
56*27932b6aSMasahiro Yamada
57*27932b6aSMasahiro Yamadaguard=_ASM_$(basename "$outfile" |
58*27932b6aSMasahiro Yamada	sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
59*27932b6aSMasahiro Yamada	-e 's/[^A-Z0-9_]/_/g' -e 's/__/_/g')
60*27932b6aSMasahiro Yamada
61*27932b6aSMasahiro Yamadagrep -E "^[0-9A-Fa-fXx]+[[:space:]]+$abis" "$infile" | sort -n | {
62*27932b6aSMasahiro Yamada	echo "#ifndef $guard"
63*27932b6aSMasahiro Yamada	echo "#define $guard"
64*27932b6aSMasahiro Yamada	echo
65*27932b6aSMasahiro Yamada
66*27932b6aSMasahiro Yamada	max=0
67*27932b6aSMasahiro Yamada	while read nr abi name native compat ; do
68*27932b6aSMasahiro Yamada		max=$nr
69*27932b6aSMasahiro Yamada	done
70*27932b6aSMasahiro Yamada
71*27932b6aSMasahiro Yamada	echo "#define __NR_${prefix}syscalls $(($max + 1))"
72*27932b6aSMasahiro Yamada	echo
73*27932b6aSMasahiro Yamada	echo "#endif /* $guard */"
74*27932b6aSMasahiro Yamada} > "$outfile"
75