mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	 c6a3a81d19
			
		
	
	
		c6a3a81d19
		
	
	
	
	
		
			
			Currently, syscall{hdr,tbl}.sh sorts the entire syscall table, but you
can assume it is already sorted by the syscall number.
The generated syscall table does not work if the same syscall number
appears twice. Check it in the script.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
		
	
			
		
			
				
	
	
		
			99 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/sh
 | |
| # SPDX-License-Identifier: GPL-2.0-only
 | |
| #
 | |
| # Generate a syscall number 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] [--emit-nr] [--offset OFFSET] [--prefix PREFIX] 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)"
 | |
| 	echo >&2 "  --emit-nr          Emit the macro of the number of syscalls (__NR_syscalls)"
 | |
| 	echo >&2 "  --offset OFFSET    The offset of syscall numbers"
 | |
| 	echo >&2 "  --prefix PREFIX    The prefix to the macro like __NR_<PREFIX><NAME>"
 | |
| 	exit 1
 | |
| }
 | |
| 
 | |
| # default unless specified by options
 | |
| abis=
 | |
| emit_nr=
 | |
| offset=
 | |
| prefix=
 | |
| 
 | |
| while [ $# -gt 0 ]
 | |
| do
 | |
| 	case $1 in
 | |
| 	--abis)
 | |
| 		abis=$(echo "($2)" | tr ',' '|')
 | |
| 		shift 2;;
 | |
| 	--emit-nr)
 | |
| 		emit_nr=1
 | |
| 		shift 1;;
 | |
| 	--offset)
 | |
| 		offset=$2
 | |
| 		shift 2;;
 | |
| 	--prefix)
 | |
| 		prefix=$2
 | |
| 		shift 2;;
 | |
| 	-*)
 | |
| 		echo "$1: unknown option" >&2
 | |
| 		usage;;
 | |
| 	*)
 | |
| 		break;;
 | |
| 	esac
 | |
| done
 | |
| 
 | |
| if [ $# -ne 2 ]; then
 | |
| 	usage
 | |
| fi
 | |
| 
 | |
| infile="$1"
 | |
| outfile="$2"
 | |
| 
 | |
| guard=_UAPI_ASM_$(basename "$outfile" |
 | |
| 	sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
 | |
| 	-e 's/[^A-Z0-9_]/_/g' -e 's/__/_/g')
 | |
| 
 | |
| grep -E "^[0-9A-Fa-fXx]+[[:space:]]+$abis" "$infile" | {
 | |
| 	echo "#ifndef $guard"
 | |
| 	echo "#define $guard"
 | |
| 	echo
 | |
| 
 | |
| 	max=0
 | |
| 	while read nr abi name native compat ; do
 | |
| 
 | |
| 		max=$nr
 | |
| 
 | |
| 		if [ -n "$offset" ]; then
 | |
| 			nr="($offset + $nr)"
 | |
| 		fi
 | |
| 
 | |
| 		echo "#define __NR_$prefix$name $nr"
 | |
| 	done
 | |
| 
 | |
| 	if [ -n "$emit_nr" ]; then
 | |
| 		echo
 | |
| 		echo "#ifdef __KERNEL__"
 | |
| 		echo "#define __NR_${prefix}syscalls $(($max + 1))"
 | |
| 		echo "#endif"
 | |
| 	fi
 | |
| 
 | |
| 	echo
 | |
| 	echo "#endif /* $guard */"
 | |
| } > "$outfile"
 |