mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 08:38:45 +02:00 
			
		
		
		
	 9df526b03c
			
		
	
	
		9df526b03c
		
	
	
	
	
		
			
			Most of architectures generate syscall headers at the compile time in a similar way. The syscall table has the same format for all architectures. Each line has up to 5 fields; syscall number, ABI, syscall name, native entry point, and compat entry point. The syscall table is processed by syscalltbl.sh script into header files. Despite the same pattern, scripts are maintained per architecture, which results in code duplication and bad maintainability. As of v5.11-rc1, 12 architectures duplicate similar shell scripts: $ find arch -name syscalltbl.sh | sort arch/alpha/kernel/syscalls/syscalltbl.sh arch/arm/tools/syscalltbl.sh arch/ia64/kernel/syscalls/syscalltbl.sh arch/m68k/kernel/syscalls/syscalltbl.sh arch/microblaze/kernel/syscalls/syscalltbl.sh arch/mips/kernel/syscalls/syscalltbl.sh arch/parisc/kernel/syscalls/syscalltbl.sh arch/powerpc/kernel/syscalls/syscalltbl.sh arch/sh/kernel/syscalls/syscalltbl.sh arch/sparc/kernel/syscalls/syscalltbl.sh arch/x86/entry/syscalls/syscalltbl.sh arch/xtensa/kernel/syscalls/syscalltbl.sh My goal is to unify them into scripts/syscalltbl.sh. __SYSCALL_WITH_COMPAT should be defined as follows: 32-bit kernel: #define __SYSCALL_WITH_COMPAT(nr, native, compat) __SYSCALL(nr, native) 64-bit kernel: #define __SYSCALL_WITH_COMPAT(nr, native, compat) __SYSCALL(nr, compat) Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
		
			
				
	
	
		
			73 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/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" | sort -n | {
 | |
| 
 | |
| 	while read nr abi name native compat ; do
 | |
| 
 | |
| 		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"
 |