|  | #!/bin/sh | 
|  | # SPDX-License-Identifier: GPL-2.0-only | 
|  | # | 
|  | # Generate a syscall table header. | 
|  | # | 
|  | # Each line of the syscall table should have the following format: | 
|  | # | 
|  | # NR ABI NAME [NATIVE] [COMPAT] | 
|  | # | 
|  | # NR       syscall number | 
|  | # ABI      ABI name | 
|  | # NAME     syscall name | 
|  | # NATIVE   native entry point (optional) | 
|  | # COMPAT   compat entry point (optional) | 
|  |  | 
|  | set -e | 
|  |  | 
|  | usage() { | 
|  | echo >&2 "usage: $0 [--abis ABIS] INFILE OUTFILE" >&2 | 
|  | echo >&2 | 
|  | echo >&2 "  INFILE    input syscall table" | 
|  | echo >&2 "  OUTFILE   output header file" | 
|  | echo >&2 | 
|  | echo >&2 "options:" | 
|  | echo >&2 "  --abis ABIS        ABI(s) to handle (By default, all lines are handled)" | 
|  | exit 1 | 
|  | } | 
|  |  | 
|  | # default unless specified by options | 
|  | abis= | 
|  |  | 
|  | while [ $# -gt 0 ] | 
|  | do | 
|  | case $1 in | 
|  | --abis) | 
|  | abis=$(echo "($2)" | tr ',' '|') | 
|  | shift 2;; | 
|  | -*) | 
|  | echo "$1: unknown option" >&2 | 
|  | usage;; | 
|  | *) | 
|  | break;; | 
|  | esac | 
|  | done | 
|  |  | 
|  | if [ $# -ne 2 ]; then | 
|  | usage | 
|  | fi | 
|  |  | 
|  | infile="$1" | 
|  | outfile="$2" | 
|  |  | 
|  | nxt=0 | 
|  |  | 
|  | grep -E "^[0-9]+[[:space:]]+$abis" "$infile" | { | 
|  |  | 
|  | while read nr abi name native compat ; do | 
|  |  | 
|  | if [ $nxt -gt $nr ]; then | 
|  | echo "error: $infile: syscall table is not sorted or duplicates the same syscall number" >&2 | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | while [ $nxt -lt $nr ]; do | 
|  | echo "__SYSCALL($nxt, sys_ni_syscall)" | 
|  | nxt=$((nxt + 1)) | 
|  | done | 
|  |  | 
|  | if [ -n "$compat" ]; then | 
|  | echo "__SYSCALL_WITH_COMPAT($nr, $native, $compat)" | 
|  | elif [ -n "$native" ]; then | 
|  | echo "__SYSCALL($nr, $native)" | 
|  | else | 
|  | echo "__SYSCALL($nr, sys_ni_syscall)" | 
|  | fi | 
|  | nxt=$((nr + 1)) | 
|  | done | 
|  | } > "$outfile" |