162306a36Sopenharmony_ci#!/bin/sh 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-only 362306a36Sopenharmony_ci# 462306a36Sopenharmony_ci# Generate a syscall number header. 562306a36Sopenharmony_ci# 662306a36Sopenharmony_ci# Each line of the syscall table should have the following format: 762306a36Sopenharmony_ci# 862306a36Sopenharmony_ci# NR ABI NAME [NATIVE] [COMPAT] 962306a36Sopenharmony_ci# 1062306a36Sopenharmony_ci# NR syscall number 1162306a36Sopenharmony_ci# ABI ABI name 1262306a36Sopenharmony_ci# NAME syscall name 1362306a36Sopenharmony_ci# NATIVE native entry point (optional) 1462306a36Sopenharmony_ci# COMPAT compat entry point (optional) 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ciset -e 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ciusage() { 1962306a36Sopenharmony_ci echo >&2 "usage: $0 [--abis ABIS] [--emit-nr] [--offset OFFSET] [--prefix PREFIX] INFILE OUTFILE" >&2 2062306a36Sopenharmony_ci echo >&2 2162306a36Sopenharmony_ci echo >&2 " INFILE input syscall table" 2262306a36Sopenharmony_ci echo >&2 " OUTFILE output header file" 2362306a36Sopenharmony_ci echo >&2 2462306a36Sopenharmony_ci echo >&2 "options:" 2562306a36Sopenharmony_ci echo >&2 " --abis ABIS ABI(s) to handle (By default, all lines are handled)" 2662306a36Sopenharmony_ci echo >&2 " --emit-nr Emit the macro of the number of syscalls (__NR_syscalls)" 2762306a36Sopenharmony_ci echo >&2 " --offset OFFSET The offset of syscall numbers" 2862306a36Sopenharmony_ci echo >&2 " --prefix PREFIX The prefix to the macro like __NR_<PREFIX><NAME>" 2962306a36Sopenharmony_ci exit 1 3062306a36Sopenharmony_ci} 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci# default unless specified by options 3362306a36Sopenharmony_ciabis= 3462306a36Sopenharmony_ciemit_nr= 3562306a36Sopenharmony_cioffset= 3662306a36Sopenharmony_ciprefix= 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ciwhile [ $# -gt 0 ] 3962306a36Sopenharmony_cido 4062306a36Sopenharmony_ci case $1 in 4162306a36Sopenharmony_ci --abis) 4262306a36Sopenharmony_ci abis=$(echo "($2)" | tr ',' '|') 4362306a36Sopenharmony_ci shift 2;; 4462306a36Sopenharmony_ci --emit-nr) 4562306a36Sopenharmony_ci emit_nr=1 4662306a36Sopenharmony_ci shift 1;; 4762306a36Sopenharmony_ci --offset) 4862306a36Sopenharmony_ci offset=$2 4962306a36Sopenharmony_ci shift 2;; 5062306a36Sopenharmony_ci --prefix) 5162306a36Sopenharmony_ci prefix=$2 5262306a36Sopenharmony_ci shift 2;; 5362306a36Sopenharmony_ci -*) 5462306a36Sopenharmony_ci echo "$1: unknown option" >&2 5562306a36Sopenharmony_ci usage;; 5662306a36Sopenharmony_ci *) 5762306a36Sopenharmony_ci break;; 5862306a36Sopenharmony_ci esac 5962306a36Sopenharmony_cidone 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ciif [ $# -ne 2 ]; then 6262306a36Sopenharmony_ci usage 6362306a36Sopenharmony_cifi 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ciinfile="$1" 6662306a36Sopenharmony_cioutfile="$2" 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ciguard=_UAPI_ASM_$(basename "$outfile" | 6962306a36Sopenharmony_ci sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ 7062306a36Sopenharmony_ci -e 's/[^A-Z0-9_]/_/g' -e 's/__/_/g') 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_cigrep -E "^[0-9A-Fa-fXx]+[[:space:]]+$abis" "$infile" | { 7362306a36Sopenharmony_ci echo "#ifndef $guard" 7462306a36Sopenharmony_ci echo "#define $guard" 7562306a36Sopenharmony_ci echo 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci max=0 7862306a36Sopenharmony_ci while read nr abi name native compat ; do 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci max=$nr 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci if [ -n "$offset" ]; then 8362306a36Sopenharmony_ci nr="($offset + $nr)" 8462306a36Sopenharmony_ci fi 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci echo "#define __NR_$prefix$name $nr" 8762306a36Sopenharmony_ci done 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci if [ -n "$emit_nr" ]; then 9062306a36Sopenharmony_ci echo 9162306a36Sopenharmony_ci echo "#ifdef __KERNEL__" 9262306a36Sopenharmony_ci echo "#define __NR_${prefix}syscalls $(($max + 1))" 9362306a36Sopenharmony_ci echo "#endif" 9462306a36Sopenharmony_ci fi 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci echo 9762306a36Sopenharmony_ci echo "#endif /* $guard */" 9862306a36Sopenharmony_ci} > "$outfile" 99