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