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