~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/s390/kernel/syscalls/syscalltbl

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php