Commit | Line | Data |
---|---|---|
b9da928a MY |
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 | ||
16 | set -e | |
17 | ||
18 | usage() { | |
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 | |
33 | abis= | |
34 | emit_nr= | |
35 | offset= | |
36 | prefix= | |
37 | ||
38 | while [ $# -gt 0 ] | |
39 | do | |
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 | |
59 | done | |
60 | ||
61 | if [ $# -ne 2 ]; then | |
62 | usage | |
63 | fi | |
64 | ||
65 | infile="$1" | |
66 | outfile="$2" | |
67 | ||
68 | guard=_UAPI_ASM_$(basename "$outfile" | | |
69 | sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ | |
70 | -e 's/[^A-Z0-9_]/_/g' -e 's/__/_/g') | |
71 | ||
c6a3a81d | 72 | grep -E "^[0-9A-Fa-fXx]+[[:space:]]+$abis" "$infile" | { |
b9da928a MY |
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" |