Merge tag 'xtensa-20210902' of git://github.com/jcmvbkbc/linux-xtensa
[linux-2.6-microblaze.git] / arch / s390 / kernel / syscalls / syscalltbl
1 #!/bin/sh
2 # SPDX-License-Identifier: GPL-2.0
3 #
4 # Generate system call table and header files
5 #
6 # Copyright IBM Corp. 2018
7 # Author(s):  Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
8
9 #
10 # File path to the system call table definition.
11 # You can set the path with the -i option.  If omitted,
12 # system call table definitions are read from standard input.
13 #
14 SYSCALL_TBL=""
15
16
17 create_syscall_table_entries()
18 {
19         local nr abi name entry64 entry32 _ignore
20         local temp=$(mktemp ${TMPDIR:-/tmp}/syscalltbl-common.XXXXXXXXX)
21
22         (
23         #
24         # Initialize with 0 to create an NI_SYSCALL for 0
25         #
26         local prev_nr=0 prev_32=sys_ni_syscall prev_64=sys_ni_syscall
27         while read nr abi name entry64 entry32 _ignore; do
28                 test x$entry32 = x- && entry32=sys_ni_syscall
29                 test x$entry64 = x- && entry64=sys_ni_syscall
30
31                 if test $prev_nr -eq $nr; then
32                         #
33                         # Same syscall but different ABI, just update
34                         # the respective entry point
35                         #
36                         case $abi in
37                         32)
38                                 prev_32=$entry32
39                         ;;
40                         64)
41                                 prev_64=$entry64
42                         ;;
43                         esac
44                         continue;
45                 else
46                         printf "%d\t%s\t%s\n" $prev_nr $prev_64 $prev_32
47                 fi
48
49                 prev_nr=$nr
50                 prev_64=$entry64
51                 prev_32=$entry32
52         done
53         printf "%d\t%s\t%s\n" $prev_nr $prev_64 $prev_32
54         ) >> $temp
55
56         #
57         # Check for duplicate syscall numbers
58         #
59         if ! cat $temp |cut -f1 |uniq -d 2>&1; then
60                 echo "Error: generated system call table contains duplicate entries: $temp" >&2
61                 exit 1
62         fi
63
64         #
65         # Generate syscall table
66         #
67         prev_nr=0
68         while read nr entry64 entry32; do
69                 while test $prev_nr -lt $((nr - 1)); do
70                         printf "NI_SYSCALL\n"
71                         prev_nr=$((prev_nr + 1))
72                 done
73                 if test x$entry64 = xsys_ni_syscall &&
74                    test x$entry32 = xsys_ni_syscall; then
75                         printf "NI_SYSCALL\n"
76                 else
77                         printf "SYSCALL(%s,%s)\n" $entry64 $entry32
78                 fi
79                 prev_nr=$nr
80         done < $temp
81         rm $temp
82 }
83
84 generate_syscall_table()
85 {
86         cat <<-EoHEADER
87         /* SPDX-License-Identifier: GPL-2.0 */
88         /*
89          * Definitions for sys_call_table, each line represents an
90          * entry in the table in the form
91          * SYSCALL(64 bit syscall, 31 bit emulated syscall)
92          *
93          * This file is meant to be included from entry.S.
94          */
95
96         #define NI_SYSCALL SYSCALL(sys_ni_syscall,sys_ni_syscall)
97
98 EoHEADER
99         grep -Ev '^(#|[[:blank:]]*$)' $SYSCALL_TBL      \
100                 |sort -k1 -n                            \
101                 |create_syscall_table_entries
102 }
103
104 create_header_defines()
105 {
106         local nr abi name _ignore
107
108         while read nr abi name _ignore; do
109                 printf "#define __NR_%s %d\n" $name $nr
110         done
111 }
112
113 normalize_fileguard()
114 {
115         local fileguard="$1"
116
117         echo "$1" |tr '[[:lower:]]' '[[:upper:]]' \
118                   |sed -e 's/[^A-Z0-9_]/_/g' -e 's/__/_/g'
119 }
120
121 generate_syscall_header()
122 {
123         local abis=$(echo "($1)" | tr ',' '|')
124         local filename="$2"
125         local fileguard suffix
126
127         if test "$filename"; then
128                 fileguard=$(normalize_fileguard "__UAPI_ASM_S390_$2")
129         else
130                 case "$abis" in
131                 *64*) suffix=64 ;;
132                 *32*) suffix=32 ;;
133                 esac
134                 fileguard=$(normalize_fileguard "__UAPI_ASM_S390_SYSCALLS_$suffix")
135         fi
136
137         cat <<-EoHEADER
138         /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
139         #ifndef ${fileguard}
140         #define ${fileguard}
141
142 EoHEADER
143
144         grep -E "^[[:digit:]]+[[:space:]]+${abis}" $SYSCALL_TBL \
145                 |sort -k1 -n                                    \
146                 |create_header_defines
147
148         cat <<-EoFOOTER
149
150         #endif /* ${fileguard} */
151 EoFOOTER
152 }
153
154 __max_syscall_nr()
155 {
156         local abis=$(echo "($1)" | tr ',' '|')
157
158         grep -E "^[[:digit:]]+[[:space:]]+${abis}" $SYSCALL_TBL  \
159                 |sed -ne 's/^\([[:digit:]]*\)[[:space:]].*/\1/p' \
160                 |sort -n                                         \
161                 |tail -1
162 }
163
164
165 generate_syscall_nr()
166 {
167         local abis="$1"
168         local max_syscall_nr num_syscalls
169
170         max_syscall_nr=$(__max_syscall_nr "$abis")
171         num_syscalls=$((max_syscall_nr + 1))
172
173         cat <<-EoHEADER
174         /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
175         #ifndef __ASM_S390_SYSCALLS_NR
176         #define __ASM_S390_SYSCALLS_NR
177
178         #define NR_syscalls ${num_syscalls}
179
180         #endif /* __ASM_S390_SYSCALLS_NR */
181 EoHEADER
182 }
183
184
185 #
186 # Parse command line arguments
187 #
188 do_syscall_header=""
189 do_syscall_table=""
190 do_syscall_nr=""
191 output_file=""
192 abi_list="common,64"
193 filename=""
194 while getopts ":HNSXi:a:f:" arg; do
195         case $arg in
196         a)
197                 abi_list="$OPTARG"
198                 ;;
199         i)
200                 SYSCALL_TBL="$OPTARG"
201                 ;;
202         f)
203                 filename=${OPTARG##*/}
204                 ;;
205         H)
206                 do_syscall_header=1
207                 ;;
208         N)
209                 do_syscall_nr=1
210                 ;;
211         S)
212                 do_syscall_table=1
213                 ;;
214         X)
215                 set -x
216                 ;;
217         :)
218                 echo "Missing argument for -$OPTARG" >&2
219                 exit 1
220         ;;
221         \?)
222                 echo "Invalid option specified" >&2
223                 exit 1
224         ;;
225         esac
226 done
227
228 test "$do_syscall_header" && generate_syscall_header "$abi_list" "$filename"
229 test "$do_syscall_table" && generate_syscall_table
230 test "$do_syscall_nr" && generate_syscall_nr "$abi_list"
231
232 exit 0