cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

syscalltbl (4490B)


      1#!/bin/sh
      2# SPDX-License-Identifier: GPL-2.0
      3#
      4# Generate system call table and header files
      5#
      6# Copyright IBM Corp. 2018
      7# Author(s):  Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
      8
      9#
     10# File path to the system call table definition.
     11# You can set the path with the -i option.  If omitted,
     12# system call table definitions are read from standard input.
     13#
     14SYSCALL_TBL=""
     15
     16
     17create_syscall_table_entries()
     18{
     19	local nr abi name entry64 entry32 _ignore
     20	local temp=$(mktemp ${TMPDIR:-/tmp}/syscalltbl-common.XXXXXXXXX)
     21
     22	(
     23	#
     24	# Initialize with 0 to create an NI_SYSCALL for 0
     25	#
     26	local prev_nr=0 prev_32=sys_ni_syscall prev_64=sys_ni_syscall
     27	while read nr abi name entry64 entry32 _ignore; do
     28		test x$entry32 = x- && entry32=sys_ni_syscall
     29		test x$entry64 = x- && entry64=sys_ni_syscall
     30
     31		if test $prev_nr -eq $nr; then
     32			#
     33			# Same syscall but different ABI, just update
     34			# the respective entry point
     35			#
     36			case $abi in
     37			32)
     38				prev_32=$entry32
     39			;;
     40			64)
     41				prev_64=$entry64
     42			;;
     43			esac
     44			continue;
     45		else
     46			printf "%d\t%s\t%s\n" $prev_nr $prev_64 $prev_32
     47		fi
     48
     49		prev_nr=$nr
     50		prev_64=$entry64
     51		prev_32=$entry32
     52	done
     53	printf "%d\t%s\t%s\n" $prev_nr $prev_64 $prev_32
     54	) >> $temp
     55
     56	#
     57	# Check for duplicate syscall numbers
     58	#
     59	if ! cat $temp |cut -f1 |uniq -d 2>&1; then
     60		echo "Error: generated system call table contains duplicate entries: $temp" >&2
     61		exit 1
     62	fi
     63
     64	#
     65	# Generate syscall table
     66	#
     67	prev_nr=0
     68	while read nr entry64 entry32; do
     69		while test $prev_nr -lt $((nr - 1)); do
     70			printf "NI_SYSCALL\n"
     71			prev_nr=$((prev_nr + 1))
     72		done
     73		if test x$entry64 = xsys_ni_syscall &&
     74		   test x$entry32 = xsys_ni_syscall; then
     75			printf "NI_SYSCALL\n"
     76		else
     77			printf "SYSCALL(%s,%s)\n" $entry64 $entry32
     78		fi
     79		prev_nr=$nr
     80	done < $temp
     81	rm $temp
     82}
     83
     84generate_syscall_table()
     85{
     86	cat <<-EoHEADER
     87	/* SPDX-License-Identifier: GPL-2.0 */
     88	/*
     89	 * Definitions for sys_call_table, each line represents an
     90	 * entry in the table in the form
     91	 * SYSCALL(64 bit syscall, 31 bit emulated syscall)
     92	 *
     93	 * This file is meant to be included from entry.S.
     94	 */
     95
     96	#define NI_SYSCALL SYSCALL(sys_ni_syscall,sys_ni_syscall)
     97
     98EoHEADER
     99	grep -Ev '^(#|[[:blank:]]*$)' $SYSCALL_TBL	\
    100		|sort -k1 -n				\
    101		|create_syscall_table_entries
    102}
    103
    104create_header_defines()
    105{
    106	local nr abi name _ignore
    107
    108	while read nr abi name _ignore; do
    109		printf "#define __NR_%s %d\n" $name $nr
    110	done
    111}
    112
    113normalize_fileguard()
    114{
    115	local fileguard="$1"
    116
    117	echo "$1" |tr '[[:lower:]]' '[[:upper:]]' \
    118		  |sed -e 's/[^A-Z0-9_]/_/g' -e 's/__/_/g'
    119}
    120
    121generate_syscall_header()
    122{
    123	local abis=$(echo "($1)" | tr ',' '|')
    124	local filename="$2"
    125	local fileguard suffix
    126
    127	if test "$filename"; then
    128		fileguard=$(normalize_fileguard "__UAPI_ASM_S390_$2")
    129	else
    130		case "$abis" in
    131		*64*) suffix=64 ;;
    132		*32*) suffix=32 ;;
    133		esac
    134		fileguard=$(normalize_fileguard "__UAPI_ASM_S390_SYSCALLS_$suffix")
    135	fi
    136
    137	cat <<-EoHEADER
    138	/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
    139	#ifndef ${fileguard}
    140	#define ${fileguard}
    141
    142EoHEADER
    143
    144	grep -E "^[[:digit:]]+[[:space:]]+${abis}" $SYSCALL_TBL	\
    145		|sort -k1 -n					\
    146		|create_header_defines
    147
    148	cat <<-EoFOOTER
    149
    150	#endif /* ${fileguard} */
    151EoFOOTER
    152}
    153
    154__max_syscall_nr()
    155{
    156	local abis=$(echo "($1)" | tr ',' '|')
    157
    158	grep -E "^[[:digit:]]+[[:space:]]+${abis}" $SYSCALL_TBL	 \
    159		|sed -ne 's/^\([[:digit:]]*\)[[:space:]].*/\1/p' \
    160		|sort -n					 \
    161		|tail -1
    162}
    163
    164
    165generate_syscall_nr()
    166{
    167	local abis="$1"
    168	local max_syscall_nr num_syscalls
    169
    170	max_syscall_nr=$(__max_syscall_nr "$abis")
    171	num_syscalls=$((max_syscall_nr + 1))
    172
    173	cat <<-EoHEADER
    174	/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
    175	#ifndef __ASM_S390_SYSCALLS_NR
    176	#define __ASM_S390_SYSCALLS_NR
    177
    178	#define NR_syscalls ${num_syscalls}
    179
    180	#endif /* __ASM_S390_SYSCALLS_NR */
    181EoHEADER
    182}
    183
    184
    185#
    186# Parse command line arguments
    187#
    188do_syscall_header=""
    189do_syscall_table=""
    190do_syscall_nr=""
    191output_file=""
    192abi_list="common,64"
    193filename=""
    194while getopts ":HNSXi:a:f:" arg; do
    195	case $arg in
    196	a)
    197		abi_list="$OPTARG"
    198		;;
    199	i)
    200		SYSCALL_TBL="$OPTARG"
    201		;;
    202	f)
    203		filename=${OPTARG##*/}
    204		;;
    205	H)
    206		do_syscall_header=1
    207		;;
    208	N)
    209		do_syscall_nr=1
    210		;;
    211	S)
    212		do_syscall_table=1
    213		;;
    214	X)
    215		set -x
    216		;;
    217	:)
    218		echo "Missing argument for -$OPTARG" >&2
    219		exit 1
    220	;;
    221	\?)
    222		echo "Invalid option specified" >&2
    223		exit 1
    224	;;
    225	esac
    226done
    227
    228test "$do_syscall_header" && generate_syscall_header "$abi_list" "$filename"
    229test "$do_syscall_table" && generate_syscall_table
    230test "$do_syscall_nr" && generate_syscall_nr "$abi_list"
    231
    232exit 0