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