[LTP] [PATCH v4 1/4] Refactor regen.sh script to generate syscalls

Petr Vorel pvorel@suse.cz
Fri Oct 25 12:03:03 CEST 2024


Hi Andrea,

nice improvement.

TL;DR typo "kj" + missing SPDX and copyright would be worth to fix before merge.

Below are other minor notes, feel free to ignore.

Reviewed-by: Petr Vorel <pvorel@suse.cz>

> Rename regen.sh into a more meaningful generate_syscalls.sh name, rename
> order into a more meaningful supported-syscalls.txt name and rewrite
> part of the regen.sh script code in order to execute it from anywhere in
> the filesystem, without need to be in its own folder. The new code is
> also more clear and concise, using native sh features which are
> simplifying the code.

> Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
> ---
>  configure.ac                                       |   2 +-
>  include/lapi/syscalls/generate_syscalls.sh         | 115 ++++++++++++++++++
>  include/lapi/syscalls/regen.sh                     | 129 ---------------------
>  .../lapi/syscalls/{order => supported-arch.txt}    |   0
>  4 files changed, 116 insertions(+), 130 deletions(-)

> diff --git a/configure.ac b/configure.ac
> index ebbf49e28..45f92477f 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -384,7 +384,7 @@ else
>      AC_SUBST([WITH_REALTIME_TESTSUITE],["no"])
>  fi

> -AC_CONFIG_COMMANDS([syscalls.h], [cd ${ac_top_srcdir}/include/lapi/syscalls; ./regen.sh])
> +AC_CONFIG_COMMANDS([syscalls.h], [cd ${ac_top_srcdir}/include/lapi/syscalls; ./generate_syscalls.sh ../syscalls.h])

As Li noted, this will need to be rebased
AC_CONFIG_COMMANDS([syscalls.h], [cd ${ac_top_srcdir}/include/lapi/syscalls; ./generate_syscalls.sh; cd - >/dev/null])

But as you don't do cd, that fix "cd - > /dev/null" can be again removed.

>  # custom functions
>  # NOTE: don't create custom functions for simple checks, put them into this file
> diff --git a/include/lapi/syscalls/generate_syscalls.sh b/include/lapi/syscalls/generate_syscalls.sh
> new file mode 100755
> index 000000000..863f52253
> --- /dev/null
> +++ b/include/lapi/syscalls/generate_syscalls.sh
> @@ -0,0 +1,115 @@
> +#!/bin/sh

The script should have SPDX + some copyright, right?
# SPDX-License-Identifier: GPL-2.0-or-later

> +#
> +# Generate the syscalls.h file, merging all architectures syscalls input file
> +# which are in the current folder and defined inside supported-arch.txt file.
> +
> +SYSCALLS_FILE="${1}"

nit: {} are not needed
SYSCALLS_FILE="$1"

I would personally use ${..} only when needed (IMHO everywhere in the script
just $... can be used (readability).

> +
> +if [ -z "${SYSCALLS_FILE}" ]; then
> +	echo "Please provide the syscalls.h directory:"
> +	echo ""
> +	echo "$0 path/of/syscalls.h"
> +	echo ""
> +	exit 1
> +fi
> +
> +SCRIPT_DIR="$(realpath $(dirname "$0"))"
> +SUPPORTED_ARCH="${SCRIPT_DIR}/supported-arch.txt"
> +
> +merge_syscalls() {
> +	echo '
> +/************************************************
> +* GENERATED FILE: DO NOT EDIT/PATCH THIS FILE  *
> +*  change your arch specific .in file instead  *
> +************************************************/
> +
> +/*
> +kj* Here we stick all the ugly *fallback* logic for linux

typo "kj", can you please remove it?

> +* system call numbers (those __NR_ thingies).
> +*
> +* Licensed under the GPLv2 or later, see the COPYING file.
> +*/
> +
> +#ifndef LAPI_SYSCALLS_H__
> +#define LAPI_SYSCALLS_H__
> +
> +#include <errno.h>
> +#include <sys/syscall.h>
> +#include <asm/unistd.h>
> +
> +#ifdef TST_TEST_H__
> +#define TST_SYSCALL_BRK__(NR, SNR) ({ \
> +tst_brk(TCONF, \
> +	"syscall(%d) " SNR " not supported on your arch", NR); \
> +})
> +#else
> +inline static void dummy_cleanup(void) {}
> +
> +#define TST_SYSCALL_BRK__(NR, SNR) ({ \
> +tst_brkm(TCONF, dummy_cleanup, \
> +	"syscall(%d) " SNR " not supported on your arch", NR); \
> +})
> +#endif
> +
> +#define tst_syscall(NR, ...) ({ \
> +intptr_t tst_ret; \
> +if (NR == __LTP__NR_INVALID_SYSCALL) { \
> +	errno = ENOSYS; \
> +	tst_ret = -1; \
> +} else { \
> +	tst_ret = syscall(NR, ##__VA_ARGS__); \
> +} \
> +if (tst_ret == -1 && errno == ENOSYS) { \
> +	TST_SYSCALL_BRK__(NR, #NR); \
> +} \
> +tst_ret; \
> +})
> +
> +#define __LTP__NR_INVALID_SYSCALL -1' >${SYSCALLS_FILE}
> +
> +	while IFS= read -r arch; do
> +		(
> +			echo
> +			case ${arch} in
> +			sparc64) echo "#if defined(__sparc__) && defined(__arch64__)" ;;
> +			sparc) echo "#if defined(__sparc__) && !defined(__arch64__)" ;;
> +			s390) echo "#if defined(__s390__) && !defined(__s390x__)" ;;
> +			mips_n32) echo "#if defined(__mips__) && defined(_ABIN32)" ;;
> +			mips_n64) echo "#if defined(__mips__) && defined(_ABI64)" ;;
> +			mips_o32) echo "#if defined(__mips__) && defined(_ABIO32) && _MIPS_SZLONG == 32" ;;
> +			*) echo "#ifdef __${arch}__" ;;
> +			esac
> +
> +			while read -r line; do
> +				set -- ${line}
> +				syscall_nr="__NR_$1"
> +				shift
> +
> +				echo "# ifndef ${syscall_nr}"
> +				echo "#  define ${syscall_nr} $*"
> +				echo "# endif"
> +			done <"${SCRIPT_DIR}/${arch}.in"
> +			echo "#endif"
> +			echo
> +		) >>${SYSCALLS_FILE}
> +	done <${SUPPORTED_ARCH}

nit: I would either don't define any function at all (have everything as
inline, thus save 1 indent) or, have this part of the code as a function.

Kind regards,
Petr

> +
> +	(
> +		echo
> +		echo "/* Common stubs */"
> +		while IFS= read -r arch; do
> +			while IFS= read -r line; do
> +				set -- ${line}
> +				syscall_nr="__NR_$1"
> +				shift
> +
> +				echo "# ifndef ${syscall_nr}"
> +				echo "#  define ${syscall_nr} __LTP__NR_INVALID_SYSCALL"
> +				echo "# endif"
> +			done <"${SCRIPT_DIR}/${arch}.in"
> +		done <${SUPPORTED_ARCH}
> +		echo "#endif"
> +	) >>${SYSCALLS_FILE}
> +}
> +
> +merge_syscalls


More information about the ltp mailing list