linux/scripts/syscallhdr.sh
<<
>>
Prefs
   1#!/bin/sh
   2# SPDX-License-Identifier: GPL-2.0-only
   3#
   4# Generate a syscall number header.
   5#
   6# Each line of the syscall table should have the following format:
   7#
   8# NR ABI NAME [NATIVE] [COMPAT]
   9#
  10# NR       syscall number
  11# ABI      ABI name
  12# NAME     syscall name
  13# NATIVE   native entry point (optional)
  14# COMPAT   compat entry point (optional)
  15
  16set -e
  17
  18usage() {
  19        echo >&2 "usage: $0 [--abis ABIS] [--emit-nr] [--offset OFFSET] [--prefix PREFIX] INFILE OUTFILE" >&2
  20        echo >&2
  21        echo >&2 "  INFILE    input syscall table"
  22        echo >&2 "  OUTFILE   output header file"
  23        echo >&2
  24        echo >&2 "options:"
  25        echo >&2 "  --abis ABIS        ABI(s) to handle (By default, all lines are handled)"
  26        echo >&2 "  --emit-nr          Emit the macro of the number of syscalls (__NR_syscalls)"
  27        echo >&2 "  --offset OFFSET    The offset of syscall numbers"
  28        echo >&2 "  --prefix PREFIX    The prefix to the macro like __NR_<PREFIX><NAME>"
  29        exit 1
  30}
  31
  32# default unless specified by options
  33abis=
  34emit_nr=
  35offset=
  36prefix=
  37
  38while [ $# -gt 0 ]
  39do
  40        case $1 in
  41        --abis)
  42                abis=$(echo "($2)" | tr ',' '|')
  43                shift 2;;
  44        --emit-nr)
  45                emit_nr=1
  46                shift 1;;
  47        --offset)
  48                offset=$2
  49                shift 2;;
  50        --prefix)
  51                prefix=$2
  52                shift 2;;
  53        -*)
  54                echo "$1: unknown option" >&2
  55                usage;;
  56        *)
  57                break;;
  58        esac
  59done
  60
  61if [ $# -ne 2 ]; then
  62        usage
  63fi
  64
  65infile="$1"
  66outfile="$2"
  67
  68guard=_UAPI_ASM_$(basename "$outfile" |
  69        sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
  70        -e 's/[^A-Z0-9_]/_/g' -e 's/__/_/g')
  71
  72grep -E "^[0-9A-Fa-fXx]+[[:space:]]+$abis" "$infile" | {
  73        echo "#ifndef $guard"
  74        echo "#define $guard"
  75        echo
  76
  77        max=0
  78        while read nr abi name native compat ; do
  79
  80                max=$nr
  81
  82                if [ -n "$offset" ]; then
  83                        nr="($offset + $nr)"
  84                fi
  85
  86                echo "#define __NR_$prefix$name $nr"
  87        done
  88
  89        if [ -n "$emit_nr" ]; then
  90                echo
  91                echo "#ifdef __KERNEL__"
  92                echo "#define __NR_${prefix}syscalls $(($max + 1))"
  93                echo "#endif"
  94        fi
  95
  96        echo
  97        echo "#endif /* $guard */"
  98} > "$outfile"
  99